如何存储或缓存每个用户会话的定制购物车数据

时间:2016-08-02 作者:Samer Massad

我正在开发一个购物车,我不想使用任何插件,因为它们都不能满足我的需要。所以我打算创建自己的购物车。

我的问题是:如何存储用户添加到购物车中的内容?

我读到wp_cache 关于瞬态API。

他们是否足够安全?

还有其他更好的方法吗?

1 个回复
最合适的回答,由SO网友:Andy Macaulay-Brook 整理而成

可以使用瞬态,但您需要确保它们不会比您想要的更早过期。

我用不同的目标回答了一个类似的问题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 尝试存储对象时。

相关推荐

我应该在我的插件中使用wp_cache来让它更快吗?

作为一名插件开发人员,我致力于编写占用尽可能少的服务器资源的插件。这就是为什么我想避免重复对在同一请求上运行的数据库的查询(非持久性)。假设我的插件有一个函数/类,需要从选项表中检索设置(使用get_option WP核心功能)。而且我知道,稍后将运行的另一个函数/类将需要相同的值(在相同的请求/页面加载中)。我的问题是,什么更高效、更快:A) 将值存储在PHP常量中B)将值存储在PHP全局变量中C)在调用函数之间传递值D)使用WP_Cache (第一次检索时缓存它,然后在查询数据库之前检查缓存值是否存在