私がやろうとしているのは、カートに入っている商品のカテゴリーを選ぶことです。次に、いくつかの条件でカテゴリIDが何であるかを確認し、異なる通知を表示します。
これまでのところ私はこれを持っています
/**
* Cart collaterals hook.
*
* @hooked woocommerce_cross_sell_display
* @hooked woocommerce_cart_totals - 10
*/
$categories = array( 39 );
foreach ( WC()->cart->get_cart() as $cart_item ) {
if ( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
$found = true; // Set to true
break; // Stop the loop
}
}
if( $found ) {
echo 'Category with ID = 39';
}
else if ($found != $cart_item['category_ids']) {
echo "Category with ID = 39 and other ID('s)";
}
else {
"Category with ID != 39";
}
$cart_item['category_ids']
はカテゴリを返さないようです。 $found
は、ID = 39のカテゴリを表示しています。
私がvar_dump($cart_items)
するとき、私はこのような異なるカテゴリーを見ます:
["category_ids"]=>
array(1) {
[0]=>
int(39)
}
/// another stuff in the array
["category_ids"]=>
array(2) {
[0]=>
int(32)
[1]=>
int(33)
}
そのため、カートには39
、32
、33
というIDのカテゴリの商品があります。
私はWC()->cart->get_cart()->category_ids
も試しましたが、これはNULL
を返します
アップデート:これ
$cat_ids = array();
foreach ( wc()->cart->get_cart() as $cart_item_key => $cart_item ) {
$cat_ids = array_merge(
$cat_ids, $cart_item['data']->get_category_ids()
);
}
$cat_id = 39;
if ( in_array( $cat_id, $cat_ids ) ) {
echo 'Only 39 ';
} elseif ( ! empty( $cat_ids ) ) {
echo '39 + other';
} else {
echo ' all other without 39';
}
現在マッチング中
いつの場合:カテゴリ39 +その他 - > Only 39
とき:39 - > 39 + other
を除いたその他すべて
いつ:39 - > Only 39
のみ
そのはず
いつの場合:カテゴリ39 +その他 - > 39 + other
とき:39 - > all other without 39
を除いたその他すべて
いつ:39 - > Only 39
のみ
_アップデート_
カテゴリ39 +他のカテゴリの商品(カテゴリID = 32、33など)
var_dump(count( $cat_ids )); -> int(1)
var_dump($has_cat); -> bool(true)
var_dump(cat_ids); -> array(1) { [0]=> int(39) } <---- there are 3 products in the cart 2 of them are from other categories.
カテゴリー39のみ
var_dump(count( $cat_ids )); -> int(1)
var_dump($has_cat); -> bool(true)
var_dump(cat_ids); -> array(1) { [0]=> int(39) }
いつ:いいえカテゴリー39
var_dump(count( $cat_ids )); -> int(2)
var_dump($has_cat); -> bool(false)
var_dump(cat_ids); -> array(2) { [0]=> int(32) [1]=> int(33) } <--- product is added in 2 categories
アップデート2
条件1
1) cat 30;
2) cat 39;
$cond = 2 (because there are products in cart from 39 + other category)
条件2
1) cat 39;
$cond = 1 (because in cart is/are product/s only from cat 39)
条件3
1) cat 40;
2) cat 15;
$cond = last one (because there is no product/s from cat 39 in cart)
カテゴリIDを取得するには$cart_item['data']->get_category_ids()
を使います。
$category_ids = $cart_item['data']->get_category_ids(); // array
表示されるcategory_ids
は、$cart_item
配列内の直接の項目ではありません。
var_dump( $cart_item['category_ids'] ); // null and PHP throws a notice
これは、オブジェクトまたはクラスのインスタンスである商品データ($cart_item['data']
)の protected プロパティ内の項目です。 Simple製品のクラスはWC_Product_Simple
です。
すべての商品カテゴリIDを収集したい場合は、次のようにします。
$cat_ids = array();
foreach ( wc()->cart->get_cart() as $cart_item_key => $cart_item ) {
$cat_ids = array_merge(
$cat_ids, $cart_item['data']->get_category_ids()
);
}
var_dump( $cat_ids );
これを使用して、カート内の商品が特定のカテゴリに属しているかどうかを確認できます。
$cat_ids = array( 39 );
foreach ( wc()->cart->get_cart() as $cart_item_key => $cart_item ) {
if ( has_term( $cat_ids, 'product_cat', $cart_item['data'] ) ) {
echo 'Has category 39<br>';
} else {
echo 'No category 39<br>';
}
}
これは期待通りに動作するはずです。
// Collect the category IDs.
$cat_ids = array();
foreach ( wc()->cart->get_cart() as $cart_item_key => $cart_item ) {
$cat_ids = array_merge(
$cat_ids, $cart_item['data']->get_category_ids()
);
}
// And here we check the IDs.
$cat_id = 39;
$count = count( $cat_ids );
if ( 1 === $count && in_array( $cat_id, $cat_ids ) ) {
echo 'Only in category 39';
} elseif ( $count && in_array( $cat_id, $cat_ids ) ) {
echo 'In category 39 and other categories';
} else {
echo 'No category 39';
}
上記のif
ブロックの代替バージョンです。
if ( $count && in_array( $cat_id, $cat_ids ) ) {
// Only one category.
if ( $count < 2 ) {
echo 'Only in category 39';
// Multiple categories.
} else {
echo 'In category 39 and other categories';
}
} else {
echo 'No category 39';
}