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

时间:2019-05-26 13:44:58

标签: 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);
    }

}

不幸的是,我的所有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_loadedinit

1 个答案:

答案 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);
       }
    }
}

这似乎没有任何问题