Ich entwickle ein Plugin, das keinen benutzerdefinierten Beitragstyp verwendet, sondern separate Datenbanktabellen. Es ist ein Plugin, das eine Liste von Kursen mit Links anzeigt, die zu den verschiedenen Kursdetailseiten führen, auf denen der Benutzer dann einen Kurs abonnieren kann.
Im aktuellen Status verwende ich einen Shortcode, um die Plugins-Daten auf eine Seite mit einer benutzerdefinierten Seitenvorlage (page-course.php) zu übertragen.
Ich möchte mich jetzt the_title()
dynamisch ändern , je nach der Seite, die das Plugin anzeigt (Liste der Kurse, Seite mit Kursdetails mit Formularen, Seite mit Erfolg beim Einreichen von Formularen). Aber wenn ich das mit dem folgenden Filter mache, ändern sich auch die Links zu anderen Seiten in der Fußzeile:
<?php
add_filter('the_title', 'custom_page_title');
function custom_page_title() {
return 'Custom Title';
}
Bearbeiten
In der footer.php habe ich eine Funktion, die Fußzeilenverknüpfungen enthält, wp_nav_menu()
damit ich sie unter Darstellung> Menüs definieren kann. Mit dem obigen Filter ändern sich jedoch auch alle Links in der Fußzeile in "Benutzerdefinierter Titel". Ich möchte jedoch nur den Titel der Seite ändern, ohne die Menüverknüpfungen in der Fußzeile zu beeinflussen.
Beim Versuch, ein bedingtes Tag hinzuzufügen, sind in_the_loop()
die Fußzeilenlinks weiterhin betroffen, obwohl sie sich nicht in der Schleife befinden.
<?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';
}
Es ist ähnlich wie bei dieser Frage: Filtern Sie das Problem mit dem Titel in nav , nur dass sich die betroffenen Links in der Fußzeile befinden und in_the_loop()
nicht funktionieren.
Wie kann ich Änderungen the_title()
vornehmen , während nur der Titel der aktuell angezeigten Seite und nicht die Links in der Fußzeile beeinflusst werden ?
Bearbeiten 2 - Lösung
Also habe ich es endlich geschafft:
<?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;
}
Die Datei page-listcourses.php ist eine benutzerdefinierte Beitragsvorlage, die ich der statischen Seite mit dem Namen "Kurse" zugewiesen habe.
Ich gehe davon aus, dass es vorher nicht funktioniert hat, da der Name der statischen Seite und der Dateiname der benutzerdefinierten Post-Vorlage identisch waren.
quelle
in_the_loop()
wird auftrue
immer eingestellt, wennthe_post()
ausgelöst wird. Ohne zu tief in den Kern einzudringen und zu wissen, dass Navigationsmenüs selbst Schleifen sind , schätze ich, dass irgendwo auf dem Wegwp_nav_menu()
eine Schleife instanziiert undin_the_loop()
zur Rückkehr führttrue
.Antworten:
Ich würde die
is_page_template()
Bedingung verwenden:Bearbeiten
Sie würden diese Bedingung in Ihrem Filter-Rückruf verwenden:
Um nur die Titel von Seiten zu isolieren, die Ihre Seitenvorlage verwenden, können Sie den anderen Parameter verwenden, der an
the_title
: übergeben wird$id
. Da Sie die ID des Beitrags kennen, nach dem der Titel gefiltert wird, können Sie das_wp_page_template
Beitrags-Meta abfragen und sicherstellen, dass es Ihrer Seitenvorlage entspricht:Bearbeiten 2
Wenn Sie speziell auf
is_page()
die Seite "Kurse" abzielen möchten, verwenden Sie sie mit dem Seiten-Slug'courses'
oder dem Seitentitel von'Courses'
:Ich würde jedoch empfehlen,
page-courses.php
in eine benutzerdefinierte Seitenvorlage zu wechseln , wodurch dieser gesamte Prozess wesentlich robuster wird.quelle
get_post_meta( $id, '_wp_page_template', true )
kehrt zurückdefault
und ich weiß nicht, was ich damit anfangen soll. Wenn ich 'page-course.php' auf 'default' setze, ändern sich alle Navigationslinks, außer wenn ich denthe_title
Filter einbinde, ändern sichloop_start
nur die Fußzeilenlinks. Ich habe überprüft, welche Vorlagendatei verwendet wird, und es ist 'page-course.php' und nicht 'page.php' (was meiner Meinung nach die Standarddatei sein könnte).Wenn Sie nur den aktuellen Seitentitel bearbeiten möchten, verwenden Sie die
in_the_loop()
Bedingung wie folgt:quelle
Verwenden Sie bedingte Tags, um sicherzustellen, dass
the_title()
nur die gewünschten Seiten geändert werden.quelle
Während dies
is_page_template()
funktioniert, ziehe ich es vor, diese Art von Code in die Seitenvorlage selbst einzufügen, um den gesamten Code, der diese Art von Seite generiert, in einer Datei zu haben.quelle
the_title()
? Codebeispiele?get_header()
.the_title
ist für mich also eine schönere Lösung.