woocommerce POS pos only meta_query不能使用显示商店页面作为类别

问题描述:

我试图从我的商店删除商品,该商品有0个库存或 仅标记为POS,但由于某种原因只有0个库存部分有效。woocommerce POS pos only meta_query不能使用显示商店页面作为类别

这是我的代码。我究竟做错了什么?

/**** 
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'); 

} 

感谢 利奥

+0

我想知道如果我的解决方案成功了 – Kevinvhengst

好吧,我想出了一些事情。

  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)); 
} 

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

你必须使用一个以上的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两个数组作为参数。

希望这会有所帮助。

+0

关系是默认的AND。而且是我想要的。 – Leo