2017-06-08 9 views
1

バリエーションのいずれかが在庫切れの場合、私はループからウーコム商品を隠そうとしています。私はこれまでWooCommerceはidからループから商品を削除します

1試してみましたが何

:ユーザー「地域」 2にログインし、現在の取得:領域がユーザ領域に対してチェックしているすべての製品バリエーションのリストを取得します。 3:小切手を実行し、一致する場合は製品を非表示にする 4:ループから製品を除外する

扇動は大歓迎です。

function tm_remove_product_stock_region($query) { 

    $product_variable = new WC_Product_Variable(); 
    $product_variations = $product_variable->get_available_variations(); 

/** Get users region. */ 
    $user_region = tm_get_user_region(); 

    $post__in = array(); 

    foreach ($product_variations as $variation) { 

     /** Get products regions. */ 
     $product_region = $variation['attributes']['attribute_pa_regions']; 

     if ($user_region === $product_region && !$variation->is_in_stock()) { 


      $post__in[] = $variation['product_id']; 

      add_filter('woocommerce_product_is_visible', function($is_visible, $id) { 
       $is_visible = false; 
       return $is_visible; 
      }, 10,2); 


     } else if ($user_region === $product_region && $variation->is_in_stock()) { 

      $post__in[] = $variation['product_id']; 


      add_filter('woocommerce_product_is_visible', function($is_visible, $id) { 
       $is_visible = true; 
       return $is_visible; 
      }, 10,2); 


     } 

    } 

    if(is_array($post__in) && $post__in != null){ 
     $query->set('post__in', $post__in); 
    } 

    return $query; 

} 

add_action('pre_get_posts', 'tm_remove_product_stock_region', 10, 2); 

アップデート2:

私は上記の、それが動作するようになったを更新、しかしwoocommerce_product_is_visibleフィルタは、カテゴリアーカイブページ上で動作、検索ページでフィルタを取得またはWP_Queryがカスタムで使用されたときに注目します本当に残念です。私は両方の機能で$product_variableは、結果の異なるセットを返すことに気づいについていじるのより多くの時間後

:またwoocommerceためis_visible $文句を言わないpre_get_posts

Function tm_remove_product_stock_region($is_visible, $id) { 

    $product = wc_get_product(get_the_ID()); 

    $product_variable = new WC_Product_Variable(get_the_ID()); 
    $product_variations = $product_variable->get_available_variations(); 

    /** Get users region. */ 
    $user_region = tm_get_user_region(); 

    foreach ($product_variations as $variation) { 

     /** Get products regions. */ 
     $product_region = $variation['attributes']['attribute_pa_regions']; 

     if (!$product->is_in_stock() && $user_region === $product_region) { 

      $is_visible = false; 
      return $is_visible; 

     }  

     else if ($product->is_in_stock() && $user_region === $product_region) { 

      $is_visible = true; 
      return $is_visible; 

     } 
    } 

} 

add_filter('woocommerce_product_is_visible', 'tm_remove_product_stock_region', 10,2); 

アップデート3で動作する理由は、彼らのですつまり、 "woocommerce_product_is_visible"ではプロダクトの親IDが返されますが、 "pre_get_posts"はバリエーションIDです。

私が望んでいた結果が得られず、実際に動作する必要があるpre_get_postsが失敗しましたが、まだ解決していません。あなたはループの前にmeta_queryを設定する必要が

+0

実際には、「すべてのバリエーションが在庫切れであれば、ループからウォーコマース商品を隠そうとしています。」 – Adder

+0

私の主な問題は、店舗はあなたが特定の量の在庫を持っている親製品、つまりその製品の子供を開発している店のイム。それが意味をなさない場合は株式を持っているバリエーションは、ifステートメントの理由をダストします。 –

+0

あなたがコメントアウトしたコードは、現在のコードよりも役に立つと思われます。 – Adder

答えて

0

もし誰かが同様の必要性を持っていれば、答えは以下の通りです。

add_action('pre_get_posts','remove_products'); 

function remove_products($query) { 
    if(!is_admin() && $query->is_main_query()){ 

     $user_region = tm_get_user_region(); 
     $current_category = get_queried_object(); 

     $args = array(
     'post_type'    => 'product', 
     'post_status'    => 'publish', 
     'posts_per_page'   => 36, 
     'orderBy'     => 'title', 
     'tax_query'    => array(
      array(
       'taxonomy'   => 'product_cat', 
       'field'    => 'term_id', 
       'terms'    => $current_category->term_id, 
      ) 
     ) 
    ); 

     $loop = get_posts($args); 
     $post__in = array(); 

     foreach ($loop as $post) { 

     //Product object 
     $product = wc_get_product($post->ID); 

     //Get product info i.e variations > meta keys 
     $product_variations = $product->get_children(); 

     foreach ($product_variations as $variation) { 

      // Store only the meta keys needed 
      $product_region = get_post_meta($variation, 'attribute_pa_regions'); // 'region name' 
      $stock_status = get_post_meta($variation, '_stock_status'); // 'outofstock' 

      // Regional and stock check 
      if(in_array($user_region, $product_region) && in_array('outofstock', $stock_status)) { // === wont work here 
       $post__in[] = $post->ID; 
      } 
     } 

     } 

     //Exclude the product 
     if(is_array($post__in) && $post__in != null) { 
     $query->set('post__not_in', $post__in); 
     } 

    } 

} 

$product->get_available_variations()が大幅に必要なデータのみを取得する代わりにget_post_meta(the_id, 'meta_key_name');を使用するように、最善をあなたのページのロードが遅くなり、多くの情報を返すことに注意してください。

0

function tm_remove_product_stock_region($query) { 
    $query->set('meta_query', array(array(
     'key'  => '_stock_status', 
     'value'  => 'outofstock', 
     'compare' => 'NOT IN' 
    ))); 
return $query; 

    } 
add_action('pre_get_posts', 'tm_remove_product_stock_region'); 
0

たぶん、このようなものは、あなたが探しているものです。私はそれが右の見る作業を取得するために管理し、試行錯誤の後

$has_items_in_stock = false; 
foreach ($product_variations as $variation) { 

    /** Get products regions. */ 
    $product_region = $variation['attributes']['attribute_pa_regions']; 

    if ($user_region === $product_region && $variation['is_in_stock']) { 
     $has_items_in_stock = true; 
     break; 
    } 
} 

if($has_items_in_stock) { 
    //show product 
    //show variations 
    //.. 
} 
関連する問題