Dans la boutique en ligne:
Il y a des articles affichés sur la page d'accueil et chacun des articles a un bouton "Ajouter au panier" en dessous. Lorsque ce bouton est cliqué, l'article est ajouté au panier. Si ce bouton est à nouveau cliqué, la quantité de l'article qui existe déjà dans le panier est incrémentée de 1. je crois que c'est la boucle. Jusqu'ici tout va bien.
Sur la page Produit unique, il y a un bouton "Ajouter au panier". Lorsque ce bouton est cliqué, l'article est ajouté au panier. Il existe également une zone de texte de saisie Quantité qui peut être utilisée pour modifier la quantité. C'est bien aussi.
LE PROBLÈME:
Je dois faire la différence entre le bouton "Ajouter au panier" qui a été cliqué dans la boucle (actuellement sur la page d'accueil, mais peut également être utilisé sur d'autres pages telles que la page d'archive, etc.) et le "Ajouter au panier "sur lequel vous avez cliqué sur la page Produit unique. Sur la base de cette différenciation, voici ce que je dois faire:
$cart_item_key
, incrémentez-le de 1 et envoyez-le à une fonction personnalisée qui effectuera un traitement supplémentaire et enregistrera à nouveau les détails dans le panier.$cart_item_key
, multipliez-le par 3 et envoyez-le à une fonction personnalisée qui effectuera un traitement supplémentaire et enregistrera à nouveau les détails dans le panier.CE QUE J'AI ESSAYÉ:
J'ai essayé le code suivant:
add_action('woocommerce_add_to_cart', 'custom_action_add_to_cart', 20, 6);
function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data)
{
$cart = WC()->cart->get_cart();
$product = wc_get_product($product_id);
// NEED TO RUN CUSTOM CODE HERE BASED ON THE CHECKS
if (add to cart within loop is clicked) {
// Get existing $quantity_from_cart from cart using $cart_item_key, but how????
$new_quantity = $quantity_from_cart + 1;
}
else if (add to cart on single product page is clicked) {
// Get existing $quantity_from_cart from cart using $cart_item_key, but how????
$new_quantity = $quantity_from_cart * 3;
}
// Need to send the $new_quantity along with the $cart_item_key to the custom function so that the data can be saved using $cart_item_key
my_custom_function($new_quantity, $cart_item_key);
}
function my_custom_function($new_quantity, $cart_item_key)
{
echo $new_quantity;
WC()->cart->cart_contents[$cart_item_key]['custom_quantity'] = $new_quantity;
WC()->cart->set_session();
}
Le problème avec le code ci-dessus est que si je n'ai pas le if... else if...
logique, le code est exécuté quel que soit l'emplacement du bouton "Ajouter au panier". En d'autres termes, que je clique sur le bouton "Ajouter au panier" situé dans la boucle (page d'accueil, page d'archive ou toute page utilisant la boucle) ou que je clique sur le bouton "Ajouter au panier" situé dans la page Produit unique, le code ci-dessus est exécuté en l'absence de if... else if...
logique.
Donc, je veux exécuter un code séparé lorsque le bouton "Ajouter au panier" qui se trouve dans la boucle est cliqué (quel que soit son emplacement, que ce soit la page d'accueil, les archives, etc.) et exécuter un code différent lorsque le "Ajouter au panier "qui se trouve sur la page Produit unique est cliqué. Comment puis-je y parvenir?
Attendre quelque chose comme ceci:
vous pouvez utiliser is_product()
, is_product_category()
function
function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data)
{
$cart = WC()->cart->get_cart();
$product = wc_get_product($product_id);
if ( is_product() ) {
global $product;
$id = $product->get_id();
foreach ( WC()->cart->get_cart() as $cart_item ) {
if($cart_item['product_id'] == $id ){
$quantity_from_cart = $cart_item['quantity'];
break; // stop the loop if product is found
}
}
$new_quantity = $quantity_from_cart * 3;
}
else if (is_product_category()) {
$new_quantity = $quantity_from_cart + 1;
}
my_custom_function($new_quantity, $cart_item_key);
}
Vous pouvez essayer de cette façon:
add_action('woocommerce_add_to_cart', 'custom_action_add_to_cart', 20, 6);
function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
$cart = WC()->cart->get_cart();
$product = wc_get_product($product_id);
$referer = $_SERVER['HTTP_REFERER'];
$route = parse_url( $referer );
$path = $route['path'] ?? 'home' ;
$args = array_filter( ( explode('/', $path) ) );
if (in_array( 'product', $args) ) {
// Product Page
} elseif (in_array('product-category', $args)) {
// Product Category
} else {
// Default
}
}
Mais vous devez vérifier vos paramètres. Settings > Permalinks
.
vous pouvez utiliser wp_get_referer ou check_ajax_referer () par exemple:
function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data)
{
$cart = WC()->cart->get_cart();
$product = wc_get_product($product_id);
$referer = wp_get_referer();
// HOMEPAGE
if (strpos($referer ,'http://yourwebsite.com/') !== false) {
$new_quantity = $quantity_from_cart + 1;
}
//from some product page like http://yourwebsite.com/product/my-product-page
else if (strpos($referer ,'http://yourwebsite.com/product/') !== false) {
$new_quantity = $quantity_from_cart * 3;
}
// Need to send the $new_quantity along with the $cart_item_key to the custom function so that the data can be saved using $cart_item_key
my_custom_function($new_quantity, $cart_item_key);
}
Veuillez vous référer: Fonctions liées à Wordpress Nonces
Il y a quelques solutions auxquelles je pourrais penser. Mais en voici une:
add_action( 'woocommerce_after_add_to_cart_button', 'rmg_woocommerce_after_add_to_cart_button' );
function rmg_woocommerce_after_add_to_cart_button() {
$button_location = 0;
// if (is_home() || is_front_page()) {
// // we're at the home page
// $button_location = 1;
// }
if (is_product()) {
// where at product page
$button_location = 2;
} else {
// pages other than product page
$button_location = 1;
}
echo '<input type="hidden" name="button-location" value="'. $button_location .'" />';
}
Nous pourrions ajouter une entrée cachée à l'intérieur du formulaire, que le code ci-dessus le fait.
Puis pourrait vérifier sa valeur comme:
$button_location = $_REQUEST['button-location'];
if ($button_location && $button_location === 2) {
// add to cart button clicked at or came from product page..
$new_quantity = $quantity_from_cart + 1;
}
Veuillez noter que ce n'est qu'une idée et non une solution complète ... Vous devez prendre soin du bouton ajax.