Áp dụng bộ lọc the_title () trong tiêu đề bài viết & trang, nhưng không phải trong tiêu đề menu


8

Tôi sử dụng đoạn mã sau để thay đổi tiêu đề của bài viếttrang WordPress . Nhưng nó cũng thay đổi tiêu đề mục menu, điều mà tôi muốn tránh.

Tôi muốn thay đổi tiêu đề của bài đăng và trang trong: trang chủ , tất cả các trang lưu trữ và tất cả các tiện ích (tiện ích bài đăng gần đây, tiện ích bài đăng ngẫu nhiên, v.v.)

Có những câu hỏi tương tự trong cả Stack Overflow và WP Stack Exchange đề xuất sử dụng in_the_loop()chức năng. Thật không may, nó không hoạt động với tôi, vì nếu tôi đặt nó, nó cũng ảnh hưởng đến các widget bên.

Điều đó có nghĩa là, nếu tôi sử dụng in_the_loop()chức năng, the_titlebộ lọc không ảnh hưởng recent posts widget, random post widgetv.v.

Vậy làm thế nào tôi có thể áp dụng the_titlebộ lọc cho chỉ postpagetiêu đề, nhưng không phải tiêu đề menu?

function pppp_title_update( $title, $id = null ) {

    if ( ! is_admin() ) {
       if(is_singular(array('post','page')) || is_archive() || is_home()){
            if(in_the_loop()){
                $current_post_id = get_the_ID();
                $new_titile = get_post_meta($current_post_id, 'pp_new_title',true);
                return $new_titile;  
            }                     
       } 
    }

    return $title;
}
add_filter( 'the_title', 'pppp_title_update', 10, 2 );

Bạn đã thử ví dụ 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?
bạch dương

1
if( ! is_nav_menu_item( $id ) )kiểm tra sẽ loại trừ một liên kết mục menu điều hướng tùy chỉnh, tuy nhiên, nếu chính mục menu điều hướng là một trang hoặc bài đăng, nó sẽ được lọc hai lần với the_titlebộ lọc. Trong trường hợp đó, điều kiện này sẽ chỉ hoạt động một lần (nghĩa là không the_titleđược kích hoạt để lọc tiêu đề bài đăng / trang gốc trong menu).
Fayaz

Câu trả lời:


16

Mô tả vấn đề:

Hãy để tôi viết lại câu hỏi đầu tiên. Bạn muốn:

  1. Đặt tiêu đề mới cho tất cả postpagenhập từ một trường meta.

  2. Bạn muốn điều này xảy ra ở mọi nơi (trang chủ, trang đơn, widget, v.v.)

  3. 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ả postpageloạ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ó).

  1. Đầ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.

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

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

1
Cảm ơn câu trả lời chi tiết. Có vẻ như điều này sẽ được làm việc tốt. Cảm ơn một lần nữa ... Nhưng tôi đang trên một chuyến đi. Tôi sẽ kiểm tra câu trả lời của bạn vào thứ Sáu này và cho bạn biết kết quả.
Ranuka

Không sao đâu, hãy dành thời gian của bạn.
Fayaz

1
Điều này được làm việc mà không có bất kỳ vấn đề. Cảm ơn câu trả lời và giải thích :-)
Ranuka

4

Trình chỉnh sửa điều hướng WordPress có khả năng thay đổi tiêu đề menu bất kể tiêu đề của bài đăng / trang.

Nếu bạn cần thêm mã giải pháp tự động bên dưới, sẽ thay thế tiêu đề của bài đăng / trang ở mọi nơi bằng cách sử dụng the_titlebộ lọc nhưng khôi phục tiêu đề mặc định của mục menu bằng nav_menu_item_titlebộ lọc.

/**
 * Replace post/page title on home, single and archive pages.
 *
 * @param string $title   Post title
 * @param int    $post_id Post ID
 *
 * @return string New post tilte
 */
function wpse_309151_get_replace_default_title_from_meta( $title, $post_id ) {

    $post_type = get_post_type( $post_id );

    if( !is_admin() && ( $post_type === 'post' || $post_type === 'page' ) ) {

        $new_title = get_post_meta( $post_id, 'wpse_309151_post_title', true);

        if( $new_title && !empty( $new_title ) ) {
            return $new_title;
        }
    }

    return $title;
}

add_filter( 'the_title', 'wpse_309151_get_replace_default_title_from_meta', 10, 2 );

/**
 * Restore default post/page title in navigation
 *
 * @param string   $title The menu item's title.
 * @param WP_Post  $item  The current menu item.
 * @param stdClass $args  An object of wp_nav_menu() arguments.
 * @param int      $depth Depth of menu item. Used for padding.
 *
 * @return string Restored post title
 */
function wpse_309151_get_restore_default_title_for_navigation( $title, $item, $args, $depth ) {

    // Remove filter to not affect title
    remove_filter( 'the_title', 'wpse_309151_get_replace_default_title_from_meta', 10, 2 );

    $post_id = $item->object_id;
    $title   = get_the_title( $post_id );

    // Add the title filter back
    add_filter( 'the_title', 'wpse_309151_get_replace_default_title_from_meta', 10, 2 );

    return $title;
}

add_filter( 'nav_menu_item_title', 'wpse_309151_get_restore_default_title_for_navigation', 10, 4 );

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.