WordPress 设置的cookie首次加载不生效 需浏览器刷新才显示如何解决
问题根因
setcookie() 仅会将Cookie信息写入当前请求的HTTP响应头中,让浏览器后续请求时携带。而PHP全局变量$_COOKIE读取的是当前请求发起时浏览器主动携带的Cookie值,所以本次请求中刚设置的Cookie不会立刻出现在$_COOKIE里,只有下次浏览器发起请求(也就是手动刷新后)才能读到。
可行解决方案
方案1:设置Cookie时同步填充$_COOKIE全局变量
修改你functions.php里的Cookie设置代码,在调用setcookie之后手动给$_COOKIE赋值,让当前请求周期内就能读到值:
function action_init() { $path = parse_url( get_option('siteurl'), PHP_URL_PATH ); $host = parse_url( get_option('siteurl'), PHP_URL_HOST ); $expiry = time() + 36000; $origin = isset($_GET['origin']) ? $_GET['origin'] : null; if( $origin != null ) { setcookie( 'origin', $origin, $expiry, $path, $host ); // 新增下面这行,手动填充全局变量,当前请求直接可用 $_COOKIE['origin'] = $origin; } } add_action( 'init', 'action_init' );
这个方案改动最小,不需要调整搜索结果页的代码即可生效。
方案2:搜索结果页优先读取GET参数
因为表单是用GET方法提交的,跳转到搜索结果页时origin参数会直接出现在URL里,你可以调整搜索结果页的取值逻辑,优先读GET参数,参数不存在时再读Cookie,兼容首次加载和后续刷新的场景:
// 优先取GET参数,没有再读Cookie $origin = isset($_GET['origin']) ? $_GET['origin'] : (isset($_COOKIE['origin']) ? $_COOKIE['origin'] : ''); echo $origin;
这个方案兼容性更好,就算用户禁用Cookie也能正常展示首次提交的地址。
额外注意事项
如果修改后还是有问题,检查setcookie的参数配置:
- 如果你的站点启用了HTTPS,需要在
setcookie的参数里加上$secure = true,否则部分浏览器会拒绝保存Cookie - 确认
$host参数和你站点访问的域名完全一致,如果站点带www前缀但解析出来的$host不带,会导致Cookie作用域不匹配,浏览器不会携带
内容的提问来源于stack exchange,提问作者Eric Brockman
相关产品推荐
相关产品推荐

