Mô tả vấn đề:
Hãy để tôi viết lại câu hỏi đầu tiên. Bạn muốn:
Đặt tiêu đề mới cho tất cả postvà pagenhập từ một trường meta.
Bạn muốn điều này xảy ra ở mọi nơi (trang chủ, trang đơn, widget, v.v.)
Tuy nhiên, bạn không muốn thay đổi tiêu đề này xảy ra nếu tiêu đề nằm trên Menu điều hướng.
Giải pháp:
Trước khi tôi đưa cho bạn MÃ, hãy để tôi giải thích một vài điểm trước (dựa trên MÃ của bạn):
Cách thay đổi tiêu đề của tất cả các bài viết và trang:
Bạn đã biết việc sử dụng the_titlebộ lọc. Tuy nhiên, nếu bạn muốn nhắm mục tiêu tất cả postvà pageloại tiêu đề (nhưng không phải loại bài đăng tùy chỉnh), thì điều kiện của bạn:
is_singular(array('post','page')) || is_archive() || is_home()
sẽ không làm việc. Ví dụ: nó cũng sẽ thay đổi loại bài đăng tùy chỉnh trên trang lưu trữ hoặc trang chủ. Điều kiện này không kiểm tra xem tiêu đề chúng tôi đang lọc là một pagehoặc postloại. Thay vào đó, nó kiểm tra xem chính trang đó là số ít ( posthoặc page) hay đó là trang lưu trữ (danh mục, thẻ, v.v.) hoặc trang chủ. Vì vậy, các loại bài đăng tùy chỉnh trong các trang này cũng bị ảnh hưởng. Ngoài ra, nếu có một tiện ích trong trang loại bài đăng tùy chỉnh (số ít), thì theo logic này, pagehoặc posttiêu đề trong tiện ích đó sẽ không bị ảnh hưởng ở đó.
Để khắc phục điều đó, chúng tôi cần một kiểm tra khác, như:
$post = get_post( $id );
if ( $post instanceof WP_Post && ( $post->post_type == 'post' || $post->post_type == 'page' ) )
Tại sao tiêu đề Menu điều hướng cũng bị thay đổi & cách dừng nó:
WordPress áp dụng the_titlebộ lọc hai lần trên tiêu đề của các mục menu điều hướng (nếu các mục menu tương ứng với các bài đăng hoặc trang hiện có).
Đầu tiên là bài viết hoặc tiêu đề trang tương ứng. Điều này xảy ra trong wp_setup_nav_menu_item()chức năng của wp-includes/nav-menu.phptập tin.
Sau đó, như tiêu đề mục Menu chính nó. Điều này xảy ra trong Walker_Nav_Menulớp.
Đối với yêu cầu của bạn, chúng tôi cần dừng the_titlebộ lọc cả hai lần.
May mắn thay, WordPress có hai bộ lọc: pre_wp_nav_menukích hoạt trước khi lọc tiêu đề menu và wp_nav_menu_itemskích hoạt sau khi lọc tiêu đề menu. Vì vậy, trước tiên chúng ta có thể sử dụng hai bộ lọc này để loại bỏ the_titlebộ lọc cho các tiêu đề mục menu điều hướng và sau đó thêm the_titlelại bộ lọc cho các tiêu đề khác.
MÃ
Bạn có thể sử dụng CODE sau trong functions.phptệp của chủ đề hoặc dưới dạng plugin riêng biệt:
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 ) ){ ... }trong cuộc gọi lại bộ lọc của mình để tránh lọc tiêu đề của các mục menu điều hướng chưa?