WordPress

Zastosuj filtr_title() w tytule posta i strony, ale nie w tytule menu

  • 21 lipca, 2018
  • 4 min read
Zastosuj filtr_title() w tytule posta i strony, ale nie w tytule menu


Opis problemu:

Pozwólcie, że najpierw przeformułuję pytanie. Chcesz:

  1. Ustaw nowy tytuł dla wszystkich post I page wpisz z metapola.

  2. Chcesz, aby działo się to wszędzie (strona główna, pojedyncza strona, widżety itp.)

  3. 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.

Warto przeczytać!  Jak uzyskać roczną subskrypcję Spotify (zaoszczędź ponad 32 USD)

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).

  1. Najpierw jako odpowiedni tytuł postu lub strony. Dzieje się to w wp_setup_nav_menu_item() funkcja z wp-includes/nav-menu.php plik.

  2. 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 );


Źródło

Warto przeczytać!  php — WPML post_joins na przetłumaczonych elementach