it-swarm.com.de

Wenden Sie den Filter "the_title ()" im Post- und Seitentitel an, jedoch nicht im Menütitel

Ich benutze den folgenden Code, um den Titel von WordPress posts und pages zu ändern. Es ändert aber auch die Titel der Navigationsmenüpunkte, die ich vermeiden möchte.

Ich möchte den Titel von Beiträgen und Seiten ändern in: Startseite , alle Archivseiten und alle Widgets (Widget für aktuelle Beiträge, Widget für zufällige Beiträge usw.)

Sowohl in Stack Overflow als auch in WP Stack Exchange gibt es ähnliche Fragen, die die Verwendung der Funktion in_the_loop() vorschlagen. Leider funktioniert es bei mir nicht, denn wenn ich es platziere, wirkt es sich auch auf die Widgets der Seitenleiste aus.

Das heißt, wenn ich die Funktion in_the_loop() verwende, wirkt sich der Filter the_title nicht auf recent posts widget, random post widget usw. aus.

Wie kann ich den the_title-Filter nur auf post- und page-Titel anwenden, aber nicht auf Menütitel?

function pppp_title_update( $title, $id = null ) {

    if ( ! is_admin() ) {
       if(is_singular(array('post','page')) || is_archive() || is_home()){
            if(in_the_loop()){
                $current_post_id = get_the_ID();
                $new_titile = get_post_meta($current_post_id, 'pp_new_title',true);
                return $new_titile;  
            }                     
       } 
    }

    return $title;
}
add_filter( 'the_title', 'pppp_title_update', 10, 2 );
7
Ranuka

Problembeschreibung:

Lassen Sie mich die Frage zuerst umformulieren. Du möchtest:

  1. Legen Sie für alle post- und page-Typen in einem Metafeld einen neuen Titel fest.

  2. Sie möchten, dass dies überall geschieht (Homepage, einzelne Seite, Widgets usw.)

  3. Sie möchten jedoch nicht, dass dieser Titel geändert wird, wenn sich der Titel im Navigationsmenü befindet.

Lösung:

Bevor ich Ihnen den CODE gebe, lassen Sie mich zunächst einige Punkte erklären (basierend auf Ihrem CODE):

So ändern Sie die Titel aller Beiträge und Seiten:

Sie kennen die Verwendung des the_title-Filters bereits. Wenn Sie jedoch alle Titel vom Typ post und page (jedoch keine benutzerdefinierten Beitragstypen) als Ziel festlegen möchten, gilt Folgendes:

is_singular(array('post','page')) || is_archive() || is_home()

wird nicht funktionieren. Beispielsweise wird der benutzerdefinierte Beitragstyp auf einer Archivseite oder der Homepage ebenfalls geändert. Diese Bedingung überprüft nicht, ob der Titel, den wir filtern, vom Typ page oder post ist. Stattdessen wird geprüft, ob die Seite selbst eine Singular-Seite (post oder page) oder eine Archiv-Seite (Kategorie, Tag usw.) oder eine Homepage ist. Benutzerdefinierte Beitragstypen auf diesen Seiten werden also ebenfalls beeinflusst. Befindet sich ein Widget auf einer Seite mit benutzerdefinierten Beitragstypen (Singular), sind nach dieser Logik die Titel page oder post in diesem Widget dort nicht betroffen.

Um das zu beheben, benötigen wir eine andere Überprüfung, wie zum Beispiel:

$post = get_post( $id );
if ( $post instanceof WP_Post && ( $post->post_type == 'post' || $post->post_type == 'page' ) )

Warum der Titel des Navigationsmenüs ebenfalls geändert wird und wie man ihn stoppt:

WordPress wendet den the_title-Filter zweimal auf den Titel der Navigationsmenüelemente an (wenn die Menüelemente vorhandenen Beiträgen oder Seiten entsprechen).

  1. Zuerst als entsprechender Post- oder Seitentitel. Dies geschieht in der Funktion wp_setup_nav_menu_item() der Datei wp-includes/nav-menu.php.

  2. Dann als Menüpunkttitel selber. Dies geschieht in der Klasse Walker_Nav_Menu.

