【问题标题】:WooCommerce Session Variables InitializationWooCommerce 会话变量初始化
【发布时间】:2020-10-14 03:55:43
【问题描述】:

我正在尝试在商店页面中创建会话变量,然后我想在结帐页面中显示此变量值。 我在woocommerce功能页面中写了这段代码:

// Creating session variables
add_action( 'template_redirect', 'oturum_degiskeni_olustur' );
function oturum_degiskeni_olustur () {
    if ( isset( $_GET['konumu'] ) || isset( $_GET['masa_no'] ) ) {
        $konum   = isset( $_GET['konumu'] )   ? esc_attr( $_GET['konumu'] )   : '';
        $masa = isset( $_GET['masa_no'] ) ? esc_attr( $_GET['masa_no'] ) : '';

        // Set the session data
        WC()->session->set( 'custom_data', array( 'konum' => $konum, 'masa' => $masa ) );
   
    }
}


// Show session variables in checkout page
add_action('woocommerce_before_checkout_form', 'yeni_alanlar');

function yeni_alanlar($checkout){

    $data = WC()->session->get('custom_data');

    echo '<div id="custom_checkout_field">';

    if( isset($data['konum']) && ! empty($data['konum']) && isset($data['masa']) && ! empty($data['masa']) ){
        echo '<p><strong>Konumunuz : </strong>' . $data['konum'] .'<br/><strong>Masanız : </strong>' . $data['masa'] .'</p>';
    }

    echo '</div>';
}

会话变量的 URL:www.domain.com/shop/?konumu=newyork&masa_no=12

但此代码在用户第二次访问时有效。

例如;用户使用此自定义 URL 并访问商店页面并继续购物车和结帐页面。但是,我的代码不起作用。然后,用户再次访问此自定义 URL 并继续购物车和结帐页面,此时代码正在运行。

第一次访问时它不起作用。 这是为什么?我该如何解决这个问题?

【问题讨论】:

    标签: php wordpress session woocommerce hook-woocommerce


    【解决方案1】:

    您需要提前初始化客户会话,因此我们将使用WC_Session_Handler 方法set_customer_session_cookie()template_redirect 更改为init 挂钩,例如:

    // Creating session variables
    add_action( 'init', 'oturum_degiskeni_olustur' );
    function oturum_degiskeni_olustur () {
        // Early initialize customer session
        if ( isset(WC()->session) && ! WC()->session->has_session() ) {
            WC()->session->set_customer_session_cookie( true );
        }
    
        if ( isset( $_GET['konumu'] ) && isset( $_GET['masa_no'] ) ) {
            $konum = isset( $_GET['konumu'] )  ? esc_attr( $_GET['konumu'] )  : '';
            $masa  = isset( $_GET['masa_no'] ) ? esc_attr( $_GET['masa_no'] ) : '';
    
            // Set the session data
            WC()->session->set( 'custom_data', array( 'konum' => $konum, 'masa' => $masa ) );
        }
    }
    
    // Show session variables in checkout page
    add_action('woocommerce_before_checkout_form', 'yeni_alanlar');
    function yeni_alanlar(){
        if( ( $data = WC()->session->get('custom_data') ) 
        && isset($data['konum']) && isset($data['masa']) ) {
    
            echo '<div id="custom_checkout_field">
                <p><strong>Konumunuz : </strong>' . $data['konum'] .'<br/>
                <strong>Masanız : </strong>' . $data['masa'] .'</p>
            </div>';
        }
    }
    

    现在应该可以更好地工作了。

    【讨论】:

    • @083N 是的已更新,仅使用一个 IF 语句会更好:if ( isset(WC()-&gt;session) &amp;&amp; ! WC()-&gt;session-&gt;has_session() ) { ...
    猜你喜欢
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多