Как сделать так, чтобы мой плагин загружался до вывода заголовков для редиректа в WordPress?

13 янв. 2015 г., 20:50:07
Просмотры: 17.2K
Голосов: 5

Я написал код для защиты файлов клиентов и добавил его в 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...".

В чём может быть причина? Возможно, я что-то упускаю.

Ричард

14
Комментарии

Как вы вызываете свой код? К какому действию/фильтру вы подключаетесь?

czerspalace czerspalace
13 янв. 2015 г. 20:55:56

@czerspalace, я обновил пост выше, теперь там показан весь код, который я только что обновил, но ошибка все еще возникает.

Richard Richard
13 янв. 2015 г. 21:08:19

Самое странное, что даже если я просто ставлю проверку и не выполняю никаких действий внутри if, я все равно получаю ошибку "headers already sent". Но если я ничего не вывожу на страницу, не пытаюсь установить заголовок или сделать редирект, почему возникает эта ошибка? Я не понимаю.

Richard Richard
13 янв. 2015 г. 21:15:24

Теперь я ТОЛЬКО добавил функцию:

code function somebit_init() {/ Ничего не делать / } add_action('template_redirect', 'somebit_init'); code и я всё равно получаю ошибку.

Richard Richard
13 янв. 2015 г. 21:17:01

Что если удалить ?>, который идет после add_action

czerspalace czerspalace
13 янв. 2015 г. 21:38:16

@czerspalace это загрузило страницу, но код, кажется, не выполняется... разве ?> не должен быть там для обработки PHP?

Richard Richard
13 янв. 2015 г. 21:42:06

@czerspalace, хорошо, я добавил тестовый код, он выполняется внутри условия if, но если я помещу туда редирект, то всё равно получаю эту ошибку: 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_securit‌​y_security.php:1) in /home/username/public_html/hvac/wp-includes/pluggable.php on line 876. Не понимаю почему. Если код выполняется с хуком init, то он должен выполняться до отправки заголовков, верно?

Richard Richard
13 янв. 2015 г. 21:53:55

@czerspalace, на самом деле эта ошибка появляется даже если я просто вывожу сообщение типа "здесь нечего смотреть"... и затем завершаю работу WordPress. Я всё равно вижу ошибку о невозможности изменить заголовки. Но что пытается изменить заголовки? Ведь хук init выполняется до их отправки?

Richard Richard
13 янв. 2015 г. 21:58:20

Если посмотреть в Codex, там рекомендуется удалять закрывающий тег PHP. Что произойдёт, если ты удалишь ?> и затем выполнишь echo? Или ты уже пробовал это?

czerspalace czerspalace
13 янв. 2015 г. 22:31:05

Я удалил его, но это не исправило проблему. В логе ошибок по-прежнему появляется сообщение об ошибке, которое я вам показывал выше, о невозможности изменить заголовки, хотя ничего не пытается их изменять.

Richard Richard
13 янв. 2015 г. 23:44:12

У вас есть другие активные плагины? Если да, пробовали ли вы их отключить, чтобы проверить, не они ли вызывают проблему?

czerspalace czerspalace
13 янв. 2015 г. 23:53:00

@czerspalace, других плагинов не активировано. Я тестирую это на сайте, который еще не настроен, это демо-сайт... так что я могу экспериментировать, и пока неважно, если что-то сломано, так как я его еще не настраиваю и никому не показываю... Не понимаю, почему это происходит.

Richard Richard
14 янв. 2015 г. 00:01:01

В файле functions.php вашей темы также есть закрывающий тег ?>, и если да, то что произойдет, если вы его удалите и попробуете ваш код?

czerspalace czerspalace
14 янв. 2015 г. 02:46:19

Есть ли причина, по которой вы хотите использовать header redirect вместо wp_redirect?

juz juz
15 апр. 2016 г. 14:10:42
Показать остальные 9 комментариев
Все ответы на вопрос 6
0

Правильным хуком для использования является 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

28 окт. 2016 г. 16:37:17
1

Как насчет использования этого действия? Ссылка на Codex - действие send_headers

add_action( 'send_headers', 'add_redirect_header' );
function add_redirect_header() {
    header( 'Location: http://www.google.com' );
}
15 апр. 2016 г. 14:13:09
Комментарии

лучше использовать хук wp_headers, чтобы можно было изменять заголовки перед отправкой с помощью функции WordPress wp_redirect()

frizzant frizzant
26 сент. 2023 г. 14:45:06
5

используйте add_action('init', 'ваша_функция');

или любой другой хуки действий до отправки заголовков: http://codex.wordpress.org/Plugin_API/Action_Reference

13 янв. 2015 г. 20:57:00
Комментарии

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

karpstrucking karpstrucking
13 янв. 2015 г. 21:01:02

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

Richard Richard
13 янв. 2015 г. 21:11:50

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

karpstrucking karpstrucking
13 янв. 2015 г. 21:13:41

Ошибка появляется в логе. На сайте 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

Richard Richard
13 янв. 2015 г. 21:23:33

Плагин активирован. При активации действительно было сообщение о 3 неожиданных символах на выходе, но он остался активным, ошибок не было и страница загружалась, однако ошибка возникает, когда я добавляю dl=filename.zip или любой параметр с ?dl= в URL.

Richard Richard
13 янв. 2015 г. 21:24:16
0

Ваши проверки 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;
        }
    }
}
14 янв. 2015 г. 05:54:45
0

Это функция, которую я использовал для проверки, пытается ли незалогиненный пользователь войти напрямую в пользовательскую страницу (только для пользователей). Она проверяет, попал ли кто-то на определенную страницу.

Также делает вторую проверку, созданы ли основные куки (полезно для избежания ошибок 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');

Надеюсь, это поможет кому-то.

22 мая 2019 г. 13:52:43
0

Подключиться к хуку headers

add_action( 'wp_headers', [ $this, 'forward_to_login' ] );

/**
 * @return void
 */
function forward_to_login() {
    wp_redirect( 'www.example.com' );
}

Просто и чисто.

26 сент. 2023 г. 14:49:24