首页 > 解决方案 > 仅在前端检查 WC()->session->has_session() 而不是在 Rest-API 上检查

问题描述

由于我想使用我的插件将商品添加到 woocommerce 购物车中,因此我需要确保已设置会话 cookie,并在尚未设置时设置 cookie。

这段代码非常适合前端:

add_action('woocommerce_init', 'force_non_logged_user_wc_session');

function force_non_logged_user_wc_session()
{

if (is_user_logged_in() || is_admin())
    return;

    if (!WC()->session->has_session()) {
    WC()->session->set_customer_session_cookie(true);
    }

}

不幸的是,我所有的 REST-API 回调都不再为客人工作(REST-API 由 javascript 调用,不需要 WC 会话)但返回以下消息:

致命错误:未捕获的错误:在 C:\Users....\wp-content\plugins........php:318 中调用一个成员函数 has_session() on null

问题的原因很可能是 WC 仅在前端页面上加载 Session 处理程序。对于我的需求,这就足够了,但我不知道如何只在前端设置 cookie。我只能在标头中设置 cookie,但是我怎么知道这是来自前端还是 REST API 的请求?

我尝试使用以下检查来处理检查: if(did_action( 'wp_loaded' )) 并且我尝试将操作添加到其他操作挂钩: wp_loadedinit

标签: phpwordpresswoocommerce

解决方案


我刚刚通过以下修复解决了这个问题:我只是检查对象会话是否存在于 WC()

function force_non_logged_user_wc_session()
{
    if (is_user_logged_in() || is_admin())
        return;
    if (isset(WC()->session)) {
        if (!WC()->session->has_session()) {
            WC()->session->set_customer_session_cookie(true);
       }
    }
}

这似乎没有任何问题


推荐阅读