从add_filter()挂钩效果中排除wordpress菜单

时间:2019-12-27 11:20:39

标签: php wordpress hook add-filter

所以我有这段代码/钩子将添加“ Blog:”或“ Review:”,具体取决于Wordpress博客标题文章顶部的每种文章类型。

add_filter( 'the_title', 'prepend_post_type', 10, 2 );
function prepend_post_type( $title, $id ) {
    if( is_home() && is_front_page() ) {
        $post_type = get_post_type( $id );
        $types = array (
            'post' => 'Blog',
            'gawe_review' => 'Review'
        );

        return '<small>' . $types[$post_type] . ': </small><br>' . $title;
    }
    return $title;
}

问题是,此代码还会影响我的标题菜单。如何设置仅适用于博客文章的钩子?

1 个答案:

答案 0 :(得分:0)

WordPress有两个过滤器:pre_wp_nav_menu在过滤菜单标题之前触发,而wp_nav_menu_items在过滤菜单标题之后触发。因此,我们可以使用这两个过滤器先删除导航菜单项标题的the_title过滤器,然后再为其他标题再次添加the_title过滤器。

检查此链接,我从这里找到了解决方案。https://wordpress.stackexchange.com/questions/309151/apply-the-title-filter-in-post-page-title-but-not-in-menu-title

function wpse309151_title_update( $title, $id = null ) {
    if( is_home() && is_front_page() && ! is_nav_menu_item( $id )) {
        $post_type = get_post_type( $id );
        $types = array (
            'post' => 'Blog',
            'gawe_review' => 'Review'
        );

        return '<small>' . $types[$post_type] . ': </small><br>' . $title;
    }
    return $title;
}
add_filter( 'the_title', 'wpse309151_title_update', 10, 2 );

function wpse309151_remove_title_filter_nav_menu( $nav_menu, $args ) {
    remove_filter( 'the_title', 'wpse309151_title_update', 10, 2 );
    return $nav_menu;
}

add_filter( 'pre_wp_nav_menu', 'wpse309151_remove_title_filter_nav_menu', 10, 2 );

function wpse309151_add_title_filter_non_menu( $items, $args ) {
    add_filter( 'the_title', 'wpse309151_title_update', 10, 2 );
    return $items;
}

add_filter( 'wp_nav_menu_items', 'wpse309151_add_title_filter_non_menu', 10, 2 );