WordPress/WC session not carried to next page











up vote
-1
down vote

favorite












Simply trying to store and retrieve unregistered customer data from page to page in a custom checkout template. I've stripped it down to the bare bones to try to pinpoint the issue.



This



<?php
$customer = WC()->customer;
$customer->set_billing_first_name("WORKING!!!");
$customer->save();
var_dump($customer->get_billing());
?>


Outputs this



array (size=2)
'country' => string 'US' (length=2)
'first_name' => string 'WORKING!!!' (length=10)


But then this



<?php
$customer = WC()->customer;
//$customer->set_billing_first_name("WORKING!!!");
//$customer->save();
var_dump($customer->get_billing());
?>


Outputs this



array (size=1)
'country' => string 'US' (length=2)


Even though I should still be firmly within the same session, and therefore should get the data stored before the comments. All I did was refresh the page after commenting out those two lines.



Am I completely wrong about these methods?





Checked




  1. Environment is configured entirely correctly. Even had someone else double-check it for me. URLs, caches, etc.


  2. It does appear to work when logged in, but the vast majority of users never do so that's not very helpful.


  3. Have tried this on two different servers (one local, one remote) and have the same issue.


  4. Started fresh with a new WP+WC install, created a blank theme, functions.php that does the above on init code. Same exact issue.











share|improve this question




















  • 1




    That is a normal thing if $customer->get_id() is 0 which happens when you're not logged-in. WooCommerce stores the session identifier (the user ID or an auto-generated customer ID) in the browser's cookies, and not the superglobal $_SESSION. Try var_dump( $customer->get_billing(), $customer->get_id(), WC->session->get_customer_id() ) and see the output when you're logged-in and not.
    – Sally CJ
    Nov 11 at 23:55












  • @SallyCJ ah okay so my root assumption that this stores customer data in a session is false? I am seeing the wp_woocommerce_session_xxx=yyyy cookie passed up in the request... it there a built-in way to store this customer data temporarily?
    – Randy Hall
    Nov 12 at 0:02






  • 1




    Your assumption is basically true; however, the session data (other than the session identifier; e.g. cart contents) are stored in {prefix}woocommerce_sessions table - e.g. wp_woocommerce_sessions. And this is same to how the WordPress authentication works, where your user ID is saved in the cookie, but the rest of your session are saved in the database. You can use WC()->session->set() to save data temporarily, which can persist across pages - but of course cookies must be enabled in the user's browser.
    – Sally CJ
    Nov 12 at 0:19










  • @SallyCJ I'm seeing the same issue, using WC()->session, setting a var, then commenting out the set and refreshing the page. The value I saved and successfully returned using WC()->session->set() and WC()->session->get() is just flat out not there after navigation.
    – Randy Hall
    Nov 12 at 8:27






  • 1




    Check my answer and let me know how it goes. Hopefully it works..
    – Sally CJ
    Nov 12 at 10:29















up vote
-1
down vote

favorite












Simply trying to store and retrieve unregistered customer data from page to page in a custom checkout template. I've stripped it down to the bare bones to try to pinpoint the issue.



This



<?php
$customer = WC()->customer;
$customer->set_billing_first_name("WORKING!!!");
$customer->save();
var_dump($customer->get_billing());
?>


Outputs this



array (size=2)
'country' => string 'US' (length=2)
'first_name' => string 'WORKING!!!' (length=10)


But then this



<?php
$customer = WC()->customer;
//$customer->set_billing_first_name("WORKING!!!");
//$customer->save();
var_dump($customer->get_billing());
?>


Outputs this



array (size=1)
'country' => string 'US' (length=2)


Even though I should still be firmly within the same session, and therefore should get the data stored before the comments. All I did was refresh the page after commenting out those two lines.



Am I completely wrong about these methods?





Checked




  1. Environment is configured entirely correctly. Even had someone else double-check it for me. URLs, caches, etc.


  2. It does appear to work when logged in, but the vast majority of users never do so that's not very helpful.


  3. Have tried this on two different servers (one local, one remote) and have the same issue.


  4. Started fresh with a new WP+WC install, created a blank theme, functions.php that does the above on init code. Same exact issue.











