Динамічно змінюйте_title () сторінки


9

Я розробляю плагін, який використовує не спеціальний тип публікації, а окремі таблиці баз даних. Це плагін, який відображає перелік курсів із посиланнями, що ведуть на різні сторінки з деталізацією курсу, де користувач може потім підписатися на курс.

У поточному стані я використовую короткий код, щоб передати дані плагінів на сторінку із користувацьким шаблоном сторінки (page -ourse.php).

Тепер я хочу змінити the_title()динамічно, відповідно до сторінки, на якій відображається плагін (список курсів, сторінка з деталями курсу з формами, сторінка успіху подання форми). Але щоразу, коли я роблю це за допомогою наступного фільтра, посилання на інші сторінки в нижньому колонтитулі також змінюються:

<?php

add_filter('the_title', 'custom_page_title');
function custom_page_title() {
    return 'Custom Title';
}

Редагувати

У 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 '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;
}

Сторінка файлу-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 -ourse.php" на "default", всі навігаційні посилання змінюються, за винятком випадків, коли я підключаю the_titleфільтр до цього loop_start, змінюються лише посилання нижнього колонтитула. Я перевірив, який файл шаблону використовується, і це "page -ourse.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- це приємніше рішення.
Gchtr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.