向管理菜单添加数量的新帖子(POST_STATUS=Pending

时间:2013-09-06 作者:Ronnieinspain

What I have:自定义帖子类型。创建新帖子的前端过帐表单post_status = pending 直到手动审阅并将状态更改为“已发布”。

What I need:而我可以去帖子列表,看看是否有“待定”的帖子需要授权;我想要的是添加一个圆形图标,里面有一个数字,就像WordPress在有新评论时所做的那样。我可以编写代码来提取挂起帖子的数量,但我不知道如何将其插入管理菜单。

这是wp在添加新注释时创建的代码:

<span class="awaiting-mod count-6"><span class="pending-count">1</span></span>
一个显示一条新评论的屏幕截图,我需要相同的条目。

我已经寻找了一段时间的解决方案,但在任何地方都找不到;如果没有人能回答我的问题,我的下一站就是拆开WP核心,看看他们是如何做到的。

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

通常所有内容都包含在$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!

enter image description here

只有一个小问题:如果通过快速编辑发布挂起的帖子,挂起的计数不会更新,因为快速编辑使用ajax,要更新numebr,需要使用一些js。如果你想的话,就去做吧。

结束

相关推荐

Admin login not working

我无法以管理员身份登录wordpress网站。我试图更改密码和其他一些东西,但没有结果。发生的事情是,我返回到登录页面,没有消息。奇怪的是,我可以作为另一个用户登录,但我没有所需的权限。我检查了PHP日志文件,在那里找不到任何东西。我尝试过以私人模式进行,但也不起作用。建议我应该尝试什么?