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

尝试一下,如果它更可靠,请告诉我们!