不知道你们是否注意过后台Posts -> Tags 列表中的 Count列?这里其实有个问题,那就是,这以列显示的数字只包括’public’类型的post,而没有统计’private’和’draft’类型的post。如果有自己定义的其它类型的post_type,同样也不列入统计。
对于像我这样,存稿和私密都很多的人来说,这样会产生一个问题:在对tag进行维护时,遇到count=0的,并不能判断这个tag已经废弃了,非要点击一次,进到对应的post编辑页面中,看到post列表为空,才能放心地删除这个tag。
对于程序员来说,多点一次也是不乐意的。经过两天的研究,终于被我找到了在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&tag=%s&post_status=private">%d</a>', $url_base, $term_slug, $p_count); //加编辑用的超链 } if ($d_count) { $d_str = sprintf('<strong>drafts:</strong><a href="%s&tag=%s&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下手了。
我已经放弃对tag的维护了,有点精力全投在文章质量上了,SEO什么的我已经放起来。
倒不是为了SEO,纯是因为强迫症。以及这是另一个想搞的功能的前置。
博主强迫症犯了?哈哈
也不算。我没有很严重的强迫症,这是研究一个新功能的时候附带做出来的。
这是要去除多余的项么?
对。不修改的话,点一次0看没有草稿和私有用也可以删。我就是为了不点这一下。
现在我只求我的博客没有问题就好了,对于这些技术性的东西放弃了。
有这样的精神还是值得点赞的。
职业病的一种。
技术类文章看了眼花,标签为零的文章,其实数量并不为零,这个问题我也早早注意到了,只是懒得弄,毕竟我文章的标签不多。哪天想起来要折腾了,再翻回来找你的经验,哈哈!!
应该还有别的方法,直接把0改成不是0。那样更明显。我还在研究中。
又一个PHP大佬
我是个C/C++程序员。php完全是业余爱好。
瞅了一眼,突然想说大致要不用Emlog吧,这样你折腾我也能搬过去。
不可能。都用了15年了。要换在第3~5年的时候是最容易换的。
最近我在尝试做一个精简版,只给自己用。
这个真不错!
周六测试一个想法就遇到这个问题了,私密的不会统计标签的数量里,最后不得不改成公开的