【问题标题】:Save cart on the current session在当前会话中保存购物车
【发布时间】:2015-02-04 04:45:00
【问题描述】:

我正在使用 woocommerce 插件构建一个 wordpress 电子商务网站,结果当用户登录并将产品添加到他的购物车,但用户不想继续结帐过程时,用户更喜欢注销并稍后继续结帐过程......当用户回来并再次登录时,购物车是空的。

这里发生了什么? 这是 woocommerce 的正常行为吗? 我必须做其他事情吗?也许是一个插件?

谢谢。

【问题讨论】:

  • This blog post 看起来可能会有所帮助。你咨询过docs.woothemes.com吗?
  • 我一直在寻找我在互联网上找到的所有文档,没有任何文章可以帮助我解决这个问题:(。谢谢

标签: wordpress woocommerce cart


【解决方案1】:

我遇到了同样的问题并通过将以下函数放入我的functions.php文件来解决它:

/**
* Load the persistent cart if exists
*
* @return void
*/
function adian_load_persistent_cart(){

    global $current_user;

    if( ! $current_user )
    return false;

    $saved_cart = get_user_meta( $current_user->ID, '_woocommerce_persistent_cart', true );

    if ( $saved_cart ){
        if ( empty( WC()->session->cart ) || ! is_array( WC()->session->cart ) || sizeof( WC()->session->cart ) == 0 ){
            WC()->session->set('cart', $saved_cart['cart'] );   
        }
    }

}

add_action( 'init', 'adian_load_persistent_cart', 10, 1 );

函数检查用户是否保存了持久购物车并用它替换会话购物车。

【讨论】:

    【解决方案2】:

    我以为用户退出时购物车是空的,我终于找到了。

    wp_logout() WordPress 上运行wp_clear_auth_cookie() 功能。 wp_clear_auth_cookie() 触发 do_action( 'clear_auth_cookie' ); 动作挂钩。

    WooCommerce 的 Session 处理程序类然后在这个钩子上运行它的 destroy 方法。

    add_action( 'clear_auth_cookie', array( $this, 'destroy_session' ) );
    

    destroy_session() 方法随后调用 wc_empty_cart() 函数,该函数是购物车类的 empty_cart() 方法的包装器。

    WC()->cart->empty_cart( false ); 
    

    但是这里的关键是参数是false。因为当我们最终追踪empty_cart() 方法时,我们看到默认是true

        /**
         * Empties the cart and optionally the persistent cart too.
         *
         * @access public
         * @param bool $clear_persistent_cart (default: true)
         * @return void
         */
        public function empty_cart( $clear_persistent_cart = true ) {
            $this->cart_contents = array();
            $this->reset();
    
            unset( WC()->session->order_awaiting_payment, WC()->session->applied_coupons, WC()->session->coupon_discount_amounts, WC()->session->cart );
    
            if ( $clear_persistent_cart && get_current_user_id() ) {
                $this->persistent_cart_destroy();
            }
    
            do_action( 'woocommerce_cart_emptied' );
        }
    

    当传递true 时,会调用persistant_cart_destroy() 方法,this 方法会删除保存用户购物车的元数据。

        /**
         * Delete the persistent cart permanently.
         *
         * @access public
         * @return void
         */
        public function persistent_cart_destroy() {
            delete_user_meta( get_current_user_id(), '_woocommerce_persistent_cart' );
        }
    

    所以,所有这一切都是说我确实认为当用户注销然后重新登录时应该清空购物车。更多的证据是 WooCommerce 尝试加载持久用户重新登录后立即购物车。

    /**
     * Load the cart upon login
     *
     * @param mixed $user_login
     * @param integer $user
     * @return void
     */
    function wc_load_persistent_cart( $user_login, $user = 0 ) {
    
        if ( ! $user )
            return;
    
        $saved_cart = get_user_meta( $user->ID, '_woocommerce_persistent_cart', true );
    
        if ( $saved_cart )
            if ( empty( WC()->session->cart ) || ! is_array( WC()->session->cart ) || sizeof( WC()->session->cart ) == 0 )
                WC()->session->cart = $saved_cart['cart'];
    }
    add_action( 'wp_login', 'wc_load_persistent_cart', 1, 2 );
    

    我会尝试禁用所有其他插件,看看行为是否会恢复到我认为的正常行为。从那里,您可以一次重新启用它们以隔离罪魁祸首。

    【讨论】:

    • 感谢您的回答,我已禁用所有插件并且仍然存在相同的问题,这可能是我的购物车实施中的问题,我不知道:( cart->cart_contents_count; ?> 似乎没问题。但每次我退出时它都会在购物车上返回“0”个产品。
    • 您的设置必须是其他内容。主题做奇怪的事情?也许你的主机(虽然我不知道为什么)。但正如我所展示的,这不是默认行为。
    • 今天早上从WC()->cart->empty_cart() 更改为wc_emtpy_cart() 时,我注意到了真/假。不过,这需要一些试验才能确定两者中哪一个“更好”。
    • 当我使用此方法更新会话购物车并打印 WC()->cart->get_cart();。仍然是空的。
    猜你喜欢
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多