Woocommerce:检测单击“添加到购物车”按钮的位置并运行不同的代码

Posted

技术标签:

【中文标题】Woocommerce:检测单击“添加到购物车”按钮的位置并运行不同的代码【英文标题】:Woocommerce: Detect where Add to Cart button was clicked and run different code 【发布时间】:2020-05-02 02:45:41 【问题描述】:

在电子商务商店中:

主页上显示了一些项目,每个项目下方都有一个“添加到购物车”按钮。单击此按钮时,该项目将添加到购物车。如果再次单击此按钮,购物车中已存在的商品的数量会增加 1。我相信这是循环。到目前为止,一切顺利。

在单个产品页面上,有一个“添加到购物车”按钮。单击此按钮时,该项目将被添加到购物车。还有一个数量输入文本框,可用于更改数量。这个也不错。

问题:

我需要区分在循环中单击的“添加到购物车”按钮(目前在主页上,但也可以在其他页面上使用,例如存档页面等)与在单个产品页面上单击的“添加到购物车”按钮。基于这种差异化,这是我需要做的:

如果单击循环中出现的“添加到购物车”按钮,请使用 $cart_item_key 获取购物车中已存在的此商品的 数量,将其加 1 并发送到一个自定义函数,该函数将执行额外处理并将详细信息再次保存到购物车。 如果单击单品页面中出现的“加入购物车”按钮,请使用$cart_item_key 获取购物车中已存在的该商品的数量,然后将其乘以 3,然后将此发送到自定义函数,该函数将执行额外处理并将详细信息再次保存到购物车。 在上述两种情况下,数量都会根据不同的逻辑进行更改,并且需要将此数量发送到自定义函数调用。

我尝试了什么:

我尝试了以下代码:

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

上述代码的问题在于,如果我没有if... else if... 逻辑,那么无论“添加到购物车”按钮位于何处,都会执行代码。换句话说,无论我单击位于循环(主页、存档页面或任何使用循环的页面)中的“添加到购物车”按钮,还是单击位于单个产品页面中的“添加到购物车”按钮,上面的代码在没有if... else if... 逻辑的情况下执行。

所以,我想在单击位于循环中的“添加到购物车”按钮时运行单独的代码(无论其位置如何,无论是主页、档案等),并在单击位于单个产品页面上的“添加到购物车”按钮。我怎样才能做到这一点?

期待这样的事情:

如果单击出现在循环内的按钮 -> 执行此操作。 如果单击单个产品页面中出现的按钮 -> 执行此操作。

【问题讨论】:

【参考方案1】:

例如,您可以使用wp_get_referer 或check_ajax_referer():

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

请参考:Wordpress Nonces related functions

【讨论】:

对主页、产品页面等进行手动检查是多余的。我试图不对页面名称进行硬编码,而是让 WP 在内部处理它。【参考方案2】:

你可以试试这个方法:

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
    

但您需要检查您的设置。 Settings > Permalinks.

【讨论】:

对主页、产品页面等进行手动检查是多余的。我试图不对页面名称进行硬编码,而是让 WP 在内部处理它。【参考方案3】:

你可以使用is_product(),is_product_category()函数

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

【讨论】:

我厌倦了你的解决方案。当我在单一产品页面上并将产品添加到购物车时,我希望代码 $new_quantity = $quantity_from_cart * 3; 可以工作。但事实并非如此。它只是增加购物车中当前现有的数量,但 NOT 将数量乘以 3。如何解决这个问题? 现在试试,它会将数量乘以 3 我刚刚尝试了您修改后的解决方案。但不知何故,结果与我之前的评论相同。似乎出于某种奇怪的原因,代码if ( is_product() ) NOT 正在执行。我似乎找不到原因!它是一个 AJAX 添加到购物车按钮有关系吗??【参考方案4】:

我能想到几个解决方案。但这里有一个:

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 .'" />';

我们可以在表单中添加一个隐藏的输入,上面的代码就是这样做的。 然后可以检查它的值:

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

请注意,这只是一个想法,并不是一个完整的解决方案……您需要注意 ajax 按钮。

【讨论】:

似乎出于某种奇怪的原因,代码 if ( is_product() ) NOT 正在执行。我似乎找不到原因!它是一个 AJAX 添加到购物车按钮有关系吗?? 使用ajax,需要在请求中传递$button_location的值..

以上是关于Woocommerce:检测单击“添加到购物车”按钮的位置并运行不同的代码的主要内容,如果未能解决你的问题,请参考以下文章

错误:WooCommerce 避免为非登录用户添加到购物车

在 Woocommerce 中将 ajax 添加到购物车事件后运行 javascript 代码

在 Woocommerce 结帐页面中将产品添加到购物车的复选框字段

WooCommerce 按用户角色删除购物车

在 WooCommerce 商店页面上向 Ajax 添加数量字段添加到购物车按钮

Woocommerce - 未登录用户的购物车为空