【问题标题】:How does WooCommerce solve the HTTP headers already sent issue?WooCommerce 如何解决 HTTP 标头已发送问题?
【发布时间】:2019-11-08 06:01:47
【问题描述】:

所以我有一个基本的 wordpress 插件,它在管理端有一个表单。表单通过 POST 收集信息并在数据库中插入一条记录并重定向到创建的对象的编辑页面。

第 1 步:从 POST 数组中获取对象字段

第 2 步:使用 $wpdb 将代码插入数据库

第3步:如果插入成功重定向到https://example.com


if( isset($_POST['submit'])){
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];

    $result = $wpdb->insert('table', array('first_name' => $first_name, 'last_name' => $last_name), array('%s','%s'));

    if($result){
        $url = "https://example.com/";
        header("Location: $url");
        die();
    }else{
        echo "Error inserting record in table";
    }
}

现在预期的结果是页面应该重定向到https://example.com 在数据库中成功插入对象。但是我在 PHP 中得到一个 headers already sent 错误。

有趣的是,如果我在 WordPress 中安装并激活 woocommerce,错误就会消失并达到预期的输出。

我很好奇 woocommerce 是如何做到的。

【问题讨论】:

  • 您必须确保在标头/重定向之前没有输出。没有 var_dumps,没有回显,基本上,在 header 之前不应该呈现 HTML
  • 我明白这一点。我认为 Woocommerce 在激活时解决了所有这些问题。我只是想知道如何在我的插件中复制相同的内容。

标签: php wordpress redirect woocommerce http-headers


【解决方案1】:

当您使用header() 函数时,您可能会在 WP 中遇到此类警告。改用wp_redirect() 总是更好的方法:

wp_redirect( 'https://example.com/' );
exit;

更新:

  1. 必须在 WP 进行任何输出之前调用包含标头发送/修改数据(例如 wp_redirectheader() 等)的函数。也许您可以测试将您的函数和相关的钩子放在另一个与initadmin_init 动作钩子挂钩的函数中?

  2. 确保您的插件文件在 PHP 开始标记 (<?php) 之前没有任何空格或字符串

【讨论】:

  • 嗨 Yashar,我试过了,但我仍然收到标头已发送错误。
  • 你能发布一个更完整的代码版本吗?您确定此重定向会导致标头已发送错误,并且您没有在包含的文件中使用 PHP 结束标记?并请发布与此错误相关的完整调试日志。顺便说一句,欢迎来到 SO :)
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 2014-11-08
  • 2023-03-23
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多