我以为用户退出时购物车是空的,我终于找到了。
在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 );
我会尝试禁用所有其他插件,看看行为是否会恢复到我认为的正常行为。从那里,您可以一次重新启用它们以隔离罪魁祸首。