由于我想使用插件将商品添加到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会话),但返回以下消息:
致命错误:未捕获的错误:调用成员函数 has_session()在null中 C:\ Users .... \ wp-content \ plugins ........ php:318
该问题的原因很可能是WC仅在前端页面上加载了会话处理程序。就我的需求而言,这足够了,但是我不知道如何仅在前端设置cookie。我只能在标题中设置cookie,但是我怎么知道这是前端还是REST API的请求?
我尝试通过以下检查处理该检查:
if(did_action( 'wp_loaded' ))
我试图将动作添加到其他动作挂钩:
wp_loaded
和init
答案 0 :(得分:0)
我刚刚通过以下修复解决了问题:我只是检查对象会话是否存在于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);
}
}
}
这似乎没有任何问题