Déclenchement d’un hook avec l’ajout au panier des variations
-
Hello, I want to apply a rate based on the number of products in a certain category in the cart. I use the CADDY plugin to display the shopping cart on the Off Canva and Elementor.
Everything works correctly, except when adding a product variation to the cart on the product page… my function isn’t triggered.
I use ‘woocommerce_add_to_cart’
This is my function :function adjust_prices_and_handle_forfait($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
// Remplacez par l'ID du produit forfait
$forfait_product_id = 247;
// Remplacez ces slugs par les slugs des catégories que vous souhaitez ajuster
$category_slugs = array('remise-en-forme', 'arts-energetiques');
// Récupérer dynamiquement le prix du forfait
$forfait_product = wc_get_product($forfait_product_id);
$forfait_price = $forfait_product->get_price();
$remise_en_forme_slug = 'remise-en-forme';
$category_total = 0;
$forfait_in_cart = false;
$remise_en_forme_count = 0;
// Parcourir les articles du panier pour compter les produits de la catégorie 'remise-en-forme'
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
$product_id = $product->get_id();
// Vérifier si le produit est le forfait
if ($product_id == $forfait_product_id) {
$forfait_in_cart = true;
continue;
}
// Récupérer les catégories du produit parent si c'est une variation
if ($product->is_type('variation')) {
$parent_id = $product->get_parent_id();
$product_categories = wp_get_post_terms($parent_id, 'product_cat', array('fields' => 'slugs'));
wc_add_notice("Variation product detected. Product ID: $product_id, Parent ID: $parent_id, Categories: " . implode(', ', $product_categories), 'notice');
} else {
$product_categories = wp_get_post_terms($product_id, 'product_cat', array('fields' => 'slugs'));
wc_add_notice("Simple product detected. Product ID: $product_id, Categories: " . implode(', ', $product_categories), 'notice');
}
// Ajuster les prix des produits de la catégorie 'remise-en-forme'
if (in_array($remise_en_forme_slug, $product_categories)) {
$remise_en_forme_count += $cart_item['quantity'];
}
}
// Parcourir les articles du panier pour ajuster les prix et calculer le total des catégories spécifiées
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
$product_id = $product->get_id();
// Récupérer les catégories du produit parent si c'est une variation
if ($product->is_type('variation')) {
$parent_id = $product->get_parent_id();
$product_categories = wp_get_post_terms($parent_id, 'product_cat', array('fields' => 'slugs'));
} else {
$product_categories = wp_get_post_terms($product_id, 'product_cat', array('fields' => 'slugs'));
}
// Ajuster les prix des produits de la catégorie 'remise-en-forme'
if (in_array('remise-en-forme', $product_categories)) {
if ($remise_en_forme_count == 2) {
$cart_item['data']->set_price(107.5);
wc_add_notice("Setting price to 107.5 for product ID: $product_id", 'notice');
} elseif ($remise_en_forme_count >= 3) {
$cart_item['data']->set_price(98.33);
wc_add_notice("Setting price to 98.33 for product ID: $product_id", 'notice');
}
}
// Calculer le total des produits des catégories spécifiées
foreach ($category_slugs as $category_slug) {
if (in_array($category_slug, $product_categories)) {
$category_total += $product->get_price() * $cart_item['quantity'];
}
}
}
// Si le total des catégories dépasse le prix du forfait, remplacer par le forfait
if ($category_total > $forfait_price && !$forfait_in_cart) {
// Collecter les clés des articles du panier à supprimer
$keys_to_remove = array();
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
$product_id = $product->get_id();
// Récupérer les catégories du produit parent si c'est une variation
if ($product->is_type('variation')) {
$parent_id = $product->get_parent_id();
$product_categories = wp_get_post_terms($parent_id, 'product_cat', array('fields' => 'slugs'));
} else {
$product_categories = wp_get_post_terms($product_id, 'product_cat', array('fields' => 'slugs'));
}
// Ajouter la clé à supprimer si le produit est dans une des catégories spécifiées
foreach ($category_slugs as $category_slug) {
if (in_array($category_slug, $product_categories)) {
$keys_to_remove[] = $cart_item_key;
break;
}
}
}
// Supprimer les articles du panier
foreach ($keys_to_remove as $key) {
WC()->cart->remove_cart_item($key);
}
// Ajouter le forfait au panier
WC()->cart->add_to_cart($forfait_product_id);
wc_add_notice("Forfait product added to cart. Product ID: $forfait_product_id", 'notice');
}
}
add_action('woocommerce_add_to_cart', 'adjust_prices_and_handle_forfait', 10, 6);
I don’t understand… has anyone ever behaved like this?
Thank you in advanceThe page I need help with: [log in to see the link]
Viewing 2 replies - 1 through 2 (of 2 total)
Viewing 2 replies - 1 through 2 (of 2 total)
- You must be logged in to reply to this topic.