2016-10-31 6 views
0

Я пытаюсь удалить элементы из своего магазина, у которых есть 0 или , отмечены как POS, но по какой-то причине работает только 0 штук.woocommerce POS pos только 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'); 

} 

благодарит Leo

+0

Мне было интересно, если мое решение получило – Kevinvhengst

ответ

0

OK Я понял несколько вещей.

  1. Это похоже на проблему при использовании WooCommerce-> Settings-> Products-> Display Display Page Display не отображается для продуктов. то есть он настроен либо на категории, либо на категории и продукты.

Вот код, который я использовал для его окончательного решения.

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

Вы должны определить relation при использовании более чем одного meta query. Вы могли бы написать что-то вроде:

$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

отношение is И по умолчанию. И это то, что я хочу. – Leo