it-swarm.xyz

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

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

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

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

9
Gchtr

Я хотел бы использовать 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 на Custom Page Template , что сделало бы весь этот процесс намного более устойчивым.

5
Chip Bennett

Если вы хотите редактировать только заголовок текущей страницы, используйте условие 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;
}
1
pixeline

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

0
theMojoWill

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

0
Mark Kaplun