Ändern Sie den_Titel () einer Seite dynamisch

9

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.

Gchtr
quelle
1
Warum rollen Sie Ihre eigenen Datenbanktabellen? Ihr Leben wäre viel einfacher , wenn Sie Ihre implementiert benutzerdefinierte Inhalte als Benutzerdefinierte Beitrag Typ .
Chip Bennett
Ich dachte tatsächlich, dass diese Frage kommen würde. Ich habe dieses Plugin entwickelt, um Wordpress kennenzulernen, daher wusste ich zunächst nichts über benutzerdefinierte Beitragstypen. Ich habe zwei Datenbanktabellen, eine für die Kurse und eine für die Kurskategorien. Eine Kategorie kann mehrere Kurse haben, daher sind die beiden Tabellen miteinander verbunden. Ich denke nicht, dass es so einfach ist, dies mit benutzerdefinierten Beitragstypen zu erreichen. Natürlich könnte ich benutzerdefinierte Taxonomien für die Kurse verwenden, aber ich müsste weitere Felder hinzufügen, da eine Kurskategorie nicht nur einen Namen hat. Im Moment ist es viel einfacher, dies mit benutzerdefinierten Datenbanktabellen zu tun.
Gchtr
1
Ihr Anwendungsfall ist der genaue, beabsichtigte Anwendungsfall für benutzerdefinierte Beitragstypen und benutzerdefinierte Taxonomien. Sie können sich misunderestimating die Eleganz, Flexibilität und Leistung von CPTs und kundenspezifische Taxonomien.
Chip Bennett
Es ist in der Tat möglich, dass ich es tue. Ich sollte es wahrscheinlich einfach versuchen. Danke für den Hinweis.
Gchtr
in_the_loop()wird auf trueimmer eingestellt, wenn the_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 Weg wp_nav_menu()eine Schleife instanziiert und in_the_loop()zur Rückkehr führt true.
Chip Bennett

Antworten:

5

Ich würde die is_page_template()Bedingung verwenden:

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

Bearbeiten

Sie würden diese Bedingung in Ihrem Filter-Rückruf verwenden:

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

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_templateBeitrags-Meta abfragen und sicherstellen, dass es Ihrer Seitenvorlage entspricht:

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

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':

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

Ich würde jedoch empfehlen, page-courses.phpin eine benutzerdefinierte Seitenvorlage zu wechseln , wodurch dieser gesamte Prozess wesentlich robuster wird.

Chip Bennett
quelle
Das hat vorerst nicht funktioniert. Aber ich habe meine Frage verfeinert, weil sie möglicherweise nicht spezifisch genug war. Vielleicht liegt das Problem woanders.
Gchtr
Was meinst du mit " das hat vorerst nicht funktioniert "? Was genau hast du versucht? Was haben Sie erwartet, was nicht oder was ist unerwartet passiert?
Chip Bennett
Siehe aktualisierte Antwort, die die Titel der Navigationsmenüelemente ansprechen sollte.
Chip Bennett
Ich sagte das, weil ich denke, dass Ihre Antwort die richtige sein könnte (in die richtige Richtung drängen), aber dass ich meine Frage vielleicht nicht klar genug gestellt habe. get_post_meta( $id, '_wp_page_template', true )kehrt zurück defaultund ich weiß nicht, was ich damit anfangen soll. Wenn ich 'page-course.php' auf 'default' setze, ändern sich alle Navigationslinks, außer wenn ich den the_titleFilter einbinde, ändern sich loop_startnur 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).
Gchtr
Ist "Kurse" der Name Ihrer statischen Seite?
Chip Bennett
1

Wenn Sie nur den aktuellen Seitentitel bearbeiten möchten, verwenden Sie die in_the_loop()Bedingung wie folgt:

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
quelle
0

Verwenden Sie bedingte Tags, um sicherzustellen, dass the_title()nur die gewünschten Seiten geändert werden.

theMojoWill
quelle
0

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.

Mark Kaplun
quelle
1
Wie würde das funktionieren, unter der Annahme, dass der betreffende Code verwendet the_title()? Codebeispiele?
Chip Bennett
@ChipBennett, ich verstehe die Frage nicht. Wenn der Filter nur für Seiten mit einer bestimmten Vorlage angewendet werden soll, kann er vor dem Aufruf denselben Code in die Vorlage einfügen get_header().
Mark Kaplun
Ja, eigentlich denke ich auch, dass das funktionieren würde. Ich denke jedoch, ich müsste den Umweg machen, um eine Variable im Plugin festzulegen, die in query_vars verfügbar wäre. Filtern the_titleist für mich also eine schönere Lösung.
Gchtr