Woocomerce从共享购物车网址添加商品到购物车?

时间:2015-08-21 08:29:39

标签: php wordpress redirect woocommerce

我想我需要帮助,我不确定我是否需要手动设置会话,或者在将项目添加到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)
}

修改

如果购物车上已有商品,并且该功能已触发,则会按预期工作,所以我猜是会话问题

2 个答案:

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

尝试一下,让我们知道它是否更可靠!