重新安排答案以避免混淆
虽然以下解决方案可能有效,但并不理想
add_filter( \'the_title\', function ( $title, $post_id )
{
if ( \'album_review\' === get_post_type( $post_id ) )
$title = \'Album Review: \' . $title;
return $title;
}, 10, 2 );
问题是,任何使用
the_title()
或
get_the_title()
将受此筛选器的影响,其中包括所有查询和导航菜单。如果您有来自
album_review
在导航菜单中输入后,此过滤器也会作用于这些标题。
正如您正确指出的那样in_the_loop()
条件仅针对主查询的目标,没有与目标自定义查询和导航菜单项类似的内容。
模板标记的最大问题是the_title()
和the_content()
因为他们不知道使用它们的上下文,这使得他们很难成为目标。
仅从导航菜单中删除标题过滤器可能是一个相当大的问题,因为正如我所说,the_title()
不知道使用它的上下文。我能想到的唯一可能的方法是在wp_nav_menu_args
在导航菜单项标题之前运行的过滤器,然后通过wp_page_menu
或者wp_nav_menu
过滤器,取决于是否设置了回退
您可以尝试以下操作:
add_filter( \'wp_nav_menu_args\', function ( $args )
{
// Remove the title filter for a while so we do not alter nav menu titles
remove_filter( \'the_title\', \'wpse_219222_customize_title\', 10, 2 );
// Re-apply the title filter after we add titles
$filter = ( \'wp_page_menu\' === $args[\'fallback_cb\'] ) ? \'wp_page_menu\' : \'wp_nav_menu\';
add_filter( $filter, \'wpse_219222_add_title_filter_back\' );
return $args;
});
function wpse_219222_add_title_filter_back( $nav_menu )
{
add_filter( \'the_title\', \'wpse_219222_customize_title\', 10, 2 );
return $nav_menu;
}
/**
* Our custom call back function which will be hooked to the_title filter
*/
function wpse_219222_customize_title( $title, $post_id )
{
if ( \'album_review\' === get_post_type( $post_id ) )
$title = \'Album Review: \' . $title;
return $title;
}
其他有用信息-如果需要,要从其他查询中删除筛选器,如果需要将筛选器应用于特定查询,我喜欢将自定义查询变量传递给查询,然后在中进行检查
pre_get_posts
然后用它来决定是否必须应用我的过滤器。类似以下内容将在自定义查询中起作用
add_action( \'pre_get_posts\', function ( $q )
{
if ( 1 === $q->get( \'custom_title\' ) )
{
add_filter( \'the_title\', function ( $title, $post_id )
{
if ( \'album_review\' === get_post_type( $post_id ) )
$title = \'Album Review: \' . $title;
return $title;
}, 10, 2 );
}
});
然后你就可以通过
\'custom_title\' => 1
将筛选器仅应用于该特定查询
出于兴趣和玩转的目的,您也可以这样做,以主页上的主查询和任何自定义查询为目标\'custom_title\' => 1
已通过
add_action( \'pre_get_posts\', function ( $q )
{
if ( $q->is_home()
&& $q->is_main_query()
) {
$q->set( \'custom_title\', 1 );
}
if ( 1 === $q->get( \'custom_title\' ) )
{
add_filter( \'the_title\', function ( $title, $post_id )
{
if ( \'album_review\' === get_post_type( $post_id ) )
$title = \'Album Review: \' . $title;
return $title;
}, 10, 2 );
}
});
Here 是@birgire提出的另一个很棒的过滤想法,如果您需要在小部件中只针对帖子标题,可以对其进行调整和修改
您可以将此方法与所有其他方法结合使用,并且您认为合适