首页 > 解决方案 > 允许显示一些 OutOfStock 产品

问题描述

我有这个问题/来自客户的需求:显示所有库存 > 0 的产品还显示所有库存 = 0 的产品,并且自定义复选框“_show_zero_stock”设置为 true

但是在functions.php 中提供的代码并没有像描述的那样工作。

我认为问题仅在“在哪里使用”条件下'!is_admin() && $q->is_main_query() && $q->is_search' 但我需要你的帮助。我尝试了 meta_query,但是在 meta_query 20s 页面加载之后,带有 ~1s 响应的 wp。

Wordpress 5.2.1、Woocommerce 3.5.5、主题:Flasome(儿童)版本将升级到最新版本。

function custom_posts_join($join, $q){
 if( ! is_admin() && $q->is_main_query() && $q->is_search) {// No global $wp_query here
    global $wpdb;
    $join .= " LEFT JOIN $wpdb->postmeta as meta_1 ON $wpdb->posts.ID = meta_1.post_id";
 }
 return $join;
}

function filter_function_name_2925( $where, $q ){ // No global $wp_query here
    if( ! is_admin() && $q->is_main_query() && $q->is_search) {
        $where .= " AND ((meta_1.meta_key = '_stock' AND meta_1.meta_value > 0) OR (meta_1.meta_key = '_hide_zero_stock' AND meta_1.meta_value = 'yes' ))"; 
    }
    return $where;
}
add_filter( 'posts_join' , 'custom_posts_join', 10, 2);
add_filter( 'posts_where', 'filter_function_name_2925', 10, 2 );

预期结果 - 显示库存 > 0 的产品 (AND) 显示已检查 _show_zero_stock 的库存 = 0 的产品

哪些部分应该受到影响:类别、搜索和ajax搜索[前端]

哪些部分不应受到影响:产品页面 - 无论 _show_zero_stock 值如何,产品 URL 都必须可访问且可见

我用 meta_query 试过这个。可怕的性能影响:

add_action( 'woocommerce_product_query', 'show_out_of_stock_products' );
function show_out_of_stock_products( $q ) {
$meta_query = $q->get( 'meta_query' );
    $meta_query[] = array(
    'cache_results' => false,
        'relation' => 'OR',
                array(
                    'key' => '_stock',
                    'compare' => '>',
                    'value' => '0',
                    'type'    => 'numeric',
                ),
                array(
                    'relation' => 'AND',
                    array(
                        'key' => '_stock',
                        'compare' => '=',
                        'value' => '0',
                        'type'  => 'numeric',
                    ),
                    array(
                            'key' => '_show_zero_stock',
                            'compare'   => 'EXISTS',
                        )
                )
    );
    $q->set( 'meta_query', array($meta_query) );
}

标签: phpwordpresswoocommerce

解决方案


 $args = array(
      'post_type' => 'product',
      'posts_per_page' => -1,
      'post_status' => 'publish',
      'meta_query' => array(
         array(
            'key' => '_stock',
            'value' => 1,
            'compare' => '<'
         )
      ),
      'fields' => 'ids',
   );`enter code here`
    $product_ids = get_posts( $args ); 
   $product_ids = implode( ",", $product_ids );
This will return all out of stock products

推荐阅读