woocommerce POS POS仅meta_query不与显示商店页面作为类别工作



我正试图从我的商店中删除库存为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以一个数组数组作为参数,它可以包含更多的meta queries数组。现在给meta query两个数组作为参数。

好吧,我弄明白了一些事情。

  1. 这似乎只有在使用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));
}

我不知道我是否需要检查它是否已经存在于查询中,但我把它放在未来的兼容性,如果他们解决这个问题。

最新更新