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ả post
và page
nhậ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_title
bộ lọc. Tuy nhiên, nếu bạn muốn nhắm mục tiêu tất cả post
và page
loạ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 page
hoặc post
loại. Thay vào đó, nó kiểm tra xem chính trang đó là số ít ( post
hoặ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, page
hoặc post
tiê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_title
bộ 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.php
tập tin.
Sau đó, như tiêu đề mục Menu chính nó. Điều này xảy ra trong Walker_Nav_Menu
lớp.
Đối với yêu cầu của bạn, chúng tôi cần dừng the_title
bộ lọc cả hai lần.
May mắn thay, WordPress có hai bộ lọc: pre_wp_nav_menu
kích hoạt trước khi lọc tiêu đề menu và wp_nav_menu_items
kí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_title
bộ lọc cho các tiêu đề mục menu điều hướng và sau đó thêm the_title
lại bộ lọc cho các tiêu đề khác.
MÃ
Bạn có thể sử dụng CODE sau trong functions.php
tệ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?