【发布时间】: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