SetCookie simply not working

时间:2012-01-19 作者:Evan

我无法通过WordPress主题正确设置cookie。我将以下代码放在functions.php 我的主题页面。

function set_cookie() {
if (isset($_GET[\'id\'])) {
    $referrerID = $_GET[\'id\'];
        setcookie(\'referrerid\', $referrerID,time()+ 3600 * 24, COOKIEPATH, COOKIE_DOMAIN, false);
    }
}
add_action( \'init\', \'set_cookie\');
我甚至使用JavaScript来警告脚本是否到达了函数(它做到了)。

为什么我的cookies没有设置??(代码在本地工作-在WordPress之外)。

2 个回复
最合适的回答,由SO网友:Geert 整理而成

确保在要设置cookie的点上尚未发送HTTP标头。以下是您可以测试的方法:

function set_cookie() {
  var_dump(headers_sent()); // should be bool(false)
  ...
转向WP_DEBUG 在配置中打开。php文件在调试时也可能有帮助。

顺便说一下,你真的应该在$_GET[\'id\']. 此变量可以包含任何内容。将其转换为(正)整数应该有很大的帮助:

$referrerID = absint($_GET[\'id\']); // Note: absint() is a WP function

SO网友:Joe

另一种选择是使用PHP的ob_start();ob_end_flush();.

You can find documentation on the two functions here

我解决问题的方法是在打开和关闭html标记之前和之后调用这两个函数,如下所示:

<?php ob_start(); ?>
<!DOCTYPE html>
<html>
  <head>
  </head>
<body>
  <?php /* Wordpress loop and other tempate code here */ ?>
</body>
</html>
<?php ob_end_flush(); ?>
我遇到的问题是调用一个使用PHPsetcookie(); 由于WordPress会逐步处理页面,因此无法创建cookie,因为页面的标题已被发送。

PHP的输出缓冲函数强制在WordPress处理页面之前发送标题。

希望这有帮助。

结束