由于 header,setcookie 无法使用 wordpress

setcookie not working wordpress because of header

我有一个 WordPress 插件想要创建 cookie,但它不起作用。非常感谢您的帮助。

add_shortcode( 'watchlist', 'cwatchlist_short' );
  
function cwatchlist_short() {
 echo '<div class="wrap"><center>';
echo "<form method='POST' action=''";
echo '<p>Please enter the initial of the cryptocurrency or the symbol you want to add to the watchlist!</p> <p>For example: BTC</p>';
 echo "<p><input type='text' name='symbol' placeholder='Initials or symbol'>";
 
 
   echo "<p><input type='submit' value='Submit'>";
   echo "</form></center>";
 echo '</div>';
 if (isset($_POST["symbol"])){
  $x = $_COOKIE['xvalue'] + 1;
setcookie( 'xvalue', $x, time() + 108000, COOKIEPATH, COOKIE_DOMAIN   );
调试显示:Cannot modify header information - headers already sent by 我真的需要帮助。 谢谢 最好的问候

您不能在短代码函数中设置 cookie,因为 headers 已经由 WordPress 发送。 setcookie() 定义一个 cookie 与 HTTP headers 的其余部分一起发送,所以如果你想设置一个 cookie 值,它需要在 [= 之前​​或期间添加到钩子中14=]勾.

请在文件顶部使用 ob_start(); 函数,在要使用 cookie 的代码后使用 ob_end_flush() 函数。

ob_start 函数: 打开输出缓冲。

ob_end_clean 功能: 清除缓冲区并关闭缓冲。

更多详情http://php.net/manual/en/ref.outcontrol.php

setcookie 函数无法在直接页面 运行 过程中工作,它总是抛出 header 已经设置的错误消息。
要解决此问题,必须为 setcookie 使用新函数并在初始化操作中添加此函数。

例如

add_action( 'init', 'my_setcookie_example' );
function my_setcookie_example() {
 setcookie( "name", "value", time(), "/", COOKIE_DOMAIN );
}

在你的情况下,需要删除 "setcookie( 'xvalue', $x, time() + 108000, COOKIEPATH, COOKIE_DOMAIN );" 并放入函数中,然后在其位置添加 "add_action" 挂钩。

感谢您的所有回答! OB_START 对我不起作用,也许我的代码有问题但我无法使用它。 admin post 也是解决它的好方法,但对我来说更简单的方法是少更改我的代码,我在我的函数中使用了 add_action。

add_shortcode( 'watchlist', 'cwatchlist_short' );
  add_action( 'init', 'my_setcookie_example' );
  add_action( 'init', 'my_setcookie_isset');
function my_setcookie_isset() {
if(isset($_COOKIE['xvalue'])){

} else{
setcookie ("xvalue","0",time() + 108000, COOKIEPATH, COOKIE_DOMAIN);
}
if (isset($_COOKIE['thejson'])){
} else{
setcookie ("thejson"," ",time() + 108000, COOKIEPATH, COOKIE_DOMAIN);
}
}
function my_setcookie_example() {
if (isset($_POST["symbol"])){
    
     setcookie ("thejson","1",time() + 108000, COOKIEPATH, COOKIE_DOMAIN);

所以基本上我所做的是在 header 之前添加一个新功能 运行 并检查表单是否已完成。如果 textbobx SYMBOL 已完成,那么我将设置一个 cookie。此外,我还为所有 cookie 设置了一个不重要的值,以确保在此过程中不会出现错误。 因此,如果您遇到问题,除了在短代码中设置 cookie 和检查文本框 isset 的函数。 运行 在 header!

之前使用 INIT 的函数

谢谢大家,因为这是我从你们所有的回答、想法和链接中得出的结论!

此致