Перенаправление на основе реферера с использованием Advanced Custom Fields

Вопрос или проблема

Я сейчас пытаюсь защитить некоторые страницы 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' );

Важные моменты:

  1. Использование wp_redirect: Это метод, рекомендованный в WordPress для выполнения редиректов. Он учитывает стандартные правила и методы безопасности WordPress.

  2. Проверка реферера: Обратите внимание на проверку с помощью isset(), чтобы избежать ошибок, если HTTP_REFERER отсутствует.

  3. Завершение выполнения скрипта: После вызова wp_redirect нужно вызвать exit, чтобы остановить дальнейшую обработку страницы. Это предотвратит выполнение остального кода, что может вызвать нежелательные эффекты.

  4. Отключение кэширования: Чтобы избежать кэширования страниц с редиректом, можно добавить заголовок, который предотвращает кэширование. Например, можно добавить это до вызова wp_redirect:

header("Cache-Control: no-cache, must-revalidate"); // Не кешировать
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Не кешировать

Вставьте эти строки перед wp_redirect, если это требуется.

Убедитесь, что сайт не кэшируется сторонними плагинами и что ваш сервер корректно обрабатывает заголовки. Это уменьшит вероятность проблем с кэшированием при работе с редиректами.

Следуя этим указаниям, вы сможете настраивать свою защиты страниц.

Оцените материал
Добавить комментарий

Капча загружается...