Отключение формы входа и перенаправление пользователей при выходе из системы без заголовков отправлено php warning

Я создал свои собственные регистрационные и регистрационные формы, поэтому мне нужен способ отключить стандартную форму входа.

Также мне нужно было перенаправить пользователя на выход в другое место, а не в форму входа.

Я придумал эту логику. Открыл wp-login.php и нашел первый крючок. Это был login_head .

Поэтому я подключился к этому, и я просто перенаправляю, если пользователь не дает секретный токен.

 function e4_login_form_disable() { if ( ! isset( $_GET['gandalf'] ) || $_GET['gandalf'] != 'thewhite' ) { wp_redirect( home_url() ); exit; } } 

Я в порядке с этим, или я что-то упустил?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: я получаю следующее предупреждение: "Warning: Cannot modify header information - headers already sent by (output started at /public_html/site/wp-login.php:63) in site/wp-includes/pluggable.php on line 1171 "

Похоже, что его можно output_buffering работать, если вы включите output_buffering в php.ini и поместите этот файл в каталог, где находится файл .php, создающий предупреждение.

Но это похоже на «взлом» …

Solutions Collecting From Web of "Отключение формы входа и перенаправление пользователей при выходе из системы без заголовков отправлено php warning"

Предупреждение, которое вы получаете, связано с тем, что вы не можете перенаправить браузер на другую страницу, как только вы уже отправили контент для текущей страницы.

Остальная часть ошибки сообщает вам точный файл, который отправляет контент, который вы еще не хотите. Вам нужно либо:

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

В вашем случае вывод поступает из wp-login.php поскольку он выводит фактическую форму входа. Это означает, что вам придется зацепиться, прежде чем это произойдет.

Я вижу, что вы здесь сделали, и это обычная ошибка: вы нашли действие login_head упомянутое ранее в этой функции (около строки 37 wp-login.php ), и попытались подключиться к нему. Дело в том, что код add_action( 'login_head', 'wp_no_robots' ); что вы видели здесь, фактически подключается к login_head ; это не действие.

Смотря дальше в wp-login.php , внутри этой же функции мы находим do_action( 'login_head' ); около строки 98 (уведомление do_action а не add_action ). Это когда ваш подключенный код фактически запущен, что, к сожалению, после выхода, уже отправленного WordPress (начало страницы входа).

Итак, нам нужно найти ранний крючок. Поскольку мы перенаправляемся, мы действительно должны идти как можно раньше, иначе мы могли бы заставить WordPress выполнять большую работу, это просто нужно будет делать снова и снова на странице, на которую мы перенаправляем. Взглянув на ссылку Action на Codex, init – довольно ранний крючок, который звучит так, как будто он может удовлетворить наши потребности.

Отлично. Попробуйте изменить функцию hooked, чтобы использовать init вместо login_head .

НО , есть еще один шаг, который нам нужно предпринять … иначе мы будем перенаправлять каждого пользователя на каждую страницу!

Внутри вашей функции вам нужно также проверить, что это страница входа в систему, которая просматривается. К сожалению, WordPress не предлагает функцию is_login_page() , поэтому мы можем сделать это с помощью быстрого оператора, который проверяет глобальную переменную pagenow :

 if($GLOBALS["pagenow"] == "wp-login.php"){ /* do redirect here */ } 

Соединяя все это вместе, вы должны теперь успешно перенаправить с страницы входа (я еще не тестировал все это!):

 function e4_login_form_disable() { if ( $GLOBALS['pagenow'] == 'wp-login.php' ){ if ( ! isset( $_GET['gandalf'] ) || $_GET['gandalf'] != 'thewhite' ) { wp_redirect( home_url() ); exit; } } } add_action('init', 'e4_login_form_disable'); 

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