Woocommerce 将共享购物车中的商品添加到购物车 url?
Woocomerce adding items to cart from a share cart url?
我想我在这里需要帮助,我不太确定我是否需要手动设置会话,或者它会在将项目添加到 woocommerce 购物车时自动设置,让我们考虑以下几点:
if(is_array($args_n)){
foreach($args_n as $item){
$is_product_in_cart = false;
if(sizeof( WC()->instance()->cart->get_cart() > 0)){
foreach(WC()->instance()->cart->get_cart() as $cart_items_key => $cart_items_values){
$products = $cart_items_values['data'];
if($products->id == $item){
$is_product_in_cart = true;
}
}
if(!$is_product_in_cart){
WC()->cart->add_to_cart( $item );
}
}else{
WC()->cart->add_to_cart( $item );
}
}
}
所以,当我执行以下操作时:
var_dump(sizeof(WC()->instance()->cart->get_cart()));
在调用开始时我得到 0
在代码执行后我得到正确的值 == 3
(对于这个例子);
传递的参数只是一个简单的数组,其中包含产品 ID 的 fx:
$args_n = array(
2080,
720,
835,
);
这个数组是用解析 url 和内爆创建的,没有来自另一个世界的东西
问题是,即使一切看起来都不错,因为当我转到购物车页面时我从购物车尺寸中得到了正确的数字,但它仍然是空的!。有什么想法或提示吗?
干杯
编辑
调试信息:
为正在传递的 ID 添加一个简单的生态:
echo "---> {$item} \n";
在被重定向之前,我运行这个:
$cart_items = $woocommerce->cart->get_cart();
foreach($cart_items as $i => $x){
$p = $x['data']->post;
echo " in cart ---> {$p->ID} \n";
}
结果是:
int(0) ---> 2080 ---> 720 ---> 835 int(3) in cart ---> 2080 in cart ---> 720 in cart ---> 835
所有商品都在购物车里了!但是当重定向完成时仍然不存在,或者只是导航离开该着陆页。
编辑:
检查 woocommerce 时 WC()->session
我得到的结果是会话处于活动状态,商品已添加到购物车..
object(WC_Session_Handler)#173 (7) {
["_cookie":"WC_Session_Handler":private]=>
string(55) "wp_woocommerce_session_77f1e25389fdbfe3480cc6593d3838b0"
["_session_expiring":"WC_Session_Handler":private]=>
int(1440319051)
["_session_expiration":"WC_Session_Handler":private]=>
int(1440322651)
["_has_cookie":"WC_Session_Handler":private]=>
bool(true)
["_customer_id":protected]=>
string(32) "57cd99b8855e872adad62440a6c2fbe0"
["_data":protected]=>
array(20) {
["cart"]=>
string(904) "a:3:{s:32:"54ff9e9e3a2ec0300d4ce11261f5169f";a:9:{s:10:"product_id";i:2080;s:12:"variation_id";s:0:"";s:9:"variation";a:0:{}s:8:"quantity";i:1;s:10:"line_total";d:1;s:8:"line_tax";i:0;s:13:"line_subtotal";i:1;s:17:"line_subtotal_tax";i:0;s:13:"line_tax_data";a:2:{s:5:"total";a:0:{}s:8:"subtotal";a:0:{}}}s:32:"5f2c22cb4a5380af7ca75622a6426917";a:9:{s:10:"product_id";i:720;s:12:"variation_id";s:0:"";s:9:"variation";a:0:{}s:8:"quantity";i:1;s:10:"line_total";d:1;s:8:"line_tax";i:0;s:13:"line_subtotal";i:1;s:17:"line_subtotal_tax";i:0;s:13:"line_tax_data";a:2:{s:5:"total";a:0:{}s:8:"subtotal";a:0:{}}}s:32:"4d5b995358e7798bc7e9d9db83c612a5";a:9:{s:10:"product_id";i:835;s:12:"variation_id";s:0:"";s:9:"variation";a:0:{}s:8:"quantity";i:1;s:10:"line_total";d:1;s:8:"line_tax";i:0;s:13:"line_subtotal";i:1;s:17:"line_subtotal_tax";i:0;s:13:"line_tax_data";a:2:{s:5:"total";a:0:{}s:8:"subtotal";a:0:{}}}}"
["applied_coupons"]=>
string(6) "a:0:{}"
["coupon_discount_amounts"]=>
string(6) "a:0:{}"
["coupon_discount_tax_amounts"]=>
string(6) "a:0:{}"
["removed_cart_contents"]=>
string(6) "a:0:{}"
["cart_contents_total"]=>
float(3)
["cart_contents_weight"]=>
int(0)
["cart_contents_count"]=>
int(3)
["total"]=>
int(0)
["subtotal"]=>
int(3)
["subtotal_ex_tax"]=>
int(3)
["tax_total"]=>
int(0)
["taxes"]=>
string(6) "a:0:{}"
["shipping_taxes"]=>
string(6) "a:0:{}"
["discount_cart"]=>
int(0)
["discount_cart_tax"]=>
int(0)
["shipping_total"]=>
int(0)
["shipping_tax_total"]=>
int(0)
["fee_total"]=>
int(0)
["fees"]=>
string(6) "a:0:{}"
}
["_dirty":protected]=>
bool(true)
}
编辑
如果购物车中已经有商品,并且触发了该功能,它将按预期工作,所以我猜是会话问题
根据 Mike Jolley 的一篇文章here:
" 缓存问题
由插件和 WPEngine 等主机添加的页面缓存可能会中断会话。好吧,不中断,只是显示一个缓存的页面,结果不反映当前用户的购物车。
当存在购物车会话时,一些数据需要取消缓存,一些页面(如购物车、结帐和帐户)也是如此。”-Mike Jolley
我认为这很有可能出了问题,因为在 WC 平台中 WP_SESSION 已经放弃了开始会话的正常方式。尝试致电您的托管服务提供商,看看您的服务器上是否启用了清漆缓存,看看他们是否可以提供解决方法。
我启动了一个新的 WooCommerce 并尝试了您的代码 - 我无法重现该问题。我认为这可能是加载顺序问题。 WooCommerce 为每个访问者创建一个会话和一个购物车,所以我认为购物车不是 "primed" 与现有会话或类似的东西无关。我经常发现您需要找到正确的挂钩,尤其是在处理 WooCommerce 购物车时。 WooCommerce 实际上将购物车信息保存在三个位置:购物车对象实例、用户会话和数据库中的持久购物车。让任何更新与 WooCommerce 在它们之间进行的舞蹈协调工作可能很棘手。我发现在整个页面加载之前将项目添加到购物车的最可靠时间是在 'template_redirect' 挂钩中。在所有会话数据和查询具有 运行 之后,但在构建页面之前。它非常适合在您想要向用户显示它们之前对其进行操作。
我是这样实现你的代码的,它适用于空车:
add_action('template_redirect','custom_add_to_cart', 1000);
function custom_add_to_cart() {
$args_n = array(10, 11); // I just made an array with dummy product ids
if(is_array($args_n)){
foreach($args_n as $item){
$is_product_in_cart = false;
if(sizeof( WC()->instance()->cart->get_cart() > 0)){
foreach(WC()->instance()->cart->get_cart() as $cart_items_key => $cart_items_values){
$products = $cart_items_values['data'];
if($products->id == $item){
$is_product_in_cart = true;
}
}
if(!$is_product_in_cart){
WC()->cart->add_to_cart( $item );
}
}else{
WC()->cart->add_to_cart( $item );
}
}
}
}
尝试一下,如果它更可靠,请告诉我们!
我想我在这里需要帮助,我不太确定我是否需要手动设置会话,或者它会在将项目添加到 woocommerce 购物车时自动设置,让我们考虑以下几点:
if(is_array($args_n)){
foreach($args_n as $item){
$is_product_in_cart = false;
if(sizeof( WC()->instance()->cart->get_cart() > 0)){
foreach(WC()->instance()->cart->get_cart() as $cart_items_key => $cart_items_values){
$products = $cart_items_values['data'];
if($products->id == $item){
$is_product_in_cart = true;
}
}
if(!$is_product_in_cart){
WC()->cart->add_to_cart( $item );
}
}else{
WC()->cart->add_to_cart( $item );
}
}
}
所以,当我执行以下操作时:
var_dump(sizeof(WC()->instance()->cart->get_cart()));
在调用开始时我得到 0
在代码执行后我得到正确的值 == 3
(对于这个例子);
传递的参数只是一个简单的数组,其中包含产品 ID 的 fx:
$args_n = array(
2080,
720,
835,
);
这个数组是用解析 url 和内爆创建的,没有来自另一个世界的东西
问题是,即使一切看起来都不错,因为当我转到购物车页面时我从购物车尺寸中得到了正确的数字,但它仍然是空的!。有什么想法或提示吗?
干杯
编辑
调试信息:
为正在传递的 ID 添加一个简单的生态:
echo "---> {$item} \n";
在被重定向之前,我运行这个:
$cart_items = $woocommerce->cart->get_cart();
foreach($cart_items as $i => $x){
$p = $x['data']->post;
echo " in cart ---> {$p->ID} \n";
}
结果是:
int(0) ---> 2080 ---> 720 ---> 835 int(3) in cart ---> 2080 in cart ---> 720 in cart ---> 835
所有商品都在购物车里了!但是当重定向完成时仍然不存在,或者只是导航离开该着陆页。
编辑:
检查 woocommerce 时 WC()->session
我得到的结果是会话处于活动状态,商品已添加到购物车..
object(WC_Session_Handler)#173 (7) {
["_cookie":"WC_Session_Handler":private]=>
string(55) "wp_woocommerce_session_77f1e25389fdbfe3480cc6593d3838b0"
["_session_expiring":"WC_Session_Handler":private]=>
int(1440319051)
["_session_expiration":"WC_Session_Handler":private]=>
int(1440322651)
["_has_cookie":"WC_Session_Handler":private]=>
bool(true)
["_customer_id":protected]=>
string(32) "57cd99b8855e872adad62440a6c2fbe0"
["_data":protected]=>
array(20) {
["cart"]=>
string(904) "a:3:{s:32:"54ff9e9e3a2ec0300d4ce11261f5169f";a:9:{s:10:"product_id";i:2080;s:12:"variation_id";s:0:"";s:9:"variation";a:0:{}s:8:"quantity";i:1;s:10:"line_total";d:1;s:8:"line_tax";i:0;s:13:"line_subtotal";i:1;s:17:"line_subtotal_tax";i:0;s:13:"line_tax_data";a:2:{s:5:"total";a:0:{}s:8:"subtotal";a:0:{}}}s:32:"5f2c22cb4a5380af7ca75622a6426917";a:9:{s:10:"product_id";i:720;s:12:"variation_id";s:0:"";s:9:"variation";a:0:{}s:8:"quantity";i:1;s:10:"line_total";d:1;s:8:"line_tax";i:0;s:13:"line_subtotal";i:1;s:17:"line_subtotal_tax";i:0;s:13:"line_tax_data";a:2:{s:5:"total";a:0:{}s:8:"subtotal";a:0:{}}}s:32:"4d5b995358e7798bc7e9d9db83c612a5";a:9:{s:10:"product_id";i:835;s:12:"variation_id";s:0:"";s:9:"variation";a:0:{}s:8:"quantity";i:1;s:10:"line_total";d:1;s:8:"line_tax";i:0;s:13:"line_subtotal";i:1;s:17:"line_subtotal_tax";i:0;s:13:"line_tax_data";a:2:{s:5:"total";a:0:{}s:8:"subtotal";a:0:{}}}}"
["applied_coupons"]=>
string(6) "a:0:{}"
["coupon_discount_amounts"]=>
string(6) "a:0:{}"
["coupon_discount_tax_amounts"]=>
string(6) "a:0:{}"
["removed_cart_contents"]=>
string(6) "a:0:{}"
["cart_contents_total"]=>
float(3)
["cart_contents_weight"]=>
int(0)
["cart_contents_count"]=>
int(3)
["total"]=>
int(0)
["subtotal"]=>
int(3)
["subtotal_ex_tax"]=>
int(3)
["tax_total"]=>
int(0)
["taxes"]=>
string(6) "a:0:{}"
["shipping_taxes"]=>
string(6) "a:0:{}"
["discount_cart"]=>
int(0)
["discount_cart_tax"]=>
int(0)
["shipping_total"]=>
int(0)
["shipping_tax_total"]=>
int(0)
["fee_total"]=>
int(0)
["fees"]=>
string(6) "a:0:{}"
}
["_dirty":protected]=>
bool(true)
}
编辑
如果购物车中已经有商品,并且触发了该功能,它将按预期工作,所以我猜是会话问题
根据 Mike Jolley 的一篇文章here:
" 缓存问题
由插件和 WPEngine 等主机添加的页面缓存可能会中断会话。好吧,不中断,只是显示一个缓存的页面,结果不反映当前用户的购物车。
当存在购物车会话时,一些数据需要取消缓存,一些页面(如购物车、结帐和帐户)也是如此。”-Mike Jolley
我认为这很有可能出了问题,因为在 WC 平台中 WP_SESSION 已经放弃了开始会话的正常方式。尝试致电您的托管服务提供商,看看您的服务器上是否启用了清漆缓存,看看他们是否可以提供解决方法。
我启动了一个新的 WooCommerce 并尝试了您的代码 - 我无法重现该问题。我认为这可能是加载顺序问题。 WooCommerce 为每个访问者创建一个会话和一个购物车,所以我认为购物车不是 "primed" 与现有会话或类似的东西无关。我经常发现您需要找到正确的挂钩,尤其是在处理 WooCommerce 购物车时。 WooCommerce 实际上将购物车信息保存在三个位置:购物车对象实例、用户会话和数据库中的持久购物车。让任何更新与 WooCommerce 在它们之间进行的舞蹈协调工作可能很棘手。我发现在整个页面加载之前将项目添加到购物车的最可靠时间是在 'template_redirect' 挂钩中。在所有会话数据和查询具有 运行 之后,但在构建页面之前。它非常适合在您想要向用户显示它们之前对其进行操作。
我是这样实现你的代码的,它适用于空车:
add_action('template_redirect','custom_add_to_cart', 1000);
function custom_add_to_cart() {
$args_n = array(10, 11); // I just made an array with dummy product ids
if(is_array($args_n)){
foreach($args_n as $item){
$is_product_in_cart = false;
if(sizeof( WC()->instance()->cart->get_cart() > 0)){
foreach(WC()->instance()->cart->get_cart() as $cart_items_key => $cart_items_values){
$products = $cart_items_values['data'];
if($products->id == $item){
$is_product_in_cart = true;
}
}
if(!$is_product_in_cart){
WC()->cart->add_to_cart( $item );
}
}else{
WC()->cart->add_to_cart( $item );
}
}
}
}
尝试一下,如果它更可靠,请告诉我们!