Zastosuj filtr_title() w tytule posta i strony, ale nie w tytule menu
Opis problemu:
Pozwólcie, że najpierw przeformułuję pytanie. Chcesz:
-
Ustaw nowy tytuł dla wszystkich
post
Ipage
wpisz z metapola. -
Chcesz, aby działo się to wszędzie (strona główna, pojedyncza strona, widżety itp.)
-
Jednak nie chcesz, aby ta zmiana tytułu miała miejsce, jeśli tytuł znajduje się w menu nawigacji.
Rozwiązanie:
Zanim podam Ci KOD, pozwól, że najpierw wyjaśnię kilka punktów (w oparciu o Twój KOD):
Jak zmienić tytuły wszystkich postów i stron:
Znasz już zastosowanie the_title
filtr. Jeśli jednak chcesz kierować reklamy na wszystkich post
I page
wpisz tytuły (ale nie niestandardowe typy postów), a następnie swój warunek:
is_singular(array('post','page')) || is_archive() || is_home()
nie będzie działać. Na przykład zmieni niestandardowy typ postu również na stronie archiwum lub stronie głównej. Warunek ten nie sprawdza, czy tytuł, który filtrujemy, to a page
Lub post
typ. Zamiast tego sprawdza, czy sama strona jest liczbą pojedynczą (post
Lub page
) lub jest to strona archiwum (kategoria, tag itp.) lub strona główna. Dotyczy to również niestandardowych typów postów na tych stronach. Dodatkowo, jeśli na stronie niestandardowego typu postu (w liczbie pojedynczej) znajduje się widżet, to zgodnie z tą logiką page
Lub post
tytuły w tym widżecie nie będą miały tam wpływu.
Aby to naprawić, potrzebujemy innego sprawdzenia, na przykład:
$post = get_post( $id );
if ( $post instanceof WP_Post && ( $post->post_type == 'post' || $post->post_type == 'page' ) )
Dlaczego tytuł menu nawigacji również uległ zmianie i jak to zatrzymać:
Obowiązuje WordPress the_title
przefiltruj dwukrotnie tytuł pozycji menu nawigacji (jeśli pozycje menu odpowiadają istniejącym postom lub stronom).
-
Najpierw jako odpowiedni tytuł postu lub strony. Dzieje się to w
wp_setup_nav_menu_item()
funkcja zwp-includes/nav-menu.php
plik. -
Następnie jako sam tytuł pozycji Menu. Dzieje się to w
Walker_Nav_Menu
klasa.
Ze względu na Twoje wymagania musimy zatrzymać the_title
filtruj oba czasy.
Na szczęście WordPress ma dwa filtry: pre_wp_nav_menu
uruchamia się przed filtrowaniem tytułów menu i wp_nav_menu_items
uruchamia się po filtrowaniu tytułów menu. Możemy więc użyć tych dwóch filtrów, aby najpierw usunąć the_title
filtruj tytuły elementów menu nawigacyjnego, a następnie dodaj the_title
przefiltruj ponownie, aby zobaczyć inne tytuły.
KOD
Możesz użyć następującego KODU w motywie functions.php
plik lub jako osobna wtyczka:
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 );