WordPress后台开发遇到headers already sent警告的解决办法
关于headersalreadysent问题的解决
我在开发WordPress后台程序的时候,遇到了headersalreadysent的问题。经过一番调查和研究,我发现这个问题通常是由我们在PHP发送了HTTPheader之后,又使用wp_redirect函数来跳转页面所致。因为wp_redirect函数也是通过发送HTTPHeader给浏览器来实现的页面跳转。
headersalreadysent问题产生的原因
我们都知道,在同一个http请求中,只能发送一个httphead给浏览器。因此,如果先发送了HTTPheader,那么wp_redirect函数再发送HTTPHeader请求给浏览器,浏览器肯定是收不到了。在HTTP协议中,发出去的请求就像泼出去的水,是无法修改的。因此,为了让我们及时发现这个问题,进而解决这个问题,PHP运行时就会警告我们说这里有问题,让我们检查。
请注意,这个问题并不致命,只会导致一部分程序无效。因此,即便我们不解决这个问题,直接关掉警告显示也是可以的。但是作为一个负责人的程序员,即便是警告级别的错误,我们也要给他解决掉,确保程序能准确执行。
怎么解决headersalreadysent的问题
为了使用页面跳转,我们只能提前发送header请求给浏览器。下面是一段例子代码,这段代码挂载到了admin_inithook上,在WordPress管理界面初始化后执行。代码主要的作用是判断当前页面和操作类型。如果操作类型满足一定条件,就执行一些数据处理和跳转操作。
add_action('admin_init', function() {
if(isset($_GET['page']) && $_GET['page'] === 'list_serial' && isset($_GET['action']) && $_GET['action'] === 'delete') {
$ids = isset($_GET['serial']) ? (array)$_GET['serial'] : [];
$sendback = remove_query_arg(['trashed', 'untrashed', 'deleted', 'locked', 'ids'], wp_get_referer());
wp_redirect(add_query_arg(['trashed' => count($ids), 'ids' => join('_',(array)$ids), 'locked' => 1], $sendback));
exit;
}
});
这段代码是从一个使用WP_List_Table类创建的页面中摘出来的。它是从列出中删除某些数据后,再跳转回数据列表页面然后显示删除成功的一个操作。当WP_List_Table执行的时候,页面已经初始化了。再执行删除操作的时候,HTTPheader肯定已经发送了,如果在这个类中实现删除后跳转的操作,就会遇到headersalreadysent的警告。因此,我们需要跳出这个类,在页面初始化之前就来判断页面的操作以及是否需要跳转。
如果遇到类似的问题,在WordPress前台中也可以参考上面的代码来解决问题。只需要把admin_inithook换成前台页面初始化的hook即可。
-
如何创建WordPress古腾堡编辑器的区块(PHP+原生JS) 2024-01-10 01:01:06
-
搭建一个WordPress网站需要多少成本 2023-11-06 00:09:51
-
Symlink介绍(附:如何使用Symlink进行WordPress开发) 2023-11-05 23:38:32
-
让WordPress实现数据库同步的插件:HyperDB 2023-10-24 23:40:49
-
allegro电商平台值得做吗(附:2023年Allegro注册流程指南) 2023-10-08 21:53:39
-
印度跨境电商平台有哪些(附:印度跨境电商做什么产品好) 2023-10-08 21:34:23
-
跨境电商必看的几大海外二手电商平台 2023-10-08 18:04:42
-
WordPress同城互联网产品解决方案:UBASE 2023-10-03 16:40:39
-
WordPress网站的安全插件:wordfence 2023-09-14 09:25:18
-
WordPress 6.3 支持在手动更新插件和主题失败后回滚旧版本 2023-08-28 16:58:45