Transients can be used but you’d need to make sure they don’t expire earlier than you want.
I answered a similar question with a different goal here, but I’ve tried to keep the slightly different answer below self-contained.
Option 1 – PHP Sessions
I’ve been storing carts within a PHP session which is fine generally but does have a few problems occasionally. So while it works, I’d recommend something more robust.
My plugin code uses a Basket object. On the init
action hook I start the PHP session and if there is a serialised Basket object in the session I unserialise it into a global, otherwise I instantiate a new Basket into the global.
On the shutdown
hook I serialise my object into the session.
function setup_session() {
global $Basket;
session_start();
if (isset($_SESSION['basket'])) {
$Basket = unserialize($_SESSION['basket']);
} else {
$Basket = new Basket();
}
$Basket->do_actions();
// my own hooks to allow me to add housekeeping code without messing with my core codde
}
function save_session() {
global $Basket;
if (isset($Basket)) {
$_SESSION['basket'] = serialize($Basket);
}
}
add_action( 'init', 'setup_session' );
add_action( 'shutdown', 'save_session' ); // works even when redirecting away from a page
This works well, but on one site I get a few empty basket problems that are probably a clash with session code for a custom login plugin.
Option 2 – Better Sessions
There’s a WP Session framework written by Eric Mann and explained well by Pippin, who uses it in his well known Easy Digital Downloads plugin, here. You use a global $wp_session exactly as you would $_SESSION but there are also helper functions for managing the sessions. This does use WP’s transients for storage, but also properly handles extending the expiration times so that your baskets don’t get cleaned up too early.
I’ll move over to this in my own sites when I’ve had a good look at how it works for myself.
We try not to send you off following other links in answers here, as they may not last, but pulling them both in here would lead to a rather lengthy answer.
Option 3 – User Logins
If you don’t require shoppers to make an account, then this approach isn’t for you unless you want to code for the concept of an anonymous user and then convert their basket to one for a logged in user as they create their account. If you do require user accounts, then this is the way to go as you can hand the session management over to WP’s built in user logins. Then on init
& shutdown
you can unserialise and serialise your basket into a user meta field, which will persist between login sessions.
While update_user_meta
will handle serialisation for you, be aware of this longstanding bug when trying to store an object.