Я разрабатываю плагин, который не использует пользовательский тип записи, а отдельные таблицы базы данных. Это плагин, который отображает список курсов со ссылками, которые ведут на разные страницы сведений о курсах, где пользователь может подписаться на курс.
В текущем состоянии я использую шорткод для получения данных плагинов на страницу с пользовательским шаблоном страницы (page-courses.php).
Теперь я хочу the_title()
динамически меняться в соответствии со страницей, которую показывает плагин (список курсов, страница сведений о курсе с формами, страница успеха отправки формы). Но всякий раз, когда я делаю это со следующим фильтром, ссылки на другие страницы в нижнем колонтитуле также меняются:
<?php
add_filter('the_title', 'custom_page_title');
function custom_page_title() {
return 'Custom Title';
}
редактировать
В footer.php у меня есть функция, которая включает ссылки нижнего колонтитула, wp_nav_menu()
чтобы я мог определить их в Appearance> Menus. Но с помощью фильтра выше все ссылки в нижнем колонтитуле также изменяются на «Пользовательский заголовок». Но я просто хочу изменить заголовок страницы, не затрагивая ссылки меню в нижнем колонтитуле.
При попытке добавить условный тег 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 'Custom Title';
}
Это похоже на вопрос: отфильтруйте проблему the_title в nav , просто затронутые ссылки находятся в нижнем колонтитуле и 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 'Custom Title';
}
return $title;
}
Файл page-listcourses.php - это пользовательский шаблон публикации, который я назначил статической странице с именем «Курсы».
Я предполагаю, что раньше это не работало, потому что имя статической страницы и имя файла пользовательского шаблона публикации были одинаковыми.
in_the_loop()
установлен наtrue
всякий раз, когдаthe_post()
срабатывает. Не углубляясь слишком глубоко в ядро, и зная, что навигационные меню сами по себе являются циклами , я предполагаю, что где-то на этом путиwp_nav_menu()
создается цикл, вызывающийin_the_loop()
возвратtrue
.Ответы:
Я бы использовал
is_page_template()
условное:редактировать
Вы должны использовать это условие внутри вашего обратного вызова фильтра:
Теперь, чтобы выделить только заголовки страниц , которые используют шаблон страницы, вы можете воспользоваться другим параметром , передаваемым в
the_title
:$id
. Так как вы знаете идентификатор сообщения, для которого фильтруется заголовок, вы можете запросить_wp_page_template
мета сообщения и убедиться, что он соответствует шаблону вашей страницы:Редактировать 2
Если вы хотите настроить таргетинг на страницу «Курсы», используйте
is_page()
со слагом страницы'courses'
или заголовком страницы'Courses'
:Хотя я бы порекомендовал перейти
page-courses.php
на пользовательский шаблон страницы , что сделало бы весь этот процесс гораздо более надежным.источник
get_post_meta( $id, '_wp_page_template', true )
возвращается,default
и я не знаю, что с этим делать. Когда я устанавливаю для «page-courses.php» значение «по умолчанию», все навигационные ссылки меняются, за исключением случаев, когда я подключаюthe_title
фильтрloop_start
, тогда меняются только ссылки нижнего колонтитула. Я проверил, какой файл шаблона используется, и это «page-courses.php», а не «page.php» (который я думал, может быть по умолчанию).Если вы хотите редактировать только заголовок текущей страницы, используйте
in_the_loop()
условное выражение, как в:источник
Попробуйте использовать условные теги, чтобы убедиться,
the_title()
что они изменяются только на тех страницах, которые вы хотите.источник
Хотя
is_page_template()
это сработает, я предпочитаю помещать этот вид кода в сам шаблон страницы, чтобы весь код, генерирующий страницу такого типа, находился в одном файле.источник
the_title()
? Примеры кода?get_header()
.the_title
- лучшее решение.