it-swarm.com.de

Abrufen der Kategorien-ID für alle Produkte im Warenkorb

Was ich versuche zu tun, ist, die Kategorien für Produkte zu nehmen, die im Warenkorb sind. Überprüfen Sie dann anhand einiger Bedingungen, welche Kategorie-ID vorliegt, und zeigen Sie einen anderen Hinweis an.

Soweit habe ich das

/**
* 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";
}

Anscheinend gibt $cart_item['category_ids'] keine Kategorien zurück. $found funktioniert und zeigt Kategorie mit ID = 39 an.

Wenn ich var_dump($cart_items) sehe ich verschiedene Kategorien wie diese:

["category_ids"]=>
  array(1) {
    [0]=>
    int(39)
  }
   /// another stuff in the array

["category_ids"]=>
    array(2) {
      [0]=>
      int(32)
      [1]=>
      int(33)
    }

Im Warenkorb befinden sich Produkte aus Kategorien mit den Bezeichnungen 39, 32 und 33.

Ich habe auch versucht, WC()->cart->get_cart()->category_ids, aber diese Rückkehr NULL

UPDATE: Dies

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

Derzeit passend

Wann: Kategorie 39 + andere -> Only 39

Wann: alles andere ohne 39 -> 39 + other

Wann: Nur 39 -> Only 39

Es sollte sein

Wann: Kategorie 39 + andere -> 39 + other

Wann: alles andere ohne 39 -> all other without 39

Wann: Nur 39 -> Only 39

UPDATE

Wann: Kategorie 39 + Produkt aus anderer Kategorie (Kategorie-ID = 32, 33 usw.)

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.

Wann: Nur Kategorie 39

var_dump(count( $cat_ids )); -> int(1)
var_dump($has_cat); -> bool(true)
var_dump(cat_ids); -> array(1) { [0]=> int(39) }

Wann: Keine Kategorie 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

UPDATE 2

Bedingung 1

1) cat 30; 
2) cat 39; 
$cond = 2 (because there are products in cart from 39 + other category)

Bedingung 2

1) cat 39; 
$cond = 1 (because in cart is/are product/s only from cat 39)

Bedingung 3

1) cat 40; 
2) cat 15;
$cond = last one (because there is no product/s from cat 39 in cart)
1
Ivanov

Verwenden Sie $cart_item['data']->get_category_ids(), um die Kategorie-IDs abzurufen:

$category_ids = $cart_item['data']->get_category_ids(); // array

Der angezeigte category_ids ist kein direktes Element im Array $cart_item:

var_dump( $cart_item['category_ids'] ); // null and PHP throws a notice

Es ist ein Element in einer protected - Eigenschaft der Produktdaten ($cart_item['data']), das ein Objekt oder eine Klasseninstanz ist - z. Die Klasse ist WC_Product_Simple für Simple-Produkte.

AKTUALISIEREN

Wenn Sie alle Produktkategorie-IDs erfassen möchten, können Sie dies folgendermaßen tun:

$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 );

UPDATE # 2

Sie können dies verwenden, um zu überprüfen, ob sich ein Produkt im Warenkorb in bestimmten Kategorien befindet:

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

UPDATE 3/4/5

Dies sollte wie erwartet funktionieren:

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

Hier ist eine alternative Version des obigen Blocks 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