Wordpress在后台taglist中增加private和draft类型的计数列

不知道你们是否注意过后台Posts -> Tags 列表中的 Count列?这里其实有个问题,那就是,这以列显示的数字只包括’public’类型的post,而没有统计’private’和’draft’类型的post。如果有自己定义的其它类型的post_type,同样也不列入统计。
对于像我这样,存稿和私密都很多的人来说,这样会产生一个问题:在对tag进行维护时,遇到count=0的,并不能判断这个tag已经废弃了,非要点击一次,进到对应的post编辑页面中,看到post列表为空,才能放心地删除这个tag。
20200818_tag_list_before_apip

对于程序员来说,多点一次也是不乐意的。经过两天的研究,终于被我找到了在taglist中增加列,显示非public post中tag总数的方法。
主要参考的是官方文档(墙ed)

往WP_List_Table类中加列需要两步:加标题和加内容。需要用到两个钩子函数,manage_edit-{$taxonomy}_columns和manage_{$taxonomy}_custom_column。
跟以往经常接触的钩子不同,这俩钩子是带参数的。因为我们针对的修改对象是taglist,所以$taxonomy=post_tag,于是这两个钩子变成了:
manage_edit-post_tag_columns和manage_post_tag_custom_column。
所以这种钩子有种局限性,他们容易随着WP版本的升级而改名。

增加标题的代码:

function edit_post_tag_column_header( $columns ){
        $columns['none-public-count'] = 'Non-public Count';
        return $columns;
}
add_filter( "manage_edit-post_tag_columns", 'edit_post_tag_column_header', 10);

没任何可说的。

增加内容的代码:

function apip_edit_post_tag_content( $value, $column_name, $tax_id ){
    $args = array(
        'numberposts' => -1,
        'post_type'   => 'post',
        'post_status' => array('private', 'draft'),
        'tag_id'      => $tax_id,
    );
    $myquery = new WP_Query( $args );   //查询类型为private和draft,并且包含tag_id与$tax_id的所有post。
    $p_count = 0; //private count
    $d_count = 0; //draft count
    foreach ($myquery->posts as $p) {
        //对两种类型分别计数
        if ($p->post_status == 'private') {
            $p_count++;
        } else {
            $d_count++;
        }
    }
    if (0 === $p_count + $d_count) {
        return "—";
    }
    $term_slug = get_term( $tax_id )->slug; //URL需要tag的slug
    $ret = "";
    $p_str = "";
    $d_str = "";
    $url_base = home_url('/',is_ssl()?'https':'http').'wp-admin/edit.php?post_type=post';
    if ($p_count) {
        $p_str = sprintf('<strong>privates:</strong><a href="%s&#038;tag=%s&#038;post_status=private">%d</a>', $url_base, $term_slug, $p_count); //加编辑用的超链
    }
    if ($d_count) {
        $d_str = sprintf('<strong>drafts:</strong><a href="%s&#038;tag=%s&#038;post_status=draft">%d</a>',$url_base, $term_slug, $d_count);
    }
    return sprintf("  %s  %s", $p_str, $d_str);
}
add_action( "manage_post_tag_custom_column", 'edit_post_tag_content', 10, 3);

这个函数只对第一个函数增加的column有意义。column中增加了不止一项时,要对$column_name进行判断。
中间用了一次WP_Query。很多人对这个类的使用有误解,认为会破坏主循环。这种认知是错误的。WP_Query调用几次都不会影响主循环的检索结果。影响结果的是have_posts()和the_post()!

改完了,看一下效果就一目了,这下可以直接对计数为0且新统计也为0的tag下手了。
20200818_tag_list_after_apip

已有10条评论

  1. 我已经放弃对tag的维护了,有点精力全投在文章质量上了,SEO什么的我已经放起来。

    1. 倒不是为了SEO,纯是因为强迫症。以及这是另一个想搞的功能的前置。

  2. 博主强迫症犯了?哈哈

    1. 也不算。我没有很严重的强迫症,这是研究一个新功能的时候附带做出来的。

    1. 对。不修改的话,点一次0看没有草稿和私有用也可以删。我就是为了不点这一下。

  3. 现在我只求我的博客没有问题就好了,对于这些技术性的东西放弃了。

  4. 有这样的精神还是值得点赞的。

    1. 职业病的一种。

  5. 技术类文章看了眼花,标签为零的文章,其实数量并不为零,这个问题我也早早注意到了,只是懒得弄,毕竟我文章的标签不多。哪天想起来要折腾了,再翻回来找你的经验,哈哈!!

    1. 应该还有别的方法,直接把0改成不是0。那样更明显。我还在研究中。

  6. 又一个PHP大佬

    1. 我是个C/C++程序员。php完全是业余爱好。

  7. 瞅了一眼,突然想说大致要不用Emlog吧,这样你折腾我也能搬过去。

    1. 不可能。都用了15年了。要换在第3~5年的时候是最容易换的。
      最近我在尝试做一个精简版,只给自己用。

  8. 这个真不错!

  9. 周六测试一个想法就遇到这个问题了,私密的不会统计标签的数量里,最后不得不改成公开的

你好,新朋友。留言前请先填写昵称邮箱