Как сделать так, чтобы мой плагин загружался до вывода заголовков для редиректа в WordPress?
Я написал код для защиты файлов клиентов и добавил его в functions.php WordPress. Однако при обновлениях мои изменения перезаписываются.
Поэтому я хотел создать плагин, но получаю ошибку:
PHP Warning: Cannot modify header information - headers already sent by...
Мне нужно выполнить код ДО того, как WordPress отправит заголовки. Как это сделать?
Спасибо, Ричард
Обновление. Вот код (теги изменены, но суть та же):
<?php
/*
* Plugin Name: Мой WP Плагин
* Plugin URI: http://www.example.com/plugins
* Description: Мой плагин
* Version: 1.0
* Author: Мое имя
* Author URI: http://www.example.com/
*/
function somebit_init() {
$_permaStruc = get_option('permalink_structure');
if($_permaStruc != "") {
if($_GET['dl']) {
header("Location: http://google.com");
exit;
} else if($_GET['download']) {
header("Location: http://google.com");
exit;
}
}
}
add_action('init', 'somebit_init');
?>
Я всё ещё получаю ошибку "PHP Warning: Cannot modify header information - headers already sent by...".
В чём может быть причина? Возможно, я что-то упускаю.
Ричард
Правильным хуком для использования является template_redirect
, который позволяет вам иметь необходимую информацию для проверок и в то же время срабатывает достаточно рано, чтобы выполнить переадресацию. Как показано в примере на странице кодекса:
function my_page_template_redirect()
{
if( is_page( 'goodies' ) && ! is_user_logged_in() )
{
wp_redirect( home_url( '/signup/' ) );
exit();
}
}
add_action( 'template_redirect', 'my_page_template_redirect' );
Страница кодекса здесь - template_redirect

Как насчет использования этого действия? Ссылка на Codex - действие send_headers
add_action( 'send_headers', 'add_redirect_header' );
function add_redirect_header() {
header( 'Location: http://www.google.com' );
}

используйте add_action('init', 'ваша_функция');
или любой другой хуки действий до отправки заголовков: http://codex.wordpress.org/Plugin_API/Action_Reference

template_redirect
можно использовать, если функция, обрабатывающая перенаправление, зависит от загруженного WordPress

@karpstrucking Я попробовал это, та же ошибка. "PHP Warning: Cannot modify header information - headers already sent by..." в файлах, которые, по словам ошибки, уже отправили заголовки, это код из моего оригинального поста... но я вообще не начинал отправку заголовков.

когда появляется эта ошибка, при попытке активировать плагин? можете опубликовать полный текст ошибки, включая информацию о путях к файлам

Ошибка появляется в логе. На сайте WordPress я получаю пустую страницу. Ничего.
Вот полная строка ошибки, только имя пользователя в пути было изменено...
code
"[13-Jan-2015 19:16:35 UTC] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/username/public_html/hvac/wp-content/plugins/My-Security-Plugin/my_security_security.php:1) in /home/username/public_html/hvac/wp-includes/pluggable.php on line 876"code

Ваши проверки if($_GET['dl'])
и else if($_GET['download'])
вызывают ошибки Undefined index:
, и это, похоже, вызывает проблемы с заголовками в вашем плагине My Security Plugin.
Попробуйте изменить код на:
function somebit_init() {
$_permaStruc = get_option('permalink_structure');
if($_permaStruc != "") {
if( !empty($_GET['dl'])) {
header("Location: http://google.com");
exit;
} else if( !empty($_GET['download'])) {
header("Location: http://google.com");
exit;
}
}
}

Это функция, которую я использовал для проверки, пытается ли незалогиненный пользователь войти напрямую в пользовательскую страницу (только для пользователей). Она проверяет, попал ли кто-то на определенную страницу.
Также делает вторую проверку, созданы ли основные куки (полезно для избежания ошибок undefined index).
function validate_sesion() {
if ((is_page('something'))||(is_singular('something'))) {
if (!is_user_logged_in()) {
wp_redirect(home_url('log-out'));
exit();
} elseif ((empty($_COOKIE["user_id"])) || (empty($_COOKIE["user_role"]))) {
if (is_user_logged_in()) {
wp_redirect(home_url('log-out'));
exit();
}
}
}
Как и в других ответах, я использовал хук 'template_redirect'
add_action('template_redirect', 'validate_sesion');
Надеюсь, это поможет кому-то.
