バリエーションのいずれかが在庫切れの場合、私はループからウーコム商品を隠そうとしています。私はこれまで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を設定する必要が
実際には、「すべてのバリエーションが在庫切れであれば、ループからウォーコマース商品を隠そうとしています。」 – Adder
私の主な問題は、店舗はあなたが特定の量の在庫を持っている親製品、つまりその製品の子供を開発している店のイム。それが意味をなさない場合は株式を持っているバリエーションは、ifステートメントの理由をダストします。 –
あなたがコメントアウトしたコードは、現在のコードよりも役に立つと思われます。 – Adder