Изменение the_title() страницы динамически
Я разрабатываю плагин, который не использует пользовательский тип записи, а использует отдельные таблицы базы данных. Это плагин, который отображает список курсов со ссылками, ведущими на различные страницы с подробностями о курсах, где пользователь затем может подписаться на курс.
В текущем состоянии я использую шорткод для получения данных плагина на странице с пользовательским шаблоном страницы (page-courses.php).
Теперь я хочу динамически изменять the_title()
в соответствии со страницей, которую показывает плагин (список курсов, страница с подробностями курса и формами, страница успешной отправки формы). Но когда я делаю это с помощью следующего фильтра, ссылки на другие страницы в футере также изменяются:
<?php
add_filter('the_title', 'custom_page_title');
function custom_page_title() {
return 'Пользовательский заголовок';
}
Редактирование
В footer.php у меня есть функция, которая включает ссылки футера с помощью wp_nav_menu()
, чтобы я мог определить их в Внешний вид > Меню. Но с вышеуказанным фильтром все ссылки в футере также меняются на 'Пользовательский заголовок'. Но я просто хочу изменить заголовок страницы, не затрагивая ссылки меню в футере.
Пытаясь добавить условный тег in_the_loop()
, ссылки футера все еще затрагиваются, хотя они не находятся в цикле.
<?php
add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
if ( in_the_loop() ) {
add_filter( 'the_title', 'custom_page_title' );
}
}
function custom_page_title() {
return 'Пользовательский заголовок';
}
Это похоже на этот вопрос: проблема фильтра the_title в навигации, только в том, что затронутые ссылки находятся в футере и in_the_loop()
не работает.
Как я могу изменить the_title()
, влияя только на заголовок текущей отображаемой страницы, не затрагивая ссылки в футере?
Редактирование 2 - Решение
Итак, наконец я заставил это работать:
<?php
add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );
}
function wpse83525_filter_the_title( $title, $id ) {
if ( 'page-listcourses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
return 'Пользовательский заголовок';
}
return $title;
}
Файл page-listcourses.php - это пользовательский шаблон страницы, который я назначил статической странице с названием 'Курсы'.
Я предполагаю, что раньше это не работало, потому что название статической страницы и имя файла пользовательского шаблона страницы были одинаковыми.

Я бы использовал условную функцию is_page_template()
:
if ( is_page_template( 'page-courses.php' ) ) {
// Текущая страница использует ваш
// пользовательский шаблон страницы;
// выполните какие-либо действия
}
Редактирование
Эту условную функцию следует использовать внутри вашего callback-фильтра:
function wpse83525_filter_the_title( $title ) {
if ( is_page_template( 'page-courses.php' ) ) {
return 'Пользовательский заголовок';
}
return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );
Теперь, чтобы изолировать только заголовки страниц, использующих ваш шаблон, можно воспользоваться вторым параметром, передаваемым в the_title
: $id
. Поскольку вам известен ID записи, для которой фильтруется заголовок, можно запросить метаданные _wp_page_template
и убедиться, что они соответствуют вашему шаблону:
function wpse83525_filter_the_title( $title, $id ) {
if ( 'page-courses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
return 'Пользовательский заголовок';
}
return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );
Редактирование 2
Если вы хотите нацелиться конкретно на страницу "Курсы", используйте is_page()
с указанием slug страницы 'courses'
или её заголовка 'Courses'
:
function wpse83525_filter_the_title( $title ) {
if ( is_page( 'Courses' ) ) {
return 'Пользовательский заголовок';
}
return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );
Тем не менее, я бы рекомендовал преобразовать page-courses.php
в Пользовательский шаблон страницы, что сделает весь процесс более надёжным.

Пока это не сработало. Но я уточнил свой вопрос, потому что, возможно, он был недостаточно конкретным. Может быть, проблема в чем-то другом.

Что вы имеете в виду под "пока это не сработало"? Что именно вы пробовали? Что должно было произойти, но не произошло, или что случилось неожиданно?

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

Я сказал это, потому что думаю, что ваш ответ может быть правильным (направляет в верную сторону), но, возможно, я недостаточно четко сформулировал свой вопрос. get_post_meta( $id, '_wp_page_template', true )
возвращает default
, и я не знаю, что с этим делать. Когда я устанавливаю 'page-courses.php' в качестве 'default', все ссылки в навигации изменяются, кроме случаев, когда я подключаю фильтр the_title
к loop_start
— тогда изменяются только ссылки в подвале. Я проверил, какой файл шаблона используется, и это 'page-courses.php', а не 'page.php' (который, как я думал, может быть шаблоном по умолчанию).

Смотрите обновленный ответ. Можно выбрать страницу по её заголовку или слагу, используя is_page()
.

Теперь всё работает. Смотрите первый вопрос в посте, чтобы увидеть, что я сделал. Файл page-courses.php всегда был Кастомным Шаблоном Страницы. Полагаю, что раньше это не работало, потому что имя статической страницы и имя файла Кастомного Шаблона Записи совпадали. Спасибо за ваши усилия!

Как это будет работать, если предположить, что код использует the_title()
? Примеры кода?

@ChipBennett, я не понимаю вопрос. Если ему нужно, чтобы фильтр применялся только для страницы с определённым шаблоном, тогда он может разместить тот же код в шаблоне перед вызовом get_header()
.

Если вам нужно изменить только заголовок текущей страницы, используйте условную проверку in_the_loop()
, как показано ниже:
add_filter( 'the_title', 'modify_onpage_title', 10, 2);
function modity_onpage_title( $title , $id = null ) {
if(!in_the_loop()){
// Прерываем выполнение, если проверка не прошла (например, в циклах меню)
return $title;
}
// Модифицируем заголовок
$title = "Йоу! ". $title;
return $title;
}

Попробуйте использовать условные теги, чтобы гарантировать, что функция the_title()
изменяется только на нужных вам страницах.
