php - 仅在前端检查 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_loaded
和init
解决方案
我刚刚通过以下修复解决了这个问题:我只是检查对象会话是否存在于 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);
}
}
}
这似乎没有任何问题
推荐阅读
- typescript - 什么设置导致 Neovim 在打字稿枚举中的格式不一致?
- python - “未定义函数名称”
- objective-c - 为什么 AudioUnit 在带闪电插头的耳机下每帧收集 940 字节
- vulkan - Vulkan 管道衍生品
- javascript - React Hooks 是否显着提高了 React Native 中移动应用程序的性能?
- delphi - 如何将 ANSI 字符串文件名转换为 windows 文件名
- java - 无法到达的语句是一种错误而不是Java中的警告?
- java - 如何修复 MathCalculationException 的异常问题?
- reactjs - ReactJS 钩子:如何在两个不同的 .js 文件中使用上下文?
- javascript - 创建单独的渲染视图