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.
źródło
in_the_loop()
jest ustawiony natrue
za każdym razem, gdythe_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 drodzewp_nav_menu()
tworzy pętlę, powodującin_the_loop()
powróttrue
.Odpowiedzi:
Użyłbym
is_page_template()
warunkowego:Edytować
Użyłbyś tego warunku w wywołaniu zwrotnym filtra:
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_template
meta postu i upewnić się, że jest równy szablonowi strony: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'
:Chociaż zaleciłbym zmianę
page-courses.php
na niestandardowy szablon strony , co uczyniłoby ten proces o wiele bardziej niezawodnym.źródło
get_post_meta( $id, '_wp_page_template', true )
powracadefault
i nie wiem co z tym zrobić. Kiedy ustawię „page-course.php” na „default”, zmieniają się wszystkie linki nawigacyjne, z wyjątkiem sytuacji, gdy podpinamthe_title
filtrloop_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).Jeśli chcesz edytować tylko bieżący tytuł strony, użyj
in_the_loop()
warunkowego, jak w:źródło
Spróbuj użyć tagów warunkowych, aby upewnić
the_title()
się, że modyfikuje się tylko te strony, które chcesz.źródło
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.źródło
the_title()
? Przykłady kodu?get_header()
.the_title
jest lepszym rozwiązaniem.