仅限 woocommerce POS pos meta_query 无法将显示商店页面作为类别
woocommerce POS pos only meta_query not working with display shop page as categories
我正在尝试从我的商店中移除库存为 0 或
被标记为仅 POS 但由于某种原因只有 0 库存部分有效。
这是我的代码。我做错了什么?
/****
Functions to remove items from store that have 0 stock
*****/
add_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
function custom_pre_get_posts_query( $q ) {
if ( ! $q->is_main_query() ) return;
if ( ! $q->is_post_type_archive() ) return;
if ( ! is_admin() ) {
$meta_query = $q->get( 'meta_query' );
$meta_query[] = array(
'key' => '_pos_visibility',
'value' => 'pos_only',
'compare' => '!='
);
$meta_query[] = array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '!='
);
$q->set( 'meta_query', $meta_query);
}
$q->set('orderby', array('date' => 'DESC'));
remove_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
}
谢谢
狮子座
当使用多个 meta query
时,您必须定义一个 relation
。你可以这样写:
$meta_query = array(
'relation' => 'OR',
array(
'key' => '_pos_visibility',
'value' => 'pos_only',
'compare' => '!='
),
array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '!='
)
);
如果我没记错的话,一个meta query
以一个array数组为参数,meta queries
可以包含多个数组。现在你给 meta query
两个数组作为参数。
希望这对您有所帮助。
好的,我想通了一些事情。
- 这似乎只有在使用 WooCommerce->设置->产品->显示商店页面显示未设置为产品时才会出现问题。即它被设置为类别或类别和产品。
这是我用来最终解决它的代码。
add_action( 'woocommerce_product_query', 'hss_shop_query', 10 , 2);
function hss_shop_query( $q, $that )
{
// $q->set( 'author', $vendor_id );
if ( ! is_admin() ) {
$meta_query = $q->get( 'meta_query' );
if (!is_array($meta_query)){
$meta_query = array();
}
$bHasPOSVisibility = false;
$bHasOutOfStock = false;
foreach ($meta_query as $mq) {
if ($q->key == '_pos_visibility'){
$bHasPOSVisibility = true;
} else if ($q->key == '_stock_status'){
$bHasOutOfStock = true;
}
}
if (!$bHasPOSVisibility){
$meta_query[] = array(
'key' => '_pos_visibility',
'value' => 'pos_only',
'compare' => '!='
);
}
if (!$bHasOutOfStock){
$meta_query[] = array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '!='
);
}
$q->set( 'meta_query', $meta_query);
}
//error_log("Query: ".var_export($q, true));
}
我不知道我是否需要检查它是否已经存在于查询中,但如果他们解决了这个问题,我会把它放在未来的兼容性中。
我正在尝试从我的商店中移除库存为 0 或 被标记为仅 POS 但由于某种原因只有 0 库存部分有效。
这是我的代码。我做错了什么?
/****
Functions to remove items from store that have 0 stock
*****/
add_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
function custom_pre_get_posts_query( $q ) {
if ( ! $q->is_main_query() ) return;
if ( ! $q->is_post_type_archive() ) return;
if ( ! is_admin() ) {
$meta_query = $q->get( 'meta_query' );
$meta_query[] = array(
'key' => '_pos_visibility',
'value' => 'pos_only',
'compare' => '!='
);
$meta_query[] = array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '!='
);
$q->set( 'meta_query', $meta_query);
}
$q->set('orderby', array('date' => 'DESC'));
remove_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
}
谢谢 狮子座
当使用多个 meta query
时,您必须定义一个 relation
。你可以这样写:
$meta_query = array(
'relation' => 'OR',
array(
'key' => '_pos_visibility',
'value' => 'pos_only',
'compare' => '!='
),
array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '!='
)
);
如果我没记错的话,一个meta query
以一个array数组为参数,meta queries
可以包含多个数组。现在你给 meta query
两个数组作为参数。
希望这对您有所帮助。
好的,我想通了一些事情。
- 这似乎只有在使用 WooCommerce->设置->产品->显示商店页面显示未设置为产品时才会出现问题。即它被设置为类别或类别和产品。
这是我用来最终解决它的代码。
add_action( 'woocommerce_product_query', 'hss_shop_query', 10 , 2);
function hss_shop_query( $q, $that )
{
// $q->set( 'author', $vendor_id );
if ( ! is_admin() ) {
$meta_query = $q->get( 'meta_query' );
if (!is_array($meta_query)){
$meta_query = array();
}
$bHasPOSVisibility = false;
$bHasOutOfStock = false;
foreach ($meta_query as $mq) {
if ($q->key == '_pos_visibility'){
$bHasPOSVisibility = true;
} else if ($q->key == '_stock_status'){
$bHasOutOfStock = true;
}
}
if (!$bHasPOSVisibility){
$meta_query[] = array(
'key' => '_pos_visibility',
'value' => 'pos_only',
'compare' => '!='
);
}
if (!$bHasOutOfStock){
$meta_query[] = array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '!='
);
}
$q->set( 'meta_query', $meta_query);
}
//error_log("Query: ".var_export($q, true));
}
我不知道我是否需要检查它是否已经存在于查询中,但如果他们解决了这个问题,我会把它放在未来的兼容性中。