我正在写一个插件,我正在设置一个cookie。当我使用php方法设置cookie时,它会显示警告。
警告:无法修改标头信息 - 已发送的标头 (输出开始于
如果我使用wordpress操作,设置cookie不起作用。我在我的主题functions.php文件中使用它,它的工作正常但不适用于插件代码。
以下是代码示例:
使用php方法
setcookie( 'sm_js_cookie', 1, time()+3600*24*100,'/');
使用wordpres操作:
function set_newuser_cookie() {
setcookie( 'sm_js_cookie', $_SERVER['REMOTE_ADDR'], time()+3600*24*100,'/');
}
add_action( 'init', 'set_newuser_cookie');
请帮我找到解决方案。
答案 0 :(得分:2)
在评论中来回反复,结果是你试图从短代码中调用setcookie
(你应该在你的问题中提到过)。
这通常不起作用,因为在解析短代码时,某些输出已发送到浏览器,因此您无法使用setcookie
函数。
您已经发现的替代方法是在setcookie
操作的回调函数中使用init
。但是,您通常可以一直挂到template_redirect
(我相信这是最后一个,或者您可以用来发送标头的最后一个操作之一)。你能说明你想要达到的目标吗?我可以给你适当的建议吗?
如果没有任何其他详细信息,我可以根据用户当前正在查看的页面/帖子上是否存在短代码,为您提供以下关于如何设置cookie的示例。
<?php
function set_newuser_cookie(){
// Check to see if we're looking at a single post, page or attachment
if ( is_singular() ) {
$_post = get_post();
// See if the content of the current post object has the shortcode
if ( has_shortcode( $_post->post_content, 'js_conditions_script' ) ) {
setcookie( 'sm_js_cookie', 1, time()+3600*24*100,'/');
}
}
}
add_action( 'template_redirect', 'set_newuser_cookie' );
我们做的是挂钩template_redirect
动作(主要的WordPress查询已经执行,所以我们知道我们正在查看哪个页面)。我们检查以确保我们查看单个帖子(包括自定义帖子类型),页面或附件,然后检查它是否包含短代码[js_conditions_script]
。如果是,我们设置cookie。