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 中将 ajax 添加到购物车事件后运行 javascript 代码
在 Woocommerce 结帐页面中将产品添加到购物车的复选框字段