Вопрос или проблема
Я сейчас пытаюсь защитить некоторые страницы WP, назначив им определённый шаблон.
Я создал поля ACF “Referring URL” и “Redirect URL”, так как они могут изменяться в зависимости от того, к какой странице назначен шаблон.
Какие изменения нужно внести, чтобы функциональность шаблона стала следующей:
ЕСЛИ referer не равен “referring_url”,
перенаправить на “redirect_url”
Я также хотел бы, чтобы кэширование не происходило.
Тем не менее, приведённый ниже код, размещённый сразу под get_header();
, не работает последовательно, возможно, из-за неверного форматирования, неправильного размещения в файле шаблона или проблемы с кэшем.
if ( get_field('enable_portal_protection') && !current_user_can('administrator') ) {
$referring_url = get_field('referring_url');
$redirect_url = get_field('redirect_url');
$referer = $_SERVER['HTTP_REFERER'];
$location = "Location: " . $redirect_url;
if ( $referer != $referring_url) {
header($location);
}
}
Попробуйте хук template_redirect.
function portal_protection() {
if ( get_field('enable_portal_protection') && !current_user_can('administrator') ) {
$referring_url = get_field('referring_url');
$redirect_url = get_field('redirect_url');
$referer = $_SERVER['HTTP_REFERER'];
if ( $referer != $referring_url) {
wp_redirect( $redirect_url );
exit;
}
}
}
add_action( 'template_redirect', 'portal_protection' );
Также используйте wp_redirect. Это стандартный способ перенаправления в WordPress.
Ответ или решение
Для реализации защиты страниц WordPress, основанной на URL-адресе реферера, с использованием плагина Advanced Custom Fields (ACF), вам потребуется внести несколько корректировок в ваш код. Вам следует использовать хуки WordPress для выполнения редиректа, а именно хук template_redirect
, поскольку он позволяет выполнять логические проверки до того, как соберется HTML-код страницы.
Вот корректный код, который вы можете использовать. Поместите его в файл вашей темы, например, в functions.php
:
// Функция для защиты страниц от доступа без реферера
function portal_protection() {
// Проверяем, активирована ли защита, и не является ли пользователь администратором
if ( get_field('enable_portal_protection') && !current_user_can('administrator') ) {
$referring_url = get_field('referring_url'); // Получаем URL-адрес реферера из ACF
$redirect_url = get_field('redirect_url'); // Получаем URL для редиректа
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; // Получаем реферер
// Если реферер не совпадает с заданным URL, выполняем редирект
if ( $referer != $referring_url ) {
wp_redirect( $redirect_url ); // Используем wp_redirect для безопасного редиректа
exit; // Завершаем выполнение скрипта после редиректа
}
}
}
// Подключаем функцию к хуку template_redirect
add_action( 'template_redirect', 'portal_protection' );
Важные моменты:
-
Использование
wp_redirect
: Это метод, рекомендованный в WordPress для выполнения редиректов. Он учитывает стандартные правила и методы безопасности WordPress. -
Проверка реферера: Обратите внимание на проверку с помощью
isset()
, чтобы избежать ошибок, еслиHTTP_REFERER
отсутствует. -
Завершение выполнения скрипта: После вызова
wp_redirect
нужно вызватьexit
, чтобы остановить дальнейшую обработку страницы. Это предотвратит выполнение остального кода, что может вызвать нежелательные эффекты. -
Отключение кэширования: Чтобы избежать кэширования страниц с редиректом, можно добавить заголовок, который предотвращает кэширование. Например, можно добавить это до вызова
wp_redirect
:
header("Cache-Control: no-cache, must-revalidate"); // Не кешировать
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Не кешировать
Вставьте эти строки перед wp_redirect
, если это требуется.
Убедитесь, что сайт не кэшируется сторонними плагинами и что ваш сервер корректно обрабатывает заголовки. Это уменьшит вероятность проблем с кэшированием при работе с редиректами.
Следуя этим указаниям, вы сможете настраивать свою защиты страниц.