在为 WordPress开发插件的时候,有时候我们需要添加一些消息提醒到后台菜单,类似主题插件升级或待审核评论提醒,可是 WordPress 并没有我们提供这样的接口,研究了一些已经实现了类似功能的插件,在网上研究了很久,发现实现这个功能的方法还不止一个。
通过添加提醒消息到 add_menu_classes filter 的方法
这种方法最为灵活,可以在开发 WordPress Theme的时候,添加提醒消息到已有的菜单项目上。
add_filter( 'add_menu_classes', 'show_pending_number');
function show_pending_number( $menu ) {
$type = "animals";
$status = "pending";
$num_posts = wp_count_posts( $type, 'readable' );
$pending_count = 0;
if ( !empty($num_posts->$status) )
$pending_count = $num_posts->$status;
// 需要添加提醒的菜单项目
if ($type == 'post') {
$menu_str = 'edit.php';
// 支持自定义文章类型
} else {
$menu_str = 'edit.php?post_type=' . $type;
}
// 遍历菜单,找到需要添加的菜单项目,添加提醒
foreach( $menu as $menu_key => $menu_data ) {
if( $menu_str != $menu_data[2] )
continue;
$menu[$menu_key][0] .= " <span class='update-plugins count-$pending_count'><span class='plugin-count'>" . number_format_i18n($pending_count) . '</span></span>';
}
return $menu;
}
AnsPress 的实现方法
这种实现方法是通过直接添加提醒消息字符串到菜单名称标签后面的方法实现的,比较直接,适合需要添加提醒消息到新创建菜单的时候使用。
add_menu_page( 'AnsPress', 'AnsPress'.$counts['total'], 'delete_pages', 'anspress', array( $this, 'dashboard_page' ), ANSPRESS_URL . '/assets/answer.png', $pos );
WooCommerce的实现方法
这种方法和上面 AnsPress 的方法类似,也是直接把提醒消息添加到了菜单名称标签后面。
if ( apply_filters( 'woocommerce_include_processing_order_count_in_menu', true ) && current_user_can( 'manage_woocommerce' ) && ( $order_count = wc_processing_order_count() ) ) {
foreach ( $submenu['woocommerce'] as $key => $menu_item ) {
if ( 0 === strpos( $menu_item[0], _x( 'Orders', 'Admin menu name', 'woocommerce' ) ) ) {
$submenu['woocommerce'][ $key ][0] .= ' ' . number_format_i18n( $order_count ) . '';
break;
}
}
}
上面代码的原理非常简单,就是获取一个数量,然后加上一些显示起泡效果的前端代码,然后添加到菜单里面。弄清楚了上面的原理,我们会发现文中演示的方法,除了添加待审核文章的提醒,同样也可以添加其他类型的提醒,比如待处理用户提交的信息的提醒。