仅在前端检查 WC()->session->has_session(),而不在 Rest-API 上检查

raf*_*ael 3 php wordpress woocommerce

由于我想使用我的插件将项目添加到 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);
    }
Run Code Online (Sandbox Code Playgroud)

}

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

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

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

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

raf*_*ael 8

我刚刚通过以下修复解决了问题:我只是检查 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);
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作没有任何问题