将 the_title 过滤器应用于 post 标题和后端自动 social-sharing 插件,但不应用于导航菜单

Apply the_title filter to post titles AND backend auto social-sharing plugin, but not nav menu

挑战

我一直在尝试编写 一个过滤器,该过滤器将(在字符串前添加)应用于 (a) post 某种 post 类型的标题和 (b)相同 post 类型的 WordPress 管理后端供自动社交共享插件使用。

我真的很接近了。我取得了: 1. 仅添加到自定义 post_type post 标题 2. 在 custom_post 之前输入标题和所有导航菜单项 3. 添加到所有标题(post、页面、导航菜单和后端 auto-sharing 插件)

最后的第三次尝试让我充满希望,但仍然,无论我使用的函数、条件语句或组合,我都无法获得 custom_post 标题和后端社交共享插件,但没有 导航菜单项

我的代码 - 我试过的代码

我尝试了不同的条件,例如 is_admin()!is_nav_menu 以及所有导航菜单 ID。我还尝试将 post 的 ID 与菜单的 ID 进行比较。最后,我还尝试仅将过滤器添加到 loop_start,如果与其他语句结合使用,这似乎很有希望。我会清理我的代码以供您审阅,但我暂时保留这种方式,希望它有助于了解我尝试过的内容,以及我可能在这些方法中出错的地方。

// , $id = NULL
function append_album_review_to_title( $title ) {
    global $post;
    global $dont_apply_title_filter;
    $text = 'Album Review: ';
    $prepended_title = $text . $title;
/*
    $nav_menus_obj = wp_get_nav_menus();
    $nav_menu_ids = '';
    foreach( $nav_menus_obj as $nav_menu ) {
        $nav_menu_ids .= $nav_menu->term_id . ',';
    }
    rtrim($nav_menu_ids, ',');
*/
//  if ( get_post_type( $post->ID ) == 'album_review' && in_the_loop() ){
//  if ( get_post_type( $post->ID ) == 'album_review' && $id == get_the_ID() ){
//  if ( !is_nav_menu( '32057,32058,35135,32054,32056' ) ) {
//  if ( get_post_type( $post->ID ) == 'album_review' && is_nav_menu( $id ) ) {
    if ( get_post_type( $post->ID ) == 'album_review' && !$dont_apply_title_filter ) {
        //print_r( $nav_menu_ids );
        //print_r( is_nav_menu( $nav_menu_ids ) );
        return $prepended_title;
/*
    } elseif ( get_post_type( $post->ID ) == 'album_review'  ) {
        return $title;
*/
    } else {
        return $title;
    };
}
add_filter('the_title', 'append_album_review_to_title');
//add_action('save_post', 'custom_post_type_title', 100);
/*
function set_custom_title() {
    add_filter( 'the_title', 'append_album_review_to_title', 10, 2 );
}
add_action( 'loop_start', 'set_custom_title' );
*/

解决方案

function append_album_review_to_title( $title, $id = NULL ) {
    if ($id) {
        if ( get_post_type( $id ) == 'album_review' ){
            return 'Album Review: ' . $title;
        } else {
            return $title;
        }
    } else {
        return 'Album Review: ' . $title;
    };
}
add_filter('the_title', 'append_album_review_to_title', 10, 2);

说明

第一次尝试这个:

function append_album_review_to_title( $title, $id ) {
    if ( get_post_type( $id ) == 'album_review' ){
        return 'Album Review: ' . $title;
    } else {
        return $title;
    }
}
add_filter('the_title', 'append_album_review_to_title', 10, 2);

我注意到在后端,我用于 auto-share post 的社交分享插件会 return 警告,例如 missing parameter 2Notice: Trying to get property of non-object... ,所以我想到,与前端(导航菜单和循环)不同,在后端,显然 $id 没有传递给 the_title,所以我可以将其用作条件.

检查 $id 将告诉我,如果它是 true,我们在前端,如果它是 false,那么我们在后端post 查看。

这段代码完成了我需要的(即,在循环中修改 post 标题,不修改导航菜单项,并修改 the_title 以供后端社交共享插件使用):