当我尝试在自定义插件中进行重定向时,出现错误。我检查了所有文件,<?php标签前没有空格,我没有输出任何数据。禁用其他插件。
wp-1 | [Thu Jul 28 11:49:13.550986 2022] [php7:warn] [pid 24] [client 172.21.0.1:38412] PHP Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/wp-admin/includes/template.php:2546) in /var/www/html/wp-includes/pluggable.php on line 1424, referer: http://localhost:8081/wp-admin/admin.php?page=kws
插件文件。
function run_countries() {
$plugin = new Plugin();
$plugin->run();
}
add_action( 'init', 'run_countries' );
class Plugin {
public function __construct() {
// ...
$this->load_dependencies();
$this->define_admin_hooks();
}
private function load_dependencies() {
require_once plugin_dir_path( __DIR__ ) . 'inc/class-plugin-loader.php';
require_once plugin_dir_path( __DIR__ ) . 'admin/class-admin.php';
$this->loader = new Plugin_Loader();
}
private function define_admin_hooks() {
$plugin_admin = new Admin( $this->get_plugin_name(), $this->get_version() );
$this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' );
$this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' );
$this->loader->add_action( 'admin_menu', $plugin_admin, 'add_admin_menu' );
}
}
if ( ! class_exists( 'Admin_Request_Handler' ) ) {
require_once plugin_dir_path( __FILE__ ) . 'inc/class-admin-request-handler.php';
}
class Admin {
public function __construct( $plugin_name, $version ) {
$this->request_handler = new Admin_Request_Handler();
}
public function add_admin_menu() {
add_menu_page(
'Domains',
'Domains',
static::CAPABILITY,
static::SLUG,
[ $this->request_handler, 'show_table' ],
);
}
}
class Admin_Request_Handler {
public function show_table() {
$table = new Domains_List_Table();
$table->process_bulk_action();
if ( ! empty( $_REQUEST['_wpnonce'] ) ) {
wp_redirect( remove_query_arg(
[
'_wp_http_referer',
'_wpnonce',
],
$_SERVER['REQUEST_URI']
) );
}
require_once plugin_dir_path( __DIR__ ) . 'partials/page-list.php';
}
}
还有什么可能的原因?以及如何修复initob_start()以外的其他问题?
add_admin_page什么都不做,只是简单地将菜单添加到内部结构中。不调用您的回调,但添加add_action( $hookname, $callback );.很久以后,当管理页面的一半已经显示并且队列到达您的菜单时,do_action 会通过您的回调触发。自然,您会得到问题中描述的结果。
逻辑是错误的。菜单中的回调根本不用于重定向。