share|improve this question




















  • 1




    That is a normal thing if $customer->get_id() is 0 which happens when you're not logged-in. WooCommerce stores the session identifier (the user ID or an auto-generated customer ID) in the browser's cookies, and not the superglobal $_SESSION. Try var_dump( $customer->get_billing(), $customer->get_id(), WC->session->get_customer_id() ) and see the output when you're logged-in and not.
    – Sally CJ
    Nov 11 at 23:55












  • @SallyCJ ah okay so my root assumption that this stores customer data in a session is false? I am seeing the wp_woocommerce_session_xxx=yyyy cookie passed up in the request... it there a built-in way to store this customer data temporarily?
    – Randy Hall
    Nov 12 at 0:02






  • 1




    Your assumption is basically true; however, the session data (other than the session identifier; e.g. cart contents) are stored in {prefix}woocommerce_sessions table - e.g. wp_woocommerce_sessions. And this is same to how the WordPress authentication works, where your user ID is saved in the cookie, but the rest of your session are saved in the database. You can use WC()->session->set() to save data temporarily, which can persist across pages - but of course cookies must be enabled in the user's browser.
    – Sally CJ
    Nov 12 at 0:19










  • @SallyCJ I'm seeing the same issue, using WC()->session, setting a var, then commenting out the set and refreshing the page. The value I saved and successfully returned using WC()->session->set() and WC()->session->get() is just flat out not there after navigation.
    – Randy Hall
    Nov 12 at 8:27






  • 1




    Check my answer and let me know how it goes. Hopefully it works..
    – Sally CJ
    Nov 12 at 10:29













up vote
-1
down vote

favorite









up vote
-1
down vote

favorite











Simply trying to store and retrieve unregistered customer data from page to page in a custom checkout template. I've stripped it down to the bare bones to try to pinpoint the issue.



This



<?php
$customer = WC()->customer;
$customer->set_billing_first_name("WORKING!!!");
$customer->save();
var_dump($customer->get_billing());
?>


Outputs this



array (size=2)
'country' => string 'US' (length=2)
'first_name' => string 'WORKING!!!' (length=10)


But then this



<?php
$customer = WC()->customer;
//$customer->set_billing_first_name("WORKING!!!");
//$customer->save();
var_dump($customer->get_billing());
?>


Outputs this



array (size=1)
'country' => string 'US' (length=2)


Even though I should still be firmly within the same session, and therefore should get the data stored before the comments. All I did was refresh the page after commenting out those two lines.



Am I completely wrong about these methods?





Checked




  1. Environment is configured entirely correctly. Even had someone else double-check it for me. URLs, caches, etc.


  2. It does appear to work when logged in, but the vast majority of users never do so that's not very helpful.


  3. Have tried this on two different servers (one local, one remote) and have the same issue.


  4. Started fresh with a new WP+WC install, created a blank theme, functions.php that does the above on init code. Same exact issue.











share|improve this question















Simply trying to store and retrieve unregistered customer data from page to page in a custom checkout template. I've stripped it down to the bare bones to try to pinpoint the issue.



This



<?php
$customer = WC()->customer;
$customer->set_billing_first_name("WORKING!!!");
$customer->save();
var_dump($customer->get_billing());
?>


Outputs this



array (size=2)
'country' => string 'US' (length=2)
'first_name' => string 'WORKING!!!' (length=10)


But then this



<?php
$customer = WC()->customer;
//$customer->set_billing_first_name("WORKING!!!");
//$customer->save();
var_dump($customer->get_billing());
?>


Outputs this



array (size=1)
'country' => string 'US' (length=2)


Even though I should still be firmly within the same session, and therefore should get the data stored before the comments. All I did was refresh the page after commenting out those two lines.



Am I completely wrong about these methods?





Checked




  1. Environment is configured entirely correctly. Even had someone else double-check it for me. URLs, caches, etc.


  2. It does appear to work when logged in, but the vast majority of users never do so that's not very helpful.


  3. Have tried this on two different servers (one local, one remote) and have the same issue.


  4. Started fresh with a new WP+WC install, created a blank theme, functions.php that does the above on init code. Same exact issue.








php wordpress session woocommerce






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 11 at 23:13

























asked Nov 8 at 3:42









Randy Hall

2,07163775




