Php Woocomece是否从共享购物车url向购物车添加项目? 我想我需要帮助,我不确定是否需要手动设置会话,或者在向WooCuto购物车添加项目时自动设置,请考虑以下内容: 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()));

Php Woocomece是否从共享购物车url向购物车添加项目? 我想我需要帮助,我不确定是否需要手动设置会话,或者在向WooCuto购物车添加项目时自动设置,请考虑以下内容: 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()));,php,wordpress,redirect,woocommerce,Php,Wordpress,Redirect,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

因此,当我执行以下操作时:

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创建的,并会内爆,而不是来自另一个世界

问题是,即使所有这些看起来都不错,因为当我转到购物车页面时,我从购物车大小中获得了正确的数字,但它仍然是空的!。有什么想法或提示吗

干杯

编辑

调试信息:

将简单eco添加到要传递的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的一篇文章:

缓存问题

由插件和主机(如WPEngine)添加的页面缓存可以中断会话。不中断,只显示缓存的页面,因此不会反映当前用户

当存在购物车会话时,一些数据需要取消缓存,一些页面如购物车、结帐和帐户也需要取消缓存。”-Mike Jolley


我认为这很可能是出了什么问题,因为WC平台上的WP_会话已经放弃了正常启动会话的方式。试着打电话给你的主机提供商,看看你的服务器上是否启用了varnish缓存,看看他们是否能提供解决方法。

我启动了一个新的WooCommerce,并试用了你的代码-我无法复制这个问题。我认为这可能是一个装载订单问题。WooCommerce为每个访问者创建了一个会话和一个购物车,所以我认为这不是购物车没有被现有会话或类似的东西“启动”的问题。我经常发现,你需要找到正确的钩子,尤其是在处理购物车的时候。WooCommerce实际上将购物车信息保存在三个位置:购物车对象实例、用户会话和数据库中的持久购物车。让任何更新与WooCommerce在这两者之间进行的舞蹈协调工作都是很棘手的。我发现,在加载完整页面之前,将项目添加到购物车中最可靠的时间是在“模板重定向”挂钩中。这是在所有会话数据和查询运行之后,但在构建页面之前。它有助于在向用户显示内容之前进行操作

下面是我如何实现您的代码的,它在空车上工作:

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

试试看,让我们知道它是否工作更可靠

您在哪个钩子上运行
if
condition code?@Anand运行在虚拟页面中的shorcut中。要在加载wp后处理请求,因此fx->
example.com/duumy/?function=1212123321
我确实尝试了
template\u redirect
,但我需要传递和arg,因为$args\u n是一个动态变量,在页面加载时从url获取其值,我无法传递带有该钩子的参数为什么不移动您的$\u GET['function']和explode()到自定义的_add_到_cart()函数?这在我测试它的时候起到了作用:谢谢,伙计,我不知道为什么我在添加一些检查以确保我不在不需要的时候添加东西之前没有这样想:)我认为这是这个网站有用性的一半-你让其他人注意到你永远不会注意到的东西。我经常会花几个小时在一个问题上,然后问一个在几秒钟内就能看到答案的朋友。很高兴它成功了!