Wordpress 在当前会话上保存购物车

Wordpress 在当前会话上保存购物车,wordpress,woocommerce,cart,Wordpress,Woocommerce,Cart,我正在用woocommerce插件建立一个wordpress电子商务网站,当用户登录并将产品添加到购物车时,但用户不想继续结帐过程,用户更愿意注销并稍后继续结帐过程。。。当用户返回并再次登录时,购物车为空 这是怎么回事?。 这是商业的正常行为吗?。 我必须做些别的事吗?也许是一个插件 谢谢。我以为当用户注销时购物车会被清空,我最终找到了它 在wp_注销时,WordPress运行wp_clear_auth_cookie函数。wp_clear_auth_cookie触发do_操作“clear_aut

我正在用woocommerce插件建立一个wordpress电子商务网站,当用户登录并将产品添加到购物车时,但用户不想继续结帐过程,用户更愿意注销并稍后继续结帐过程。。。当用户返回并再次登录时,购物车为空

这是怎么回事?。 这是商业的正常行为吗?。 我必须做些别的事吗?也许是一个插件


谢谢。

我以为当用户注销时购物车会被清空,我最终找到了它

在wp_注销时,WordPress运行wp_clear_auth_cookie函数。wp_clear_auth_cookie触发do_操作“clear_auth_cookie”;动作钩

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

add_action( 'clear_auth_cookie', array( $this, 'destroy_session' ) );
然后destroy_会话方法调用wc_empty_cart函数,该函数是cart类的empty_cart方法的包装器

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

当传递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 );

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

我以为当用户注销时购物车会被清空,我最终找到了它

在wp_注销时,WordPress运行wp_clear_auth_cookie函数。wp_clear_auth_cookie触发do_操作“clear_auth_cookie”;动作钩

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

add_action( 'clear_auth_cookie', array( $this, 'destroy_session' ) );
然后destroy_会话方法调用wc_empty_cart函数,该函数是cart类的empty_cart方法的包装器

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

当传递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 );

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

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

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

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

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

看起来可能会有所帮助。你咨询过吗?我一直在网上查找所有的文档,没有一篇文章能帮我解决这个问题:。谢谢,看来会有帮助的。你咨询过吗?我一直在网上查找所有的文档,没有一篇文章能帮我解决这个问题:。谢谢你的回答,我已经禁用了所有插件,仍然存在同样的问题,这可能是我的get cart实现中的问题,我不知道:看起来还可以。但每次我注销时,它都会返回购物车上的0个产品。这一定是您的设置中的其他内容。你在做奇怪的事吗?也许是你的主机,但我不知道为什么。但正如我所展示的,这不是默认行为。今天早上,当从WC->cart->empty_cart更改为WC_emtpy_cart时,我注意到了正确/错误的情况。不过,要想找出这两种方法中哪一种更好,还需要一些实验。当我使用此方法更新会话购物车并打印WC->cart->get_cart;时;。但是,它仍然是空的。谢谢你的回答,我已经禁用了所有插件,仍然存在相同的问题,这可能是我的get cart实现中的问题,我不知道:看起来还可以。但每次我注销时,它都会返回购物车上的0个产品。这一定是您的设置中的其他内容。你在做奇怪的事吗?也许是你的主机,但我不知道为什么。但正如我所展示的,这不是默认行为。今天早上,当从WC->cart->empty_cart更改为WC_emtpy_cart时,我注意到了正确/错误的情况。不过,这需要一些实验来确定这两种方法中哪一种更好 我正在打印WC->cart->get_cart;。不过,它还是空的。