Динамически изменяйте the_title () страницы


9

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

В текущем состоянии я использую шорткод для получения данных плагинов на страницу с пользовательским шаблоном страницы (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 - это пользовательский шаблон публикации, который я назначил статической странице с именем «Курсы».

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


1
Почему вы катите свои собственные таблицы базы данных? Ваша жизнь была бы намного проще, если бы вы реализовали свой пользовательский контент как пользовательский тип поста .
— Чип Беннетт

Я действительно думал, что этот вопрос придет. Я разработал этот плагин, чтобы познакомиться с Wordpress, поэтому сначала я не знал о пользовательских типах постов. У меня есть две таблицы базы данных, одна для курсов и одна для категорий курсов. В одной категории может быть несколько курсов, поэтому две таблицы связаны между собой. Я не думаю, что это легко сделать с помощью пользовательских типов постов. Конечно, я мог бы использовать пользовательские таксономии для курсов, но мне пришлось бы добавить больше полей, потому что категория курса не просто имеет название. Сейчас гораздо проще сделать это с помощью пользовательских таблиц базы данных.
— Gchtr

1
Ваш вариант использования - это точный, предполагаемый вариант использования для пользовательских типов записей и пользовательских таксономий. Вы можете недооценивать элегантность, гибкость и мощь CPT и пользовательских таксономий.
— Чип Беннетт

Это действительно возможно, что я делаю. Я, наверное, должен просто попробовать. Спасибо за совет.
— Gchtr

in_the_loop()установлен на trueвсякий раз, когда the_post()срабатывает. Не углубляясь слишком глубоко в ядро, и зная, что навигационные меню сами по себе являются циклами , я предполагаю, что где-то на этом пути wp_nav_menu()создается цикл, вызывающий in_the_loop()возврат true.
— Чип Беннетт

Ответы:


5

Я бы использовал is_page_template()условное:

if ( is_page_template( 'page-courses.php' ) ) {
    // The current page uses your
    // custom page template;
    // do something
}

редактировать

Вы должны использовать это условие внутри вашего обратного вызова фильтра:

function wpse83525_filter_the_title( $title ) {
    if ( is_page_template( 'page-courses.php' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

Теперь, чтобы выделить только заголовки страниц , которые используют шаблон страницы, вы можете воспользоваться другим параметром , передаваемым в the_title: $id. Так как вы знаете идентификатор сообщения, для которого фильтруется заголовок, вы можете запросить _wp_page_templateмета сообщения и убедиться, что он соответствует шаблону вашей страницы:

function wpse83525_filter_the_title( $title, $id ) {
    if ( 'page-courses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );

Редактировать 2

Если вы хотите настроить таргетинг на страницу «Курсы», используйте is_page()со слагом страницы 'courses'или заголовком страницы 'Courses':

function wpse83525_filter_the_title( $title ) {
    if ( is_page( 'Courses' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

Хотя я бы порекомендовал перейти page-courses.phpна пользовательский шаблон страницы , что сделало бы весь этот процесс гораздо более надежным.


Это не сработало на данный момент. Но я уточнил свой вопрос, потому что он мог быть недостаточно конкретным. Может быть проблема в другом.
— Gchtr

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

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

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

Итак, "Курсы" - это название вашей статической страницы?
— Чип Беннетт

1

Если вы хотите редактировать только заголовок текущей страницы, используйте in_the_loop()условное выражение, как в:

add_filter( 'the_title', 'modify_onpage_title', 10, 2);

function modify_onpage_title( $title , $id = null ) {

    if(!in_the_loop()){
        // returns early if not relevant (as in custom menu loops)
        return $title;
    }

    // Tweak your title
    $title = "Yolo! ". $title;
    return $title;
}


0

Хотя is_page_template()это сработает, я предпочитаю помещать этот вид кода в сам шаблон страницы, чтобы весь код, генерирующий страницу такого типа, находился в одном файле.


1
Как это будет работать, если предположить, что используется соответствующий код the_title()? Примеры кода?
— Чип Беннетт

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

Да, на самом деле я тоже думаю, что это будет работать. Тем не менее, я думаю, что мне придется пойти в обход, чтобы установить переменную в плагине, который будет доступен в query_vars? Так что для меня фильтрация the_title- лучшее решение.
— Гхтр
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.