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


10

在电子商务商店中:

  • 主页上显示了一些项目,每个项目下方都有一个“添加到购物车”按钮。单击此按钮后,该项目即被添加到购物车。如果再次单击此按钮,则购物车中已经存在的物料数量将增加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...逻辑的情况下执行。

因此,我想在单击位于循环中的“添加到购物车”按钮时运行单独的代码(无论其位置如何,无论是主页,存档等),并且在“添加到购物车”按钮时运行不同的代码单击位于“单个产品”页面上。我该如何实现?

期望这样的事情:

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

Answers:


1

您可以使用wp_get_referercheck_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相关功能


手动检查“主页”,“产品”页面等内容是过大的。我试图不对页面名称进行硬编码,而是让WP在内部对其进行处理。
Devner

1

您可以这样尝试:

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在内部对其进行处理。
Devner

1

您可以使用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;可以正常工作。但事实并非如此。它只是增加购物车中当前的现有数量,而不是将数量乘以3。如何解决这个问题?
Devner

立即尝试,它将把数量乘以3
RBT

我刚刚尝试了您修改后的解决方案。但是不知何故,结果与我之前的评论相同。这似乎是,对于一些奇怪的原因,该代码if ( is_product() )被执行。我似乎找不到原因!它是一个“ AJAX添加到购物车”按钮有关系吗?
Devner

0

我可以想到几种解决方案。但这是一个:

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())没有被执行。我似乎找不到原因!它是一个“ AJAX添加到购物车”按钮有关系吗?
Devner

使用Ajax,你需要传递的值$button_location在请求..
Reigel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.