Как исправить ошибку Cannot modify header information в Wordpress?
При попытке сделать редирект в кастомном плагине получаю ошибку.
Проверил все файлы, перед тегом <?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';
}
}
Что еще может быть причиной? И как исправить, кроме ob_start() на init?
Ответы (1 шт):
Автор решения: KAGG Design
→ Ссылка
add_admin_page ничего не делает, а просто добавляет меню во внутренние структуры. Не вызывает ваш callback, а добавляет add_action( $hookname, $callback );.
Существенно позже, когда уже половина страницы админки выведена и дошла очередь до вашего меню, срабатывает do_action с вашим callback. Естественно, вы получаете описанный в вопросе результат.
Логика неправильная. callback в меню вообще не для редиректа.