Für Ihre Anforderung müssen wir den the_title-Filter beide Male stoppen.

Glücklicherweise hat WordPress zwei Filter: pre_wp_nav_menu wird vor dem Filtern von Menütiteln und wp_nav_menu_items nach dem Filtern von Menütiteln ausgelöst. Mit diesen beiden Filtern können wir also zuerst den the_title-Filter für Navigationsmenüelementtitel entfernen und dann den the_title-Filter für andere Titel wieder hinzufügen.

CODE

Sie können den folgenden CODE in der functions.php-Datei des Themas oder als separates Plugin verwenden:

function wpse309151_title_update( $title, $id = null ) {
    if ( ! is_admin() && ! is_null( $id ) ) {
        $post = get_post( $id );
        if ( $post instanceof WP_Post && ( $post->post_type == 'post' || $post->post_type == 'page' ) ) {
            $new_titile = get_post_meta( $id, 'pp_new_title', true );
            if( ! empty( $new_titile ) ) {
                return $new_titile;
            }
        }
    }
    return $title;
}
add_filter( 'the_title', 'wpse309151_title_update', 10, 2 );

function wpse309151_remove_title_filter_nav_menu( $nav_menu, $args ) {
    // we are working with menu, so remove the title filter
    remove_filter( 'the_title', 'wpse309151_title_update', 10, 2 );
    return $nav_menu;
}
// this filter fires just before the nav menu item creation process
add_filter( 'pre_wp_nav_menu', 'wpse309151_remove_title_filter_nav_menu', 10, 2 );

function wpse309151_add_title_filter_non_menu( $items, $args ) {
    // we are done working with menu, so add the title filter back
    add_filter( 'the_title', 'wpse309151_title_update', 10, 2 );
    return $items;
}
// this filter fires after nav menu item creation is done
add_filter( 'wp_nav_menu_items', 'wpse309151_add_title_filter_non_menu', 10, 2 );
11
Fayaz

Der WordPress-Navigationseditor kann den Menütitel unabhängig vom Titel des Beitrags/der Seite ändern.

Wenn Sie mehr automatisierten Lösungscode benötigen, wird der Titel des Beitrags/der Seite überall mit dem the_title-Filter ersetzt, der Standardtitel des Menüelements wird jedoch mit dem nav_menu_item_title-Filter wiederhergestellt.

/**
 * Replace post/page title on home, single and archive pages.
 *
 * @param string $title   Post title
 * @param int    $post_id Post ID
 *
 * @return string New post tilte
 */
function wpse_309151_get_replace_default_title_from_meta( $title, $post_id ) {

    $post_type = get_post_type( $post_id );

    if( !is_admin() && ( $post_type === 'post' || $post_type === 'page' ) ) {

        $new_title = get_post_meta( $post_id, 'wpse_309151_post_title', true);

        if( $new_title && !empty( $new_title ) ) {
            return $new_title;
        }
    }

    return $title;
}

add_filter( 'the_title', 'wpse_309151_get_replace_default_title_from_meta', 10, 2 );

/**
 * Restore default post/page title in navigation
 *
 * @param string   $title The menu item's title.
 * @param WP_Post  $item  The current menu item.
 * @param stdClass $args  An object of wp_nav_menu() arguments.
 * @param int      $depth Depth of menu item. Used for padding.
 *
 * @return string Restored post title
 */
function wpse_309151_get_restore_default_title_for_navigation( $title, $item, $args, $depth ) {

    // Remove filter to not affect title
    remove_filter( 'the_title', 'wpse_309151_get_replace_default_title_from_meta', 10, 2 );

    $post_id = $item->object_id;
    $title   = get_the_title( $post_id );

    // Add the title filter back
    add_filter( 'the_title', 'wpse_309151_get_replace_default_title_from_meta', 10, 2 );

    return $title;
}

add_filter( 'nav_menu_item_title', 'wpse_309151_get_restore_default_title_for_navigation', 10, 4 );
3
kierzniak