wordpress WC会话自定义数据在用户登录WooCommerce后被清除

cvxl0en2  于 12个月前  发布在  WordPress
关注(0)|答案(1)|浏览(108)

我有一个代码(非常感谢LoicTheAztec),我用它来将变量从URL传递到woocommerce会话,它适用于访问者不需要登录的订单(客人结账)

add_action( 'template_redirect', 'set_custom_variables_wc_session' );
function set_custom_variables_wc_session(){
    $src   = isset( $_GET['src'] ) ? sanitize_text_field( $_GET['src'] ) : "";
    $subid = isset( $_GET['subid'] ) ? sanitize_text_field( $_GET['subid'] ) : "";
    
    WC()->session->set('custom_data',['src' => $src, 'subid'=> $subid]);
}

我在结账页面上做了一个print_r,他们显示,并为客人结账(不需要登录的订阅)节省了任何问题:

Array
(
    [src] => test100
    [subid] => 98754
)

但是,如果产品是订阅并且用户已经有一个帐户,WooCommerce会要求用户登录,当他们在结账页面上使用登录表单时,所有这些变量都会从会话中清除。

Array
(
    [src] => 
    [subid] => 

)

换句话说,在用户登录到结帐页面之后,他们就在同一个页面上结束了,但是所有的会话custom_data变量都消失了。
我环顾四周,但找不到任何信息,以某种方式保存这些数据,即使用户登录,所以它没有丢失。
如何让当前会话custom_data保持在原位,即使返回的用户在结帐表单上登录?
我试图寻找一个解决方案来保存custom_data,但找不到。

2admgd59

2admgd591#

你没有以正确的方式做事情,你的代码在重新加载WC会话数据数组值时被清除。请使用以下命令:

add_action( 'template_redirect', 'set_custom_variables_wc_session' );
function set_custom_variables_wc_session(){
    if( isset($_GET['src']) && ! empty($_GET['src']) && isset($_GET['subid']) && ! empty($_GET['subid']) ) {
        $custom_data = ['src' => esc_attr($_GET['src']), 'subid'=> esc_attr($_GET['subid'])];
        WC()->session->set('custom_data', $custom_data); 
    }
}

代码放在子主题的functions.php文件中(或插件中)。测试和作品。
这一次,WC会话数据将持续存在。

**添加:**WC会话和“访客”用户

下面是一个更好的方法,提前为“访客”用户启用WC会话。通常对于访客用户,WC会话在第一次添加到购物车时启动。
以下代码将提前为访客启用WC会话,允许在所有情况下将自定义数据存储在WC会话中:

add_action( 'woocommerce_init', 'set_custom_variables_wc_session' );
function set_custom_variables_wc_session(){ 
    // Not on backend and only for guests
    if ( ! ( is_user_logged_in() || is_admin() ) ) {
        // Early enable WC Session for guest users
        if ( isset(WC()->session) && ! WC()->session->has_session() ) {
            WC()->session->set_customer_session_cookie( true ); 
        }
    }
    // Store Url variable(s) in WC Session custom variable(s)
    if( isset($_GET['src']) && ! empty($_GET['src']) && isset($_GET['subid']) && ! empty($_GET['subid']) ) {
        $custom_data = ['src' => esc_attr($_GET['src']), 'subid'=> esc_attr($_GET['subid'])];
        WC()->session->set('custom_data', $custom_data); 
    }
}

代码放在子主题的functions.php文件中(或插件中)。测试和作品。

相关问题