• Resolved Zitune

    (@zitune)


    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 advance


    The page I need help with: [log in to see the link]

Viewing 2 replies - 1 through 2 (of 2 total)
  • Thread Starter Zitune

    (@zitune)

    Up
    It’s actually the “Add to cart” button on the product page that doesn’t trigger my function… it’s the same behavior, nothing to do with variations
    My new code :

    function adjust_prices_and_handle_forfait($cart) {
    // 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 ($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'));
    } 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_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 ($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);
    } elseif ($remise_en_forme_count >= 3) {
    $cart_item['data']->set_price(98.33);
    }
    }

    // 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 ($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) {
    $cart->remove_cart_item($key);
    }

    // Ajouter le forfait au panier
    $cart->add_to_cart($forfait_product_id);
    }
    }
    add_action('woocommerce_before_calculate_totals', 'adjust_prices_and_handle_forfait');

    Hey there, @zitune! Thanks for contacting us.

    While we can’t provide support for code customization as per our support policy, we do our best to offer advice and direct you to appropriate resources.

    You can visit the WooCommerce Facebook group or the #developers channel of the WooCommerce Community Slack. We’re lucky to have a great community of open-source developers for WooCommerce, and many of our developers hang out there too.

    I’m going to leave it open for a bit to see if anyone is able to chime in and help you out further.

    Please let us know if there’s anything else we can do to help or if you have any questions.

    Have a wonderful day!

Viewing 2 replies - 1 through 2 (of 2 total)
  • You must be logged in to reply to this topic.