通常所有内容都包含在$labels[\'menu_name\']
cpt注册的参数打印在菜单中,因此将计数放置在正确的位置span
有没有,but 有两个问题:
你必须友好地统计帖子,所以你不能只在那里写html,即使你在$labels[\'menu_name\']
选项或注册时,范围被去掉,因为在打印菜单之前,参数的值被包装在esc_attr
第二个“问题”,不是真正的问题,而是解决方案!
事实上esc_attr
函数触发筛选器挂钩attribute_escape
, 我们可以使用它来计算挂起的帖子数,然后输出正确的html unescaped。
如果从中删除清理功能,我们必须非常小心esc_attr
因为这是一个在WP中多次使用的函数,也是一个与安全性相关的函数。因此,我们必须仅将行为隔离到管理菜单,并且仅在特定情况下。
此外,我们可以在完成工作后再次添加过滤器,这样只需删除一次。
现在唯一的问题是如何理解哪个是正确的菜单项,为其删除过滤器并添加计数。
我们唯一的机会是插入一种占位符,让我们能够识别菜单项。换句话说,当您注册cpt时,您必须添加uncommon
字符串到$labels[\'menu_name\']
:
$labels = array(
/** This do the magic ;) ! */
\'menu_name\' => _x(\'My CPT %%PENDING_COUNT%%\', \'My CPT post type label menu_name\', \'mytextdomain\'),
\'name\' => _x(\'My CPT\',\'My CPT label name\',\'mytextdomain\'),
\'singular_name\' => _x(\'My CPT\',\'My CPT label singular_name\',\'mytextdomain\'),
\'all_items\' => _x(\'All My CPT\',\'My CPT label all_items\',\'mytextdomain\'),
\'add_new\' => _x(\'Add New\',\'My CPT label add_new\',\'mytextdomain\'),
\'add_new_item\' => _x(\'Add New My CPT\',\'My CPT label add_new_item\',\'mytextdomain\'),
\'edit_item\' => _x(\'Edit My CPT\',\'My CPT label edit_item\',\'mytextdomain\'),
\'new_item\' => _x(\'New My CPT\',\'My CPT label new_item\',\'mytextdomain\'),
\'view_item\' => _x(\'View My CPT\',\'My CPTlabel view_item\',\'mytextdomain\'),
\'search_items\' => _x(\'Search My CPT\',\'My CPT label search_items\',\'mytextdomain\'),
\'not_found\' => _x(\'My CPT not found\',\'My CPT label not_found\',\'mytextdomain\'),
\'not_found_in_trash\' => _x(\'My CPT not found in trash\',\'My CPT label not_found_in_trash\',\'mytextdomain\'),
\'parent_item_colon\' => _x(\'Parent:\',\'My CPT label parent_item_colon\',\'mytextdomain\')
);
$args = array(
\'labels\' => $labels,
... other args here
)
register_post_type( \'my_cpt\', $args );
一旦
%%PENDING_COUNT%%
当
esc_attr
对于包含该文本的字符串调用,我们运行我们的工作:
add_action(\'auth_redirect\', \'add_pending_count_filter\'); // modify esc_attr on auth_redirect
add_action(\'admin_menu\', \'esc_attr_restore\'); // restore on admin_menu (very soon)
function add_pending_count_filter() {
add_filter(\'attribute_escape\', \'remove_esc_attr_and_count\', 20, 2);
}
function esc_attr_restore() {
remove_filter(\'attribute_escape\', \'remove_esc_attr_and_count\', 20, 2);
}
function remove_esc_attr_and_count( $safe_text = \'\', $text = \'\' ) {
if ( substr_count($text, \'%%PENDING_COUNT%%\') ) {
$text = trim( str_replace(\'%%PENDING_COUNT%%\', \'\', $text) );
// run only once!
remove_filter(\'attribute_escape\', \'remove_esc_attr_and_count\', 20, 2);
$safe_text = esc_attr($text);
// remember to set the right cpt name below
$count = (int)wp_count_posts( \'my_cpt\', \'readable\' )->pending;
if ( $count > 0 ) {
// we have pending, add the count
$text = esc_attr($text) . \'<span class="awaiting-mod count-\' . $count . \'"><span class="pending-count">\' . $count . \'</span></span>\';
return $text;
}
}
return $safe_text;
}
That\'s all, and it works!
只有一个小问题:如果通过快速编辑发布挂起的帖子,挂起的计数不会更新,因为快速编辑使用ajax,要更新numebr,需要使用一些js。如果你想的话,就去做吧。