2,07163775








  • 1




    That is a normal thing if $customer->get_id() is 0 which happens when you're not logged-in. WooCommerce stores the session identifier (the user ID or an auto-generated customer ID) in the browser's cookies, and not the superglobal $_SESSION. Try var_dump( $customer->get_billing(), $customer->get_id(), WC->session->get_customer_id() ) and see the output when you're logged-in and not.
    – Sally CJ
    Nov 11 at 23:55












  • @SallyCJ ah okay so my root assumption that this stores customer data in a session is false? I am seeing the wp_woocommerce_session_xxx=yyyy cookie passed up in the request... it there a built-in way to store this customer data temporarily?
    – Randy Hall
    Nov 12 at 0:02






  • 1




    Your assumption is basically true; however, the session data (other than the session identifier; e.g. cart contents) are stored in {prefix}woocommerce_sessions table - e.g. wp_woocommerce_sessions. And this is same to how the WordPress authentication works, where your user ID is saved in the cookie, but the rest of your session are saved in the database. You can use WC()->session->set() to save data temporarily, which can persist across pages - but of course cookies must be enabled in the user's browser.
    – Sally CJ
    Nov 12 at 0:19










  • @SallyCJ I'm seeing the same issue, using WC()->session, setting a var, then commenting out the set and refreshing the page. The value I saved and successfully returned using WC()->session->set() and WC()->session->get() is just flat out not there after navigation.
    – Randy Hall
    Nov 12 at 8:27






  • 1




    Check my answer and let me know how it goes. Hopefully it works..
    – Sally CJ
    Nov 12 at 10:29














  • 1




    That is a normal thing if $customer->get_id() is 0 which happens when you're not logged-in. WooCommerce stores the session identifier (the user ID or an auto-generated customer ID) in the browser's cookies, and not the superglobal $_SESSION. Try var_dump( $customer->get_billing(), $customer->get_id(), WC->session->get_customer_id() ) and see the output when you're logged-in and not.
    – Sally CJ
    Nov 11 at 23:55












  • @SallyCJ ah okay so my root assumption that this stores customer data in a session is false? I am seeing the wp_woocommerce_session_xxx=yyyy cookie passed up in the request... it there a built-in way to store this customer data temporarily?
    – Randy Hall
    Nov 12 at 0:02






  • 1




    Your assumption is basically true; however, the session data (other than the session identifier; e.g. cart contents) are stored in {prefix}woocommerce_sessions table - e.g. wp_woocommerce_sessions. And this is same to how the WordPress authentication works, where your user ID is saved in the cookie, but the rest of your session are saved in the database. You can use WC()->session->set() to save data temporarily, which can persist across pages - but of course cookies must be enabled in the user's browser.
    – Sally CJ
    Nov 12 at 0:19










  • @SallyCJ I'm seeing the same issue, using WC()->session, setting a var, then commenting out the set and refreshing the page. The value I saved and successfully returned using WC()->session->set() and WC()->session->get() is just flat out not there after navigation.
    – Randy Hall
    Nov 12 at 8:27






  • 1




    Check my answer and let me know how it goes. Hopefully it works..
    – Sally CJ
    Nov 12 at 10:29








1




1




That is a normal thing if $customer->get_id() is 0 which happens when you're not logged-in. WooCommerce stores the session identifier (the user ID or an auto-generated customer ID) in the browser's cookies, and not the superglobal $_SESSION. Try var_dump( $customer->get_billing(), $customer->get_id(), WC->session->get_customer_id() ) and see the output when you're logged-in and not.
– Sally CJ
Nov 11 at 23:55






That is a normal thing if $customer->get_id() is 0 which happens when you're not logged-in. WooCommerce stores the session identifier (the user ID or an auto-generated customer ID) in the browser's cookies, and not the superglobal $_SESSION. Try var_dump( $customer->get_billing(), $customer->get_id(), WC->session->get_customer_id() ) and see the output when you're logged-in and not.
– Sally CJ
Nov 11 at 23:55














@SallyCJ ah okay so my root assumption that this stores customer data in a session is false? I am seeing the wp_woocommerce_session_xxx=yyyy cookie passed up in the request... it there a built-in way to store this customer data temporarily?
– Randy Hall
Nov 12 at 0:02




@SallyCJ ah okay so my root assumption that this stores customer data in a session is false? I am seeing the wp_woocommerce_session_xxx=yyyy cookie passed up in the request... it there a built-in way to store this customer data temporarily?
– Randy Hall
Nov 12 at 0:02




1




1




Your assumption is basically true; however, the session data (other than the session identifier; e.g. cart contents) are stored in {prefix}woocommerce_sessions table - e.g. wp_woocommerce_sessions. And this is same to how the WordPress authentication works, where your user ID is saved in the cookie, but the rest of your session are saved in the database. You can use WC()->session->set() to save data temporarily, which can persist across pages - but of course cookies must be enabled in the user's browser.
– Sally CJ
Nov 12 at 0:19




