Search code examples
phpwordpresssessionwoocommercehook-woocommerce

WooCommerce Session Variables Initialization


I'm trying to create a session variable in shop page and then I want to show this variable values in checkout page. I wrote this code in woocommerce function page:

// 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 for session variables: www.domain.com/shop/?konumu=newyork&masa_no=12

But this code working when user's second visit.

For example; user use this custom URL and visit the shop page and continue to cart and checkout page. But, my code is not working. Then, user going to this custom URL again and continue to cart & checkout page and code is working this time.

It is not working when first visit. Why is that? How can I solve this issue?


Solution

  • You need to early init customer session, so we will change template_redirect to init hook using the WC_Session_Handler method set_customer_session_cookie() like:

    // Creating session variables
    add_action( 'woocommerce_init', 'add_custom_wc_session_variables' );
    function add_custom_wc_session_variables () {
        if ( is_admin() ) return;
    
        // 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>';
        }
    }
    

    Now it should better work.