Setcookie可以在管理员上运行,但不能在前端运行

时间:2014-03-20 作者:Jeremiah Prummer

我有一个简单的函数,可以将cookie设置为附加的任何参数的值。例如,如果我访问http://example.com/?devsource=http://dev.example.com/ 它应该将devsourceurl cookie的值设置为http://dev.example.com/

这个函数在WordPress管理中工作得很好,但我无法让它在前端工作。我甚至试着检查邮件头是否已经在init操作中发送了,但没有。有什么想法会导致这种情况吗?代码如下:

function set_devsource_cookie() {
    if ($_GET[\'devsource\']) {
        $value = $_GET[\'devsource\'];
        setcookie("devsourceurl", $value, time()+3600, COOKIEPATH, COOKIE_DOMAIN, false );
        echo $_COOKIE["devsourceurl"]; /* echo cookie if set */
    }
}
add_action(\'init\', \'set_devsource_cookie\', 0);
谢谢你的帮助!

1 个回复
SO网友:gmazzap

有关Cookie的一些非WordPress特定内容:

如果在页面中完成了某些输出,则设置cookie失败,您无法在设置cookie值的同一请求中访问cookie值(正如@Milo在对OP的评论中指出的那样)/ul>另一个一般规则最好使用filter_inputfilter_intput_array 而不是直接访问$_GET$_COOKIE.

作为我所说的第一件事的直接结果(如果某些输出失败,设置cookie)是尽快使用se cookie更好,在WordPress中,即使“init”很早,如果您正在编写一个可以使用的插件,也有更早的钩子\'plugin_loaded\' 如果你正在开发一个主题,你可以使用\'after_setup_theme\'.

function set_devsource_cookie() {
  global $devsource;
  $get = filter_input( INPUT_GET, \'devsource\', FILTER_SANITIZE_STRING );
  if ( ! empty( $get ) ) {
    $devsource = $get;
    setcookie( \'devsourceurl\', $devsource, time() + 3600, COOKIEPATH, COOKIE_DOMAIN, false );
  } else {
    $cookie = filter_input( INPUT_COOKIE, \'devsourceurl\', FILTER_SANITIZE_STRING );
    if ( ! empty( $cookie ) ) {
      $devsource = $cookie;
    }
  }
  // debug
  // die( \'---------------------\');
  // uncommenting previous line, the dashes must be the the absolutely first line
  // if there\'s something first, even an empty line the cookie can\'t be set!
}

// prefer this on plugin
// add_action( \'plugins_loaded\', \'set_devsource_cookie\', 0 );
add_action( \'after_setup_theme\', \'set_devsource_cookie\', 0 );
现在测试是否在wp页脚上设置了该值(仅作为示例):

function test_devsource_cookie() {
  global $devsource;
  echo \'Devsource is: \';
  echo ! empty( $devsource ) ? $devsource : \'not set.\';
  echo \'<br>Set again to random uri: \';
  $random = strtolower( wp_generate_password( 6, FALSE, FALSE ) );
  $url = add_query_arg( array(\'devsource\' => "http://dev.{$random}.com/" ) );
  echo \'<a href="\' . $url . \'">Set</a>\';
}

add_action( \'wp_footer\', \'test_devsource_cookie\' );
如果此代码不起作用,则可能会在代码运行之前在页面上输出一些内容(插件、主题),有时甚至在<?php 如果无法设置cookie,请参阅my中的注释行set_devsource_cookie 作用

如果您在页面上看到一些输出,请禁用所有插件并使用默认主题,将我的代码放入插件并仅激活它:代码应该可以工作。

之后,逐个重新启用主题和插件,以找到罪魁祸首。

最后一个提示:当您需要将url作为参数传递给url时,请确保使用urlencode, 我在我的test_devsource_cookie 作用

结束

相关推荐

Cookies in template

我需要根据cookies只显示一次页面的某些部分。主要问题是我只能在插件中设置cookie,挂起init操作。我已经读了20页的谷歌,这个网站,问了2个论坛,但我仍然有这个问题。任何帮助都将不胜感激!