если is_page() не работает с wp_redirect

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

У меня установлен плагин, который создает профили пользователей на фронтенде. ID этой страницы в админке WordPress равен 301. Если посетить страницу профиля, я хочу добавить к URL параметр. Значение параметра хранится в куки. Код для добавления URL работает, но когда я добавляю код, чтобы он отображался только на этом ID страницы, это не работает.

Код выполняется в functions.php моей дочерней темы.

НЕ РАБОТАЕТ

if( is_page(301)) {
    echo 'страница';

// Добавление ID события в URL как $_GET
function lwb_param_redirect(){
    if( isset( $_COOKIE['lwb_event_id'] ) and !$_GET['event_id'] ) {
        $location = esc_url( add_query_arg( 'event_id', $_COOKIE['lwb_event_id'] ));
        wp_redirect( $location );
    }
}
    add_action( 'template_redirect', 'lwb_param_redirect' );
}

РАБОТАЕТ

// Добавление ID события в URL как $_GET
function lwb_param_redirect(){
    if( isset( $_COOKIE['lwb_event_id'] ) and !$_GET['event_id'] ) {
        $location = esc_url( add_query_arg( 'event_id', $_COOKIE['lwb_event_id'] ));
        wp_redirect( $location );
    }
}
    add_action( 'template_redirect', 'lwb_param_redirect' );

Рабочий пример добавляет параметр URL ко всем моим сайтам, чего я хочу избежать, потому что event_id нужен только на страницах профилей.

В случае шаблона плагина вы можете обнаружить, что слаг более надежен для условия – смотрите ниже для альтернативного подхода.

При использовании is_page_template() передается параметр anypath/filename.php. Не зная специфики вашей файловой системы или названия плагина, невозможно указать правильный относительный путь для этого. Используйте plugin_dir_path(), чтобы получить корень плагина, затем подпапку и т.д. для этого подхода.

Альтернативный подход

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

$template = get_page_template_slug(); // Возможно, вам нужно будет передать ID записи в зависимости от контекста

if ( 'profile.php' === $template ) {
    echo 'да';
} else {
    echo 'нет';
}

WP Codex для получения дополнительной информации: https://developer.wordpress.org/reference/functions/get_page_template_slug/
https://developer.wordpress.org/reference/functions/plugin_dir_path/

Ответ или решение

Если ваша функция is_page(301) не работает в сочетании с wp_redirect, это может быть связано с тем, что условие проверки страницы выполняется после добавления действия template_redirect. Конкретно ваш код, как он сейчас написан, вызывает проверку условия is_page(301) внутри функции, которая должна быть связана с хуком template_redirect.

Вот поэтапное разъяснение вашей проблемы и корректное решение:

Проблема

Ваша функция lwb_param_redirect() добавлена к хуку template_redirect, что правильно, но условие is_page(301) находится вне этой функции. Это означает, что проверка страницы не выполняется, и перенаправление выполняется на всех страницах, а не только на целевой.

Решение

Переместите условие is_page(301) внутрь функции lwb_param_redirect(), чтобы код выполнялся корректно на указанной странице. Вот исправленный код:

function lwb_param_redirect() {
    // Проверяем, находимся ли на странице с ID 301
    if (is_page(301)) {
        // Проверяем, установлены ли куки и отсутствует ли параметр event_id в URL
        if (isset($_COOKIE['lwb_event_id']) && !isset($_GET['event_id'])) {
            // Создаем новый URL с параметром event_id
            $location = esc_url(add_query_arg('event_id', $_COOKIE['lwb_event_id']));
            wp_redirect($location);
            exit; // Не забывайте о вызове exit после wp_redirect
        }
    }
}
add_action('template_redirect', 'lwb_param_redirect');

Разъяснения

  1. Проверка страницы: Теперь функция сначала проверяет, соответствует ли текущая страница ID 301 с помощью is_page(301).
  2. Проверка кук и параметров: Убедитесь, что $_COOKIE['lwb_event_id'] установлен и что параметр event_id отсутствует в URL.
  3. Перенаправление и завершение: После выполнения перенаправления с помощью wp_redirect($location) всегда вызывайте exit;, чтобы завершить выполнение скрипта и предотвратить дальнейшее выполнение кода.

Альтернативный подход

Если вам необходимо создавать гибкие условия, вы можете использовать функции, которые проверяют шаблон страницы, например, get_page_template_slug(). Это может быть полезно, если у вас несколько страниц профилей, которые используют разные шаблоны:

function lwb_param_redirect() {
    // Получаем шаблон страницы
    $template = get_page_template_slug();

    // Проверяем, соответствует ли шаблон странице профиля
    if ('profile.php' === $template) {
        // Логика перенаправления как ранее
    }
}
add_action('template_redirect', 'lwb_param_redirect');

Заключение

Использование правильных условий и контекста вызова функции – это ключ к успешному перенаправлению на нужные страницы. Перемещение условия is_page(301) внутрь функции lwb_param_redirect решит вашу проблему с перенаправлением. Не забывайте делать проверку на существование и правильно обрабатывать куки. Вы также можете использовать альтернативные подходы, чтобы сделать ваш код более гибким в будущем.

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

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