it-swarm.com.de

Ändere den Titel () einer Seite dynamisch

Ich entwickle ein Plugin, das keinen benutzerdefinierten Beitragstyp verwendet, sondern separate Datenbanktabellen. Es handelt sich um ein Plug-in, 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 Plug-in-Daten auf eine Seite mit einer benutzerdefinierten Seitenvorlage (page-courses.php) zu übertragen.

Ich möchte jetzt the_title() dynamisch entsprechend der im Plugin angezeigten Seite ändern (Liste der Kurse, Seite mit Kursdetails mit Formularen, Seite mit Formularübermittlungserfolg). 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 Footer-Links mit wp_nav_menu() enthält, damit ich sie unter Darstellung> Menüs definieren kann. Mit dem obigen Filter werden jedoch auch alle Links in der Fußzeile in "Benutzerdefinierter Titel" geändert. Ich möchte aber nur den Titel der Seite ändern, ohne die Menü-Links in der Fußzeile zu beeinflussen.

Beim Versuch, ein bedingtes Tag hinzuzufügen, in_the_loop() sind die Links in der Fußzeile weiterhin betroffen, obwohl sie nicht in der Schleife sind.

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

Ähnlich verhält es sich mit dieser Frage: Filtere das Titelproblem in nav , nur dass sich die betroffenen Links in der Fußzeile befinden und in_the_loop() nicht funktioniert.

Wie kann ich the_title() ändern, während sich dies nur auf den Titel der angezeigten Seite auswirkt? keine Auswirkungen auf Links in der Fußzeile ?

Edit 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 "Kurse" zugewiesen habe.

Ich gehe davon aus, dass es zuvor nicht funktioniert hat, da der Name der statischen Seite und der Dateiname der benutzerdefinierten Post-Vorlage identisch waren.

9
Gchtr

Ich würde die is_page_template() conditional verwenden:

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

Bearbeiten

Sie würden diese Bedingung inside für Ihren Filterrü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 der 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 Posts kennen, nach dem der Titel gefiltert wird, können Sie das _wp_page_template-Post-Meta abfragen und sicherstellen, dass es mit Ihrer Seitenvorlage übereinstimmt:

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 die Seite "Kurse" gezielt ansprechen möchten, verwenden Sie is_page() 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.php in eine Benutzerdefinierte Seitenvorlage zu ändern, was diesen gesamten Prozess wesentlich robuster machen würde.

5
Chip Bennett

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

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;
}
1
pixeline

Verwenden Sie Bedingte Tags , um sicherzustellen, dass the_title() nur auf den gewünschten Seiten geändert wird.

0
theMojoWill

Während is_page_template() funktioniert, ziehe ich es vor, diese Art von Code in die Seitenvorlage selbst einzufügen, damit der gesamte Code, der diese Art von Seite generiert, in einer Datei enthalten ist.

0
Mark Kaplun