Вопрос или проблема
У меня установлен плагин, который создает профили пользователей на фронтенде. 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');
Разъяснения
- Проверка страницы: Теперь функция сначала проверяет, соответствует ли текущая страница ID 301 с помощью
is_page(301)
. - Проверка кук и параметров: Убедитесь, что
$_COOKIE['lwb_event_id']
установлен и что параметрevent_id
отсутствует в URL. - Перенаправление и завершение: После выполнения перенаправления с помощью
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
решит вашу проблему с перенаправлением. Не забывайте делать проверку на существование и правильно обрабатывать куки. Вы также можете использовать альтернативные подходы, чтобы сделать ваш код более гибким в будущем.