The Challenge
我一直在尝试编写一个过滤器,该过滤器适用于(a)特定帖子类型的帖子标题和(b)相同的帖子类型的WordPress管理后端,以供自动社交共享插件使用。
我已经非常接近了。 我实现了:1. 仅在自定义post_type帖子标题前置2. 在custom_post类型标题和所有导航菜单项之前添加前缀3. 在所有标题(帖子、页面、导航菜单和后端自动共享插件)之前
添加前缀最后一次,第三次尝试让我充满希望,但是,无论我使用什么功能,条件语句或组合,我都无法获得custom_post标题和后端社交共享插件,但无法获得导航菜单项。
我的代码 - 我尝试过的
我尝试了不同的条件,例如所有导航菜单 ID 的 is_admin()
和 !is_nav_menu
。 我还尝试将帖子的 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);
我注意到在后端,我用来自动共享帖子的社交共享插件会返回missing parameter 2
和Notice: Trying to get property of non-object...
等警告,所以我想到与前端(导航菜单和循环)不同,在后端,显然$id
没有传递给the_title
,所以我可以将其用作条件。
出于我的目的,检查$id
会告诉我,如果它是true
,我们在前端,如果它是false
,那么我们就在后端帖子视图。
这段代码完成了我需要的(即,在循环中修改帖子标题,不要修改导航菜单项,并修改the_title
以供后端社交共享插件使用):