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?
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.