将 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 2
和 Notice: Trying to get property of non-object...
,所以我想到,与前端(导航菜单和循环)不同,在后端,显然 $id
没有传递给 the_title
,所以我可以将其用作条件.
检查 $id
将告诉我,如果它是 true
,我们在前端,如果它是 false
,那么我们在后端post 查看。
这段代码完成了我需要的(即,在循环中修改 post 标题,不修改导航菜单项,并修改 the_title
以供后端社交共享插件使用):
挑战
我一直在尝试编写 一个过滤器,该过滤器将(在字符串前添加)应用于 (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 2
和 Notice: Trying to get property of non-object...
,所以我想到,与前端(导航菜单和循环)不同,在后端,显然 $id
没有传递给 the_title
,所以我可以将其用作条件.
检查 $id
将告诉我,如果它是 true
,我们在前端,如果它是 false
,那么我们在后端post 查看。
这段代码完成了我需要的(即,在循环中修改 post 标题,不修改导航菜单项,并修改 the_title
以供后端社交共享插件使用):