在帖子和页面标题中应用_title()过滤器,但不在菜单标题中应用

时间:2018-07-21 作者:Ranuka

我使用以下代码更改WordPress的标题postspages. 但它也改变了导航菜单项的标题,这是我想要避免的。

我想更改中帖子和页面的标题:home page, 全部的archive pages 以及所有widgets (最近发布小部件、随机发布小部件等)

堆栈溢出和WP堆栈交换中都存在类似的问题,建议使用in_the_loop() 作用不幸的是,它对我不起作用,因为如果我放置它,它也会影响侧边栏小部件。

也就是说,如果我使用in_the_loop() 作用the_title 过滤器不影响recent posts widget, random post widget

那我怎么申请呢the_title 仅过滤postpage 标题,但不是菜单标题?

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

3 个回复
最合适的回答,由SO网友:Fayaz 整理而成

问题描述:

让我先重新表述一下问题。您想:

将新标题设置为全部postpage 从元字段键入。

您希望这种情况随处可见(主页、单页、小部件等)

但是,如果标题位于导航菜单上,则不希望发生此标题更改。

解决方案:在我给出代码之前,让我先解释几点(基于您的代码):

如何更改所有帖子和页面的标题:

您已经知道the_title 滤器但是,如果您想针对所有postpage 键入标题(但不是自定义帖子类型),然后输入您的条件:

is_singular(array(\'post\',\'page\')) || is_archive() || is_home()
不起作用。例如,它将更改存档页或主页上的自定义帖子类型。此条件不会检查我们筛选的标题是否为pagepost 类型相反,它检查页面本身是否为单数(postpage) 或者是归档(类别、标签等)页面或主页。因此,这些页面中的自定义帖子类型也会受到影响。此外,如果自定义post类型(单数)页面中有一个小部件,则根据此逻辑,pagepost 该小部件中的标题不会受到影响。

要解决这个问题,我们需要一个不同的检查,例如:

$post = get_post( $id );
if ( $post instanceof WP_Post && ( $post->post_type == \'post\' || $post->post_type == \'page\' ) )
为什么导航菜单标题也会更改(&H);如何停止:WordPress应用the_title 在导航菜单项的标题上过滤两次(如果菜单项与现有帖子或页面相对应)。

首先作为相应的帖子或页面标题。这种情况发生在wp_setup_nav_menu_item() 的功能wp-includes/nav-menu.php 文件

然后作为菜单项标题本身。这种情况发生在Walker_Nav_Menu

根据您的要求,我们需要停止the_title 过滤两次。

幸运的是,WordPress有两个过滤器:pre_wp_nav_menu 在筛选菜单标题和wp_nav_menu_items 过滤菜单标题后激发。因此,我们可以使用这两个过滤器首先删除the_title 筛选导航菜单项标题,然后添加the_title 再次过滤其他标题。

代码

您可以在主题的functions.php 文件或作为单独的插件:

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

SO网友:kierzniak

WordPress导航编辑器能够更改菜单标题,而不考虑帖子/页面的标题。

如果您需要更多的自动化解决方案,下面的代码将使用the_title 使用筛选但还原菜单项的默认标题nav_menu_item_title 滤器

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

SO网友:anmari

如果你有post对象(获取_ID();或$post->ID;基本相同)参见https://stackoverflow.com/questions/22351038/get-the-current-page-id-inside-wordpress-plugin-page, 那么你也应该能够使用https://developer.wordpress.org/reference/functions/get_post_type/ 检查类型或

if (in_array($post->post_type, array(\'post\', \'page\')) {
... swop the title
}

结束

相关推荐

如何在QUERY_POSTS中的自定义字段上放置orderby

我在我的query\\u帖子中有以下查询,希望向其中添加order by。Order by将位于另一个自定义字段上,并按desc Order排序。这是我现有的查询。//show all active posts for this taxonomy query_posts( array( \'post_type\' => APP_POST_TYPE, \'post_status\' => \'publish\', APP_CUSTOM_TAX