Dynamicznie zmieniaj funkcję the_title () strony

9

Tworzę wtyczkę, która nie używa niestandardowego typu postu, ale osobne tabele bazy danych. Jest to wtyczka, która wyświetla listę kursów z linkami prowadzącymi do różnych stron szczegółowych kursów, na których użytkownik może zapisać się na kurs.

W obecnym stanie używam krótkiego kodu, aby przenieść dane wtyczek na stronę z niestandardowym szablonem strony (page-course.php).

Chcę teraz zmieniać się the_title()dynamicznie, zgodnie ze stroną wyświetlaną przez wtyczkę (lista kursów, strona szczegółów kursu z formularzami, strona z pomyślnym przesłaniem formularza). Ale ilekroć zrobię to z następującym filtrem, linki do innych stron w stopce również się zmieniają:

<?php

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

Edytować

W footer.php mam funkcję, która zawiera linki stopki, dzięki wp_nav_menu()czemu mogę je zdefiniować w Wyglądzie> Menu. Ale z powyższym filtrem wszystkie linki w stopce również zmieniają się na „Tytuł niestandardowy”. Chcę tylko zmienić tytuł strony, nie wpływając na łącza menu w stopce.

Próba dodania znacznika warunkowego in_the_loop()nadal wpływa na łącza stopki, chociaż nie znajdują się one w pętli.

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

Podobnie jest z tym pytaniem: filtruj problem z tytułem w nav , po prostu linki, których dotyczą, znajdują się w stopce i in_the_loop()nie działają.

Jak mogę zmienić the_title(), wpływając tylko na tytuł wyświetlanej strony, nie wpływając na linki w stopce ?

Edycja 2 - Rozwiązanie

W końcu udało mi się to uruchomić:

<?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;
}

Plik page-listcourses.php jest niestandardowym szablonem posta, który przypisałem statycznej stronie o nazwie „Kursy”.

Zakładam, że wcześniej nie działał, ponieważ nazwa strony statycznej i nazwa niestandardowego szablonu postu były takie same.

Gchtr
źródło
1
Dlaczego tworzysz własne tabele bazy danych? Twoje życie byłoby znacznie prostsze, gdybyś zaimplementował niestandardową treść jako niestandardowy typ postu .
Chip Bennett
Myślałem, że to pytanie nadejdzie. Tworzę tę wtyczkę, aby poznać Wordpress, więc najpierw nie wiedziałem o niestandardowych typach postów. Mam dwie tabele bazy danych, jedną dla kursów i jedną dla kategorii kursów. Jedna kategoria może mieć kilka kursów, więc dwie tabele są połączone. Nie sądzę, że jest to takie łatwe dzięki niestandardowym typom postów. Jasne, że mógłbym użyć niestandardowych taksonomii dla kursów, ale musiałbym dodać więcej pól, ponieważ kategoria kursu ma nie tylko nazwę. Na razie jest to o wiele łatwiejsze dzięki niestandardowym tabelom bazy danych.
Gchtr
1
Twój przypadek użycia jest dokładnym, zamierzonym przypadkiem użycia dla niestandardowych typów poczt i niestandardowych taksonomii. Być może nie doceniasz elegancji, elastyczności i siły CPT i taksonomii celnych.
Chip Bennett
Rzeczywiście jest to możliwe. Powinienem chyba spróbować. Dzięki za radę.
Gchtr,
in_the_loop()jest ustawiony na trueza każdym razem, gdy the_post()jest uruchamiany. Nie zagłębiając się zbyt głęboko w rdzeń i wiedząc, że menu nawigacyjne same są pętlami , domyślam się, że gdzieś po drodze wp_nav_menu()tworzy pętlę, powodując in_the_loop()powrót true.
Chip Bennett

Odpowiedzi:

5

Użyłbym is_page_template()warunkowego:

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

Edytować

Użyłbyś tego warunku w wywołaniu zwrotnym filtra:

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' );

Teraz, aby wyizolować tylko tytuły stron, które wykorzystują swój szablon strony, można skorzystać z innego parametru przekazanego do the_title: $id. Ponieważ znasz identyfikator wpisu, dla którego tytuł jest filtrowany, możesz wysłać zapytanie do _wp_page_templatemeta postu i upewnić się, że jest równy szablonowi strony:

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 );

Edytuj 2

Jeśli chcesz kierować konkretnie na stronę „Kursy”, użyj jej is_page()z informacją o stronie 'courses'lub tytułem strony 'Courses':

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

Chociaż zaleciłbym zmianę page-courses.phpna niestandardowy szablon strony , co uczyniłoby ten proces o wiele bardziej niezawodnym.

Chip Bennett
źródło
To na razie nie działało. Ale dopracowałem moje pytanie, ponieważ mogło nie być wystarczająco szczegółowe. Może problem leży gdzie indziej.
Gchtr
Co rozumiesz przez „ to na razie nie działało ”? Co dokładnie próbowałeś? Czego się spodziewałeś, co się nie wydarzyło lub co stało się nieoczekiwanie?
Chip Bennett
Zobacz zaktualizowaną odpowiedź, która powinna odnosić się do tytułów pozycji menu nawigacyjnego.
Chip Bennett
Powiedziałem to, ponieważ uważam, że twoja odpowiedź może być właściwa (pchanie we właściwym kierunku), ale być może nie zadałem wystarczająco jasnego pytania. get_post_meta( $id, '_wp_page_template', true )powraca defaulti nie wiem co z tym zrobić. Kiedy ustawię „page-course.php” na „default”, zmieniają się wszystkie linki nawigacyjne, z wyjątkiem sytuacji, gdy podpinam the_titlefiltr loop_start, zmieniają się tylko linki stopki. Sprawdziłem, który plik szablonu jest używany, i jest to „page-course.php”, a nie „page.php” (który, jak myślałem, może być domyślny).
Gchtr
Czy „Kursy” to nazwa strony statycznej?
Chip Bennett
1

Jeśli chcesz edytować tylko bieżący tytuł strony, użyj in_the_loop()warunkowego, jak w:

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
źródło
0

Spróbuj użyć tagów warunkowych, aby upewnić the_title()się, że modyfikuje się tylko te strony, które chcesz.

theMojoWill
źródło
0

Chociaż is_page_template()będzie działać, wolę umieścić ten rodzaj kodu w samym szablonie strony, aby cały kod generujący ten rodzaj strony był w jednym pliku.

Mark Kaplun
źródło
1
Jak by to działało, przy założeniu, że używa tego kodu the_title()? Przykłady kodu?
Chip Bennett
@ChipBennett, nie rozumiem pytania. Jeśli chce, aby filtr był stosowany tylko do strony z określonym szablonem, przed wywołaniem może umieścić ten sam kod w szablonie get_header().
Mark Kaplun
Tak, tak naprawdę myślę, że to zadziała. Myślę jednak, że musiałbym skorzystać z objazdu, aby ustawić zmienną we wtyczce, która byłaby dostępna w query_vars? Więc dla mnie filtrowanie the_titlejest lepszym rozwiązaniem.
Gchtr