问题描述:
让我先重新表述一下问题。您想:
将新标题设置为全部post
和page
从元字段键入。
您希望这种情况随处可见(主页、单页、小部件等)
但是,如果标题位于导航菜单上,则不希望发生此标题更改。
解决方案:在我给出代码之前,让我先解释几点(基于您的代码):
如何更改所有帖子和页面的标题:
您已经知道
the_title
滤器但是,如果您想针对所有
post
和
page
键入标题(但不是自定义帖子类型),然后输入您的条件:
is_singular(array(\'post\',\'page\')) || is_archive() || is_home()
不起作用。例如,它将更改存档页或主页上的自定义帖子类型。此条件不会检查我们筛选的标题是否为
page
或
post
类型相反,它检查页面本身是否为单数(
post
或
page
) 或者是归档(类别、标签等)页面或主页。因此,这些页面中的自定义帖子类型也会受到影响。此外,如果自定义post类型(单数)页面中有一个小部件,则根据此逻辑,
page
或
post
该小部件中的标题不会受到影响。
要解决这个问题,我们需要一个不同的检查,例如:
$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 );