Problembeschreibung:
Lassen Sie mich zuerst die Frage umformulieren. Du möchtest:
Setzen Sie allen einen neuen Titel postund geben Sie ihn pageaus 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_titleFiltern bereits. Wenn Sie jedoch auf alle Titel abzielen postund pagediese 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 pageoder ein postTyp ist. Stattdessen wird überprüft, ob die Seite selbst entweder eine Singular- ( postoder 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 pageoder postTitel 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_titleFilter 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.phpDatei.
Dann als Menüelementtitel selbst. Dies geschieht in der Walker_Nav_MenuKlasse.
Für Ihre Anforderung müssen wir den the_titleFilter beide Male stoppen .
Glücklicherweise hat WordPress zwei Filter: pre_wp_nav_menuBrände vor dem Filtern von Menütiteln und wp_nav_menu_itemsBrände nach dem Filtern von Menütiteln. Mit diesen beiden Filtern können wir also zuerst den the_titleFilter für Titel von Navigationsmenüelementen entfernen und dann den the_titleFilter für andere Titel wieder hinzufügen .
CODE
Sie können den folgenden CODE in der functions.phpThemendatei 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?