在当前会话中保存购物车

时间:2014-12-05 22:22:12

标签: wordpress woocommerce cart

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

这里发生了什么? 这是woocommerce的正常行为吗? 我还需要做别的吗?也许是一个插件?

感谢。

2 个答案:

答案 0 :(得分:5)

我认为当用户退出时,购物车会被清空,我最终会将其追踪。

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()方法,方法删除保存用户购物车的元数据。

    /**
     * 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 );

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

答案 1 :(得分:0)

我遇到了同样的问题并通过将以下函数放到我的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 );

功能检查用户是否已保存持久购物车并用其替换会话购物车。