web-dev-qa-db-ja.com

カート内の全商品のカテゴリIDを取得する

私がやろうとしているのは、カートに入っている商品のカテゴリーを選ぶことです。次に、いくつかの条件でカテゴリ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)
    }

そのため、カートには393233という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)
1
Ivanov

カテゴリ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 );

アップデート2

これを使用して、カート内の商品が特定のカテゴリに属しているかどうかを確認できます。

$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>';
    }
}

アップデート#3 /#4 /#5

これは期待通りに動作するはずです。

// 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';
}
1
Sally CJ