我想我需要帮助,我不确定我是否需要手动设置会话,或者在将项目添加到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,
);
这个数组是用解析网址和内爆创建的,没有来自其他世界
问题是,即使这一切看起来都不错,因为当我进入购物车页面时,我从购物车尺寸中得到正确的数字,它仍然是空的!有什么想法或提示吗?
干杯
修改
调试信息:
在id传递中添加一个简单的eco:
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)
}
修改
如果购物车上已有商品,并且该功能已触发,则会按预期工作,所以我猜是会话问题
答案 0 :(得分:1)
根据Mike Jolley的一篇文章here:
“缓存问题
插件和WPEngine等主机添加的页面缓存可以中断会话。好吧,不要打破,只显示一个缓存的页面,因此不会反映当前的用户购物车。
当购物车会话出现时,某些数据需要取消缓存,某些页面(如购物车,结帐和帐户)也是如此。“-Mike Jolley
我认为这很可能出现问题,因为WC平台中的WP_SESSION已经放弃了正常的启动会话方式。尝试致电您的托管服务提供商,看看您的服务器上是否启用了清除缓存,看看他们是否可以提供解决方案。
答案 1 :(得分:1)
我开了一个新的WooCommerce并尝试了你的代码 - 我无法复制这个问题。我认为这可能是一个加载订单问题。 WooCommerce为每位访客创建了一个会话和一个购物车,所以我不认为这是因为购物车没有被引导"与现有的会话或类似的东西。我经常发现你需要找到合适的钩子,特别是在处理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 );
}
}
}
}
尝试一下,让我们知道它是否更可靠!