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

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

Gchtr
источник
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;
}
pixeline
источник
0

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

theMojoWill
источник
0

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

Марк Каплун
источник
1
Как это будет работать, если предположить, что используется соответствующий код the_title()? Примеры кода?
Чип Беннетт
@ChipBennett, я не понимаю вопроса. Если ему нужно, чтобы фильтр был применен только к странице с определенным шаблоном, он может поместить тот же код в шаблон перед вызовом get_header().
Марк Каплун
Да, на самом деле я тоже думаю, что это будет работать. Тем не менее, я думаю, что мне придется пойти в обход, чтобы установить переменную в плагине, который будет доступен в query_vars? Так что для меня фильтрация the_title- лучшее решение.
Гхтр