【问题标题】:Allow some OutOfStock products to be visible允许显示一些 OutOfStock 产品
【发布时间】:2019-10-09 11:42:35
【问题描述】:

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

  • 如果选中产品中的“_show_zero_stock”复选框,则存在 _show_zero_stock 且 value = '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 (AND) 的产品 显示库存 = 0 且已检查 _show_zero_stock 的产品

哪些部分应该受到影响: 类别、搜索和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) );
}

【问题讨论】:

  • 你使用什么钩子来调用 hide_out_of_stock_products 函数,它在所有三种情况下(类别、搜索和 ajax 搜索)都有效,即使它很慢?
  • 在尝试连接和 where 钩子时,如果在“使用位置”条件中使用带有括号的 is_search(),它的工作方式会有所不同吗?我相信它需要更多的条件检查,但也许你可以确认它有点工作?
  • @JasonB 我使用了 add_action('woocommerce_product_query', 'hide_out_of_stock_products');
  • @JasobB 我单独尝试了 is_search() , $q->is_search() 和 $q->is_search 如果我忽略其他页面是 404

标签: php wordpress woocommerce


【解决方案1】:
 $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

【讨论】:

  • 谢谢,但我还需要所有库存超过 1 个的产品,如果库存为零,我需要检查是否检查了 _show_zero_stock(值为 yes)
猜你喜欢
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 2019-10-31
  • 2022-08-22
  • 2019-05-01
  • 2021-05-05
相关资源
最近更新 更多