Your assumption is basically true; however, the session data (other than the session identifier; e.g. cart contents) are stored in {prefix}woocommerce_sessions table - e.g. wp_woocommerce_sessions. And this is same to how the WordPress authentication works, where your user ID is saved in the cookie, but the rest of your session are saved in the database. You can use WC()->session->set() to save data temporarily, which can persist across pages - but of course cookies must be enabled in the user's browser.
– Sally CJ
Nov 12 at 0:19












@SallyCJ I'm seeing the same issue, using WC()->session, setting a var, then commenting out the set and refreshing the page. The value I saved and successfully returned using WC()->session->set() and WC()->session->get() is just flat out not there after navigation.
– Randy Hall
Nov 12 at 8:27




@SallyCJ I'm seeing the same issue, using WC()->session, setting a var, then commenting out the set and refreshing the page. The value I saved and successfully returned using WC()->session->set() and WC()->session->get() is just flat out not there after navigation.
– Randy Hall
Nov 12 at 8:27




1




1




Check my answer and let me know how it goes. Hopefully it works..
– Sally CJ
Nov 12 at 10:29




Check my answer and let me know how it goes. Hopefully it works..
– Sally CJ
Nov 12 at 10:29












2 Answers
2






active

oldest

votes

















up vote
2
down vote



accepted
+50










If $customer->save() doesn't persist the changes you made to the customer's data (e.g. $customer->set_billing_first_name('Test')), then it's likely because the customer is not registered to the site or not logged-in, where $customer->get_id() is 0.



And that is normal because the user's ID or the session's ID is required in order to properly save the changes and make it persistent across different pages.



So when the user is not registered/logged-in, WooCommerce doesn't start its session until the user logs in, or that he/she added a product into the cart.



