Problembeschreibung:
Lassen Sie mich zuerst die Frage umformulieren. Du möchtest:
Setzen Sie allen einen neuen Titel post
und geben Sie ihn page
aus einem Metafeld ein.
Sie möchten, dass dies überall geschieht (Startseite, einzelne Seite, Widgets usw.)
Sie möchten jedoch nicht, dass diese Titeländerung erfolgt, wenn sich der Titel im Navigationsmenü befindet.
Lösung:
Bevor ich Ihnen den CODE gebe, möchte ich zunächst einige Punkte erläutern (basierend auf Ihrem CODE):
So ändern Sie die Titel aller Beiträge und Seiten:
Sie kennen die Verwendung von the_title
Filtern bereits. Wenn Sie jedoch auf alle Titel abzielen post
und page
diese eingeben möchten (jedoch keine benutzerdefinierten Beitragstypen), gilt folgende Bedingung:
is_singular(array('post','page')) || is_archive() || is_home()
wird nicht funktionieren. Beispielsweise wird der benutzerdefinierte Beitragstyp auf einer Archivseite oder der Startseite geändert. Diese Bedingung prüft nicht, ob der Titel, den wir filtern, ein page
oder ein post
Typ ist. Stattdessen wird überprüft, ob die Seite selbst entweder eine Singular- ( post
oder page
) oder eine Archivseite (Kategorie, Tag usw.) oder die Startseite ist. Daher sind auch benutzerdefinierte Beitragstypen auf diesen Seiten betroffen. Wenn sich auf einer benutzerdefinierten Post-Typ-Seite (Singular) ein Widget befindet, sind diese Logik page
oder post
Titel in diesem Widget dort nicht betroffen.
Um dies zu beheben, benötigen wir eine andere Prü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 Sie ihn stoppen können:
WordPress wendet den the_title
Filter zweimal auf den Titel der Navigationsmenüelemente an (wenn die Menüelemente vorhandenen Posts oder Seiten entsprechen).
Zuerst als entsprechender Beitrags- oder Seitentitel. Dies geschieht in der wp_setup_nav_menu_item()
Funktion der wp-includes/nav-menu.php
Datei.
Dann als Menüelementtitel selbst. Dies geschieht in der Walker_Nav_Menu
Klasse.
Für Ihre Anforderung müssen wir den the_title
Filter beide Male stoppen .
Glücklicherweise hat WordPress zwei Filter: pre_wp_nav_menu
Brände vor dem Filtern von Menütiteln und wp_nav_menu_items
Brände nach dem Filtern von Menütiteln. Mit diesen beiden Filtern können wir also zuerst den the_title
Filter für Titel von Navigationsmenüelementen 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
Themendatei 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 );
if( ! is_nav_menu_item( $id ) ){ ... }
innerhalb Ihres Filterrückrufs versucht , das Filtern des Titels von Navigationsmenüelementen zu vermeiden?