可以使用瞬态,但您需要确保它们不会比您想要的更早过期。
我用不同的目标回答了一个类似的问题here, 但我一直试图将略有不同的答案保持在自给自足的下面。
选项1-PHP会话
我一直在PHP会话中存储Cart,这通常很好,但偶尔会出现一些问题。所以,尽管它有效,我还是推荐一些更健壮的东西。
我的插件代码使用了一个Basket对象。在init
动作挂钩我启动PHP会话,如果会话中有一个序列化的篮子对象,我将其取消序列化为全局对象,否则我将在全局对象中实例化一个新篮子。
在shutdown
钩子我将我的对象序列化到会话中。
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
这很好,但在一个网站上,我遇到了一些空的问题,可能与自定义登录插件的会话代码冲突。
选项2-更好的课程有WPSession framework written by Eric Mann Pippin解释得很好,他在著名的Easy Digital Downloads插件中使用了它,here. 您使用全局$wp\\u会话的方式与使用$\\u会话的方式完全相同,但也有用于管理会话的帮助函数。这确实使用了WP的瞬态存储,但也适当地处理了延长到期时间的问题,以便您的篮子不会过早清理干净。
我将在我自己的网站上讨论这个问题,当我仔细了解它是如何为自己工作的时候。
我们尽量不在这里发送以下其他链接,因为它们可能不会持续很久,但将它们都放在这里将导致一个相当长的答案。
选项3-用户登录如果您不要求购物者创建帐户,则此方法不适用于您,除非您想对匿名用户的概念进行编码,然后在登录用户创建帐户时将其购物篮转换为登录用户的购物篮。如果您确实需要用户帐户,那么这是一种方式,因为您可以将会话管理移交给WP的内置用户登录。然后开始init
&;shutdown
您可以取消序列化篮子并将其序列化到用户元字段中,该字段将在登录会话之间保持不变。
虽然update_user_meta
将为您处理序列化,请注意this longstanding bug 尝试存储对象时。