php - 允许显示一些 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(儿童)版本将升级到最新版本。
- 如果选中产品中的 '_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) 显示已检查 _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) );
}
解决方案
$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
推荐阅读
- c# - 如何让 winappdriver 找到应用程序文件?
- javascript - 无法让我的主进程和渲染器进程在电子中进行通信
- javascript - 如何将多个对象添加到一个 JSON 文件中,然后列出该文件中的所有内容?[JSON、JavaScript]
- firebase - Flutter web firebase/firestore错误运行
- python - 如何从 1d 系列数据中获取 2d DataFrame
- python - 如何解决该错误“:TypeError:只能将str(不是“字节”)连接到str”
- php - 读取txt文件并使用php挑选部分并将每个部分保存到数据库中
- javascript - 检查出生日期
- statistics - 在以下问题中,哪个模型应该使用 VAR 或 VECM?
- python - 如果要求没有上传二进制文件,如何安装 Python 依赖项