允许一些缺货产品可见

时间:2019-05-22 23:05:43

标签: php wordpress woocommerce

我有这个问题/客户的要求: 显示所有库存> 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,主题:Flastome(儿童) 版本将升级到最新版本。

  • 如果选中了产品中的“ _show_zero_stock”复选框,则_show_zero_stock存在且值=“ yes”
  • 通过post_id加入postmeta
  • 添加查询以按条件过滤产品
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(与)的产品 显示库存= 0且已检查_show_zero_stock

的产品

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

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

我用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) );
}

1 个答案:

答案 0 :(得分:0)

 $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