But you can manually start the session, like so: (add the code to the active theme's functions.php file)



add_action( 'woocommerce_init', function(){
if ( ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
} );


And then, changes to the customer's data would then be carried on to other pages so long as cookies are enabled on the browser, because just like WordPress, WooCommerce stores its session ID (the user ID or an auto-generated ID/hash) in the cookies — and the session ID is used to set/retrieve the session data in the database — the table name is woocommerce_sessions if without any table prefix.



Try this after starting the WooCommerce session:



$customer = WC()->customer;
// Change 'Test' if necessary - e.g. 'Something unique 123'
if ( 'Test' !== $customer->get_billing_first_name() ) {
$customer->set_billing_first_name( 'Test' );
echo 'First name added to session<br>';
} else {
echo 'First name read from session<br>';
}


And this one — you should see a new date on each page load: (well, the one you've set previously)



echo WC()->session->get( 'test', 'None set' ) . '<br>';
WC()->session->set( 'test', current_time( 'mysql' ) );
echo WC()->session->get( 'test', 'It can't be empty' );





share|improve this answer























  • You are my hero today. I would seriously pay you to answer my questions about WP. So many gaps in my knowledge...
    – Randy Hall
    Nov 13 at 2:23






  • 1




    Well, I always learned from people's code, and eventually became better in time. And I'm sure you too can. :) But hey, I also still have gaps in my knowledge because nobody is perfect... xD And you can always ask your question on Stack Overflow - or for WordPress-specific like creating custom WordPress REST API endpoints, then you should ask it on WordPress Stack Exchange. (Note though, WooCommerce questions are off-topic there..)
    – Sally CJ
    Nov 13 at 10:06












  • Been stuck on this one for days, you seem like you understand the bones much better than I do stackoverflow.com/questions/53362482/…
    – Randy Hall
    Nov 20 at 14:42






  • 1




    Sorry Randy, I forgot about that question, and by the time I wanted to answer it, you've already posted an answer, so I +1 it and I'm sure all is good now. :)
    – Sally CJ
    Nov 23 at 8:34


















up vote
0
down vote













Are you using the Url set in Wordpress? It seems that it stores the cookie based on the url configured in the app rather than the actual one.



Hope this helps.



Source: https://en.blogpascher.com/wordpress-tutorial/How-correct-the-loss-of-session-on-wordpress






share|improve this answer





















  • This is actually a local copy of my site. Do you have a quick reference for where/what settings to check?
    – Randy Hall
    Nov 11 at 0:10










  • Either in wp-config.php or in the interface under General Settings
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:12










  • Check WP_SITEURL In wp-config.php
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:14










  • Interestingly, there is no WP_SITEURL set in the wp-config.php in the root of this site. As in the property is not listed. This is a site that is hosted on wpengine and they do have some custom settings in here, but I'm uncertain if that would have any effect. But I like this train of thought, working through more now
    – Randy Hall
    Nov 11 at 0:28










  • It is also in the interface codex.wordpress.org/Changing_The_Site_URL
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:32











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














 

draft saved


draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53201243%2fwordpress-wc-session-not-carried-to-next-page%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
2
down vote



accepted
+50










If $customer->save() doesn't persist the changes you made to the customer's data (e.g. $customer->set_billing_first_name('Test')), then it's likely because the customer is not registered to the site or not logged-in, where $customer->get_id() is 0.



And that is normal because the user's ID or the session's ID is required in order to properly save the changes and make it persistent across different pages.



So when the user is not registered/logged-in, WooCommerce doesn't start its session until the user logs in, or that he/she added a product into the cart.



But you can manually start the session, like so: (add the code to the active theme's functions.php file)



add_action( 'woocommerce_init', function(){
if ( ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
} );


And then, changes to the customer's data would then be carried on to other pages so long as cookies are enabled on the browser, because just like WordPress, WooCommerce stores its session ID (the user ID or an auto-generated ID/hash) in the cookies — and the session ID is used to set/retrieve the session data in the database — the table name is woocommerce_sessions if without any table prefix.



Try this after starting the WooCommerce session:



$customer = WC()->customer;
// Change 'Test' if necessary - e.g. 'Something unique 123'
if ( 'Test' !== $customer->get_billing_first_name() ) {
$customer->set_billing_first_name( 'Test' );
echo 'First name added to session<br>';
} else {
echo 'First name read from session<br>';
}


And this one — you should see a new date on each page load: (well, the one you've set previously)



echo WC()->session->get( 'test', 'None set' ) . '<br>';
WC()->session->set( 'test', current_time( 'mysql' ) );
echo WC()->session->get( 'test', 'It can't be empty' );





share|improve this answer























  • You are my hero today. I would seriously pay you to answer my questions about WP. So many gaps in my knowledge...
    – Randy Hall
    Nov 13 at 2:23






  • 1




    Well, I always learned from people's code, and eventually became better in time. And I'm sure you too can. :) But hey, I also still have gaps in my knowledge because nobody is perfect... xD And you can always ask your question on Stack Overflow - or for WordPress-specific like creating custom WordPress REST API endpoints, then you should ask it on WordPress Stack Exchange. (Note though, WooCommerce questions are off-topic there..)
    – Sally CJ
    Nov 13 at 10:06












  • Been stuck on this one for days, you seem like you understand the bones much better than I do stackoverflow.com/questions/53362482/…
    – Randy Hall
    Nov 20 at 14:42






  • 1




    Sorry Randy, I forgot about that question, and by the time I wanted to answer it, you've already posted an answer, so I +1 it and I'm sure all is good now. :)
    – Sally CJ
    Nov 23 at 8:34















up vote
2
down vote



accepted
+50










If $customer->save() doesn't persist the changes you made to the customer's data (e.g. $customer->set_billing_first_name('Test')), then it's likely because the customer is not registered to the site or not logged-in, where $customer->get_id() is 0.



And that is normal because the user's ID or the session's ID is required in order to properly save the changes and make it persistent across different pages.



So when the user is not registered/logged-in, WooCommerce doesn't start its session until the user logs in, or that he/she added a product into the cart.



But you can manually start the session, like so: (add the code to the active theme's functions.php file)



add_action( 'woocommerce_init', function(){
if ( ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
} );


And then, changes to the customer's data would then be carried on to other pages so long as cookies are enabled on the browser, because just like WordPress, WooCommerce stores its session ID (the user ID or an auto-generated ID/hash) in the cookies — and the session ID is used to set/retrieve the session data in the database — the table name is woocommerce_sessions if without any table prefix.



Try this after starting the WooCommerce session:



$customer = WC()->customer;
// Change 'Test' if necessary - e.g. 'Something unique 123'
if ( 'Test' !== $customer->get_billing_first_name() ) {
$customer->set_billing_first_name( 'Test' );
echo 'First name added to session<br>';
} else {
echo 'First name read from session<br>';
}


And this one — you should see a new date on each page load: (well, the one you've set previously)



echo WC()->session->get( 'test', 'None set' ) . '<br>';
WC()->session->set( 'test', current_time( 'mysql' ) );
echo WC()->session->get( 'test', 'It can't be empty' );





share|improve this answer























  • You are my hero today. I would seriously pay you to answer my questions about WP. So many gaps in my knowledge...
    – Randy Hall
    Nov 13 at 2:23






  • 1




    Well, I always learned from people's code, and eventually became better in time. And I'm sure you too can. :) But hey, I also still have gaps in my knowledge because nobody is perfect... xD And you can always ask your question on Stack Overflow - or for WordPress-specific like creating custom WordPress REST API endpoints, then you should ask it on WordPress Stack Exchange. (Note though, WooCommerce questions are off-topic there..)
    – Sally CJ
    Nov 13 at 10:06












  • Been stuck on this one for days, you seem like you understand the bones much better than I do stackoverflow.com/questions/53362482/…
    – Randy Hall
    Nov 20 at 14:42






  • 1




    Sorry Randy, I forgot about that question, and by the time I wanted to answer it, you've already posted an answer, so I +1 it and I'm sure all is good now. :)
    – Sally CJ
    Nov 23 at 8:34













up vote
2
down vote



accepted
+50







up vote
2
down vote



accepted
+50




+50




If $customer->save() doesn't persist the changes you made to the customer's data (e.g. $customer->set_billing_first_name('Test')), then it's likely because the customer is not registered to the site or not logged-in, where $customer->get_id() is 0.



And that is normal because the user's ID or the session's ID is required in order to properly save the changes and make it persistent across different pages.



So when the user is not registered/logged-in, WooCommerce doesn't start its session until the user logs in, or that he/she added a product into the cart.



But you can manually start the session, like so: (add the code to the active theme's functions.php file)



add_action( 'woocommerce_init', function(){
if ( ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
} );


And then, changes to the customer's data would then be carried on to other pages so long as cookies are enabled on the browser, because just like WordPress, WooCommerce stores its session ID (the user ID or an auto-generated ID/hash) in the cookies — and the session ID is used to set/retrieve the session data in the database — the table name is woocommerce_sessions if without any table prefix.



Try this after starting the WooCommerce session:



$customer = WC()->customer;
// Change 'Test' if necessary - e.g. 'Something unique 123'
if ( 'Test' !== $customer->get_billing_first_name() ) {
$customer->set_billing_first_name( 'Test' );
echo 'First name added to session<br>';
} else {
echo 'First name read from session<br>';
}


And this one — you should see a new date on each page load: (well, the one you've set previously)



echo WC()->session->get( 'test', 'None set' ) . '<br>';
WC()->session->set( 'test', current_time( 'mysql' ) );
echo WC()->session->get( 'test', 'It can't be empty' );





share|improve this answer














If $customer->save() doesn't persist the changes you made to the customer's data (e.g. $customer->set_billing_first_name('Test')), then it's likely because the customer is not registered to the site or not logged-in, where $customer->get_id() is 0.



And that is normal because the user's ID or the session's ID is required in order to properly save the changes and make it persistent across different pages.



So when the user is not registered/logged-in, WooCommerce doesn't start its session until the user logs in, or that he/she added a product into the cart.



But you can manually start the session, like so: (add the code to the active theme's functions.php file)



add_action( 'woocommerce_init', function(){
if ( ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
} );


And then, changes to the customer's data would then be carried on to other pages so long as cookies are enabled on the browser, because just like WordPress, WooCommerce stores its session ID (the user ID or an auto-generated ID/hash) in the cookies — and the session ID is used to set/retrieve the session data in the database — the table name is woocommerce_sessions if without any table prefix.



Try this after starting the WooCommerce session:



$customer = WC()->customer;
// Change 'Test' if necessary - e.g. 'Something unique 123'
if ( 'Test' !== $customer->get_billing_first_name() ) {
$customer->set_billing_first_name( 'Test' );
echo 'First name added to session<br>';
} else {
echo 'First name read from session<br>';
}


And this one — you should see a new date on each page load: (well, the one you've set previously)



echo WC()->session->get( 'test', 'None set' ) . '<br>';
WC()->session->set( 'test', current_time( 'mysql' ) );
echo WC()->session->get( 'test', 'It can't be empty' );






share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 12 at 10:45

























answered Nov 12 at 10:25









Sally CJ

7,2722416




7,2722416












  • You are my hero today. I would seriously pay you to answer my questions about WP. So many gaps in my knowledge...
    – Randy Hall
    Nov 13 at 2:23






  • 1




    Well, I always learned from people's code, and eventually became better in time. And I'm sure you too can. :) But hey, I also still have gaps in my knowledge because nobody is perfect... xD And you can always ask your question on Stack Overflow - or for WordPress-specific like creating custom WordPress REST API endpoints, then you should ask it on WordPress Stack Exchange. (Note though, WooCommerce questions are off-topic there..)
    – Sally CJ
    Nov 13 at 10:06












  • Been stuck on this one for days, you seem like you understand the bones much better than I do stackoverflow.com/questions/53362482/…
    – Randy Hall
    Nov 20 at 14:42






  • 1




    Sorry Randy, I forgot about that question, and by the time I wanted to answer it, you've already posted an answer, so I +1 it and I'm sure all is good now. :)
    – Sally CJ
    Nov 23 at 8:34


















  • You are my hero today. I would seriously pay you to answer my questions about WP. So many gaps in my knowledge...
    – Randy Hall
    Nov 13 at 2:23






  • 1




    Well, I always learned from people's code, and eventually became better in time. And I'm sure you too can. :) But hey, I also still have gaps in my knowledge because nobody is perfect... xD And you can always ask your question on Stack Overflow - or for WordPress-specific like creating custom WordPress REST API endpoints, then you should ask it on WordPress Stack Exchange. (Note though, WooCommerce questions are off-topic there..)
    – Sally CJ
    Nov 13 at 10:06












  • Been stuck on this one for days, you seem like you understand the bones much better than I do stackoverflow.com/questions/53362482/…
    – Randy Hall
    Nov 20 at 14:42






  • 1




    Sorry Randy, I forgot about that question, and by the time I wanted to answer it, you've already posted an answer, so I +1 it and I'm sure all is good now. :)
    – Sally CJ
    Nov 23 at 8:34
















You are my hero today. I would seriously pay you to answer my questions about WP. So many gaps in my knowledge...
– Randy Hall
Nov 13 at 2:23




You are my hero today. I would seriously pay you to answer my questions about WP. So many gaps in my knowledge...
– Randy Hall
Nov 13 at 2:23




1




1




Well, I always learned from people's code, and eventually became better in time. And I'm sure you too can. :) But hey, I also still have gaps in my knowledge because nobody is perfect... xD And you can always ask your question on Stack Overflow - or for WordPress-specific like creating custom WordPress REST API endpoints, then you should ask it on WordPress Stack Exchange. (Note though, WooCommerce questions are off-topic there..)
– Sally CJ
Nov 13 at 10:06






Well, I always learned from people's code, and eventually became better in time. And I'm sure you too can. :) But hey, I also still have gaps in my knowledge because nobody is perfect... xD And you can always ask your question on Stack Overflow - or for WordPress-specific like creating custom WordPress REST API endpoints, then you should ask it on WordPress Stack Exchange. (Note though, WooCommerce questions are off-topic there..)
– Sally CJ
Nov 13 at 10:06














Been stuck on this one for days, you seem like you understand the bones much better than I do stackoverflow.com/questions/53362482/…
– Randy Hall
Nov 20 at 14:42




Been stuck on this one for days, you seem like you understand the bones much better than I do stackoverflow.com/questions/53362482/…
– Randy Hall
Nov 20 at 14:42




1




1




Sorry Randy, I forgot about that question, and by the time I wanted to answer it, you've already posted an answer, so I +1 it and I'm sure all is good now. :)
– Sally CJ
Nov 23 at 8:34




Sorry Randy, I forgot about that question, and by the time I wanted to answer it, you've already posted an answer, so I +1 it and I'm sure all is good now. :)
– Sally CJ
Nov 23 at 8:34












up vote
0
down vote













Are you using the Url set in Wordpress? It seems that it stores the cookie based on the url configured in the app rather than the actual one.



Hope this helps.



Source: https://en.blogpascher.com/wordpress-tutorial/How-correct-the-loss-of-session-on-wordpress






share|improve this answer





















  • This is actually a local copy of my site. Do you have a quick reference for where/what settings to check?
    – Randy Hall
    Nov 11 at 0:10










  • Either in wp-config.php or in the interface under General Settings
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:12










  • Check WP_SITEURL In wp-config.php
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:14










  • Interestingly, there is no WP_SITEURL set in the wp-config.php in the root of this site. As in the property is not listed. This is a site that is hosted on wpengine and they do have some custom settings in here, but I'm uncertain if that would have any effect. But I like this train of thought, working through more now
    – Randy Hall
    Nov 11 at 0:28










  • It is also in the interface codex.wordpress.org/Changing_The_Site_URL
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:32















up vote
0
down vote













Are you using the Url set in Wordpress? It seems that it stores the cookie based on the url configured in the app rather than the actual one.



Hope this helps.



Source: https://en.blogpascher.com/wordpress-tutorial/How-correct-the-loss-of-session-on-wordpress






share|improve this answer





















  • This is actually a local copy of my site. Do you have a quick reference for where/what settings to check?
    – Randy Hall
    Nov 11 at 0:10










  • Either in wp-config.php or in the interface under General Settings
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:12










  • Check WP_SITEURL In wp-config.php
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:14










  • Interestingly, there is no WP_SITEURL set in the wp-config.php in the root of this site. As in the property is not listed. This is a site that is hosted on wpengine and they do have some custom settings in here, but I'm uncertain if that would have any effect. But I like this train of thought, working through more now
    – Randy Hall
    Nov 11 at 0:28










  • It is also in the interface codex.wordpress.org/Changing_The_Site_URL
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:32













up vote
0
down vote










up vote
0
down vote









Are you using the Url set in Wordpress? It seems that it stores the cookie based on the url configured in the app rather than the actual one.



Hope this helps.



Source: https://en.blogpascher.com/wordpress-tutorial/How-correct-the-loss-of-session-on-wordpress






share|improve this answer












Are you using the Url set in Wordpress? It seems that it stores the cookie based on the url configured in the app rather than the actual one.



Hope this helps.



Source: https://en.blogpascher.com/wordpress-tutorial/How-correct-the-loss-of-session-on-wordpress







share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 11 at 0:08









Andrei Dumitrescu-Tudor

1798




1798












  • This is actually a local copy of my site. Do you have a quick reference for where/what settings to check?
    – Randy Hall
    Nov 11 at 0:10










  • Either in wp-config.php or in the interface under General Settings
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:12










  • Check WP_SITEURL In wp-config.php
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:14










  • Interestingly, there is no WP_SITEURL set in the wp-config.php in the root of this site. As in the property is not listed. This is a site that is hosted on wpengine and they do have some custom settings in here, but I'm uncertain if that would have any effect. But I like this train of thought, working through more now
    – Randy Hall
    Nov 11 at 0:28










  • It is also in the interface codex.wordpress.org/Changing_The_Site_URL
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:32


















  • This is actually a local copy of my site. Do you have a quick reference for where/what settings to check?
    – Randy Hall
    Nov 11 at 0:10










  • Either in wp-config.php or in the interface under General Settings
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:12










  • Check WP_SITEURL In wp-config.php
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:14










  • Interestingly, there is no WP_SITEURL set in the wp-config.php in the root of this site. As in the property is not listed. This is a site that is hosted on wpengine and they do have some custom settings in here, but I'm uncertain if that would have any effect. But I like this train of thought, working through more now
    – Randy Hall
    Nov 11 at 0:28










  • It is also in the interface codex.wordpress.org/Changing_The_Site_URL
    – Andrei Dumitrescu-Tudor
    Nov 11 at 0:32
















This is actually a local copy of my site. Do you have a quick reference for where/what settings to check?
– Randy Hall
Nov 11 at 0:10




This is actually a local copy of my site. Do you have a quick reference for where/what settings to check?
– Randy Hall
Nov 11 at 0:10












Either in wp-config.php or in the interface under General Settings
– Andrei Dumitrescu-Tudor
Nov 11 at 0:12




Either in wp-config.php or in the interface under General Settings
– Andrei Dumitrescu-Tudor
Nov 11 at 0:12












Check WP_SITEURL In wp-config.php
– Andrei Dumitrescu-Tudor
Nov 11 at 0:14




Check WP_SITEURL In wp-config.php
– Andrei Dumitrescu-Tudor
Nov 11 at 0:14












Interestingly, there is no WP_SITEURL set in the wp-config.php in the root of this site. As in the property is not listed. This is a site that is hosted on wpengine and they do have some custom settings in here, but I'm uncertain if that would have any effect. But I like this train of thought, working through more now
– Randy Hall
Nov 11 at 0:28




Interestingly, there is no WP_SITEURL set in the wp-config.php in the root of this site. As in the property is not listed. This is a site that is hosted on wpengine and they do have some custom settings in here, but I'm uncertain if that would have any effect. But I like this train of thought, working through more now
– Randy Hall
Nov 11 at 0:28












It is also in the interface codex.wordpress.org/Changing_The_Site_URL
– Andrei Dumitrescu-Tudor
Nov 11 at 0:32




It is also in the interface codex.wordpress.org/Changing_The_Site_URL
– Andrei Dumitrescu-Tudor
Nov 11 at 0:32


















 

draft saved


draft discarded



















































 


draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53201243%2fwordpress-wc-session-not-carried-to-next-page%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Florida Star v. B. J. F.

Danny Elfman

Retrieve a Users Dashboard in Tumblr with R and TumblR. Oauth Issues