How to get cookie value?

时间:2020-04-25 作者:RFL

关于如何set wp/wc上的Cookie,但我找不到如何正确获取这些Cookie,我在init 这样的功能;

add_action(\'init\', function () {
    $utm_source = get_request_parameter(\'utm_source\');
    if (!empty($utm_source)) {
        wc_setcookie(DEFAULT_COOKIE_KEY, $utm_source, DEFAULT_COOKIE_EXPIRATION);
    }
});
cookie设置正确(我在浏览器的cookie选项上看到),但当我尝试在另一个浏览器上获取此cookie值时filter 钥匙不存在。

function my_custom_price($price, $product) {
    $cookie = isset($_COOKIE[DEFAULT_COOKIE_KEY]) ? $_COOKIE[DEFAULT_COOKIE_KEY] : "";
    // $cookie is always empty string
}
add_filter(\'woocommerce_product_get_price\', \'my_custom_price\', 10, 2);
这与过滤器和挂钩的调用顺序有关吗?如何设置cookie并从另一个筛选操作获取值?

2 个回复
最合适的回答,由SO网友:RFL 整理而成

问题是:

我需要在$_COOKIE 当页面启动时(初始化操作),但$_COOKIE 仅在客户端刷新其页面后可用。

为此,我创建了singleton 类来保存init 操作和我的自定义filter 行动

class GenericCookieHandler
{
    const DEFAULT_COOKIE_KEY = \'KEY\';
    private static $instance;
    private $value;

    public static function getInstance()
    {
        if (self::$instance == null) {
            self::$instance = new self;
        }

        return self::$instance;
    }

    public function set($value, $expiration)
    {
        wc_setcookie(self::DEFAULT_COOKIE_KEY, $value, $expiration);
        $this->value = $value;
    }

    public function get()
    {
        if (!isset($_COOKIE[self::DEFAULT_COOKIE_KEY])) {
            return $this->value;
        }

        return $_COOKIE[self::DEFAULT_COOKIE_KEY];
    }
}
有了这个,我就可以开始上课了init 然后在我的filter 检索已定义的值。

初始化操作:

add_action(\'init\', function () {
    $cookieHandler = GenericCookieHandler::getInstance();
    $cookieHandler->set(
        \'my_value\',
        strtotime(\'+20 minutes\')
    );
});
筛选器操作:

function my_custom_price_filter($price, $product){
    $handler = GenericCookieHandler::getInstance();
    echo $handler->get(); // my_value
}
add_filter(\'woocommerce_product_get_price\', \'my_custom_price_filter\', 10, 2);

SO网友:simongcc

因为我的回复太长,不能作为评论,所以我把它作为建议的方法来写。

方法1在我的项目中,我使用ajax来设置内置php的cookiesetcookie() 函数和cookie变量$_COOKIE, 我没有将它们添加到任何钩子中并驻留在自己的类中,任何调用操作都是从其他地方调用类和/或方法。因此,ajax调用可以随时获取cookie值,因为每个调用都是加载到ajax的新页面。

关于ajax,您可以参考[这篇文章](How to get dynamically custom post type that are under a certain category) 我已经创建了一个ajax示例。您可以参考Ajax handbook

方法2您可以考虑为用户创建一个自定义meta\\u键来存储您选择的临时值,您可以设置一个简单的数组或变量。请注意,在存储到MySQL数据库之前,阵列需要先序列化。数组结构尽可能简单,因为即使序列化也更容易处理。

所以你可以get_user_meta function 获取值的步骤

方法3

如果方法1有效,但不足以进行页到页的转换,则可以将方法1和方法2组合在一起。例如,如果可用,您可以从用户meta获取cookie的值。(如果发生浏览器关闭等意外事件。)因此,用户仍可以使用以前的值,而无需重新开始。

专业人士

当您可以随时获取元数据时,可以将其保存

相关推荐

Cookies in template

我需要根据cookies只显示一次页面的某些部分。主要问题是我只能在插件中设置cookie,挂起init操作。我已经读了20页的谷歌,这个网站,问了2个论坛,但我仍然有这个问题。任何帮助都将不胜感激!