WordPress 后台文章列表添加自定义列
WordPress 管理后台的默认文章列表,主要包含文章的标题、作者、分类、标签、评论数、日期等。
但是,很多时候我们还需要直观的文章ID、图片数量、是否被百度收录等自定义信息,如下图:
上图来自于米扑博客(博主:阳光岛主、sunboy_2050)的管理后台,如何做到呢?
类似的场景其实还有很多,例如:
1、管理后台直观的显示每篇文章ID,否则每次想知道文章ID,都要F12进入开发者模式查看,且每次还只能看一篇文章ID,太麻烦
2、管理后台显示每篇文章的图片和视频总数,当然也可以分别统计显示。一般视频较少,推荐一起统计更实用、简单
3、使用了显示阅读数的插件,需要显示出阅读数(views)
4、加入了百度收录的字段,想在后台查看每篇文章的收录状态。当然,也可以继续扩展到搜狗、360、Bing、谷歌等是否收录,原理都一样,加几行代码就好了
5、在一些电子商务主题上,需要将一个商品的价格、剩余数量、购买销量、团购网站的时间段等信息显示出来
所以,如果你要建一个个性化的网站,这篇文章很重要。本文推荐的文章更重要,给你实践的成功机会喔。
好了,这篇文章重要性不多说,懂的自然懂,下面正式干活儿。
后台文章列表页面添加列
我们要改变文章管理页面输出的内容,首先肯定要使用过滤器来过滤输出的参数
我们要用到自定义过滤器格式: manage_{post_type}_posts_column
比如:wordpress默认的“post”本应该使用过滤器manage_post_posts_columns,
但是,由于wordpress 对默认文章类型提供了捷径,可以直接使用 manage_posts_columns 和 manage_pages_columns
对于前面自己创建的book类型文章,属于自定义类型,所以应该是manage_book_posts_columns,该过滤器位于wp-admin/includes/class-wp-posts-list-table.php文件中,推荐你参阅下此文件。下面我先以book为例(使用默认的twenty ten主题测试,首先请参考前面的文章使用twenty ten主题创建一个自定义文章类型,打开并编辑我们前面创建自定义文章类型时使用的post-type.php文件,当然你也可以直接使用functions.php文件):
add_filter('manage_book_posts_columns', 'add_new_book_columns'); function add_new_book_columns($book_columns) { $new_columns['cb'] = '<input type="checkbox" />';//这个是前面那个选框,不要丢了 $new_columns['id'] = __('ID'); $new_columns['title'] = '书本名'; $new_columns['images'] = __('Images'); $new_columns['author'] = __('Author'); $new_columns['categories'] = __('Categories'); $new_columns['tags'] = __('Tags'); $new_columns['date'] = _x('Date', 'column name'); //直接返回一个新的数组 return $new_columns; }
效果如下图:
上图里,ID 和 图像是自定义新创建的,用来显示文章ID和图片数量。
事情到此还没完呢,虽然看到了我们添加的列,但是列名 ID 和 图像,都还没有数据呢。。。
添加函数给自定义列赋值
显示具体的列是在wp-admin/includes/class-wp-posts-list-table.php文件类的single_row函数,
函数的foreach循环中对于title\author都有具体的显示方法,后面else提供了动作钩子:manage_{$post->post_type}_posts_custom_column,
我们自己添加的列当然属于else,所以我们将使用这个动作钩子来显示列中的具体值。
add_action('manage_book_posts_custom_column', 'manage_book_columns', 10, 2); function manage_book_columns($column_name, $id) { global $wpdb; switch ($column_name) { case 'id': echo $id; break; case 'images': //通过数据库查询附件数量 $num_images = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->posts WHERE post_parent = {$id};")); echo $num_images; break; default: break; }
数据添加完成,看效果如下:
简单的添加ID和阅读数列
不过,一般人用不到上面的自定义,太折腾,本文在最下面的参考推荐示例里,会留给爱折腾的人去折腾,哈
这里,先满足大多数不喜欢折腾的人,只想将默认文章的ID显示出来,下面直接给出添加ID的代码
复制下面的代码添加到主题目录下的functions.php中即可:
cd wp-content/themes/officefolders/
vim functions.php
添加以下代码:
/** 后台管理文章显示ID **/ /**********文章添加自定义列***********/ add_filter('manage_posts_columns', 'add_postid_posts_columns'); function add_postid_posts_columns($book_columns) { $new_columns['cb'] = '<input type="checkbox" />'; $new_columns['id'] = __('ID'); $new_columns['title'] = _x( 'Title', 'column name' ); $new_columns['author'] = __('Author'); $new_columns['categories'] = __('Categories'); $new_columns['tags'] = __('Tags'); $new_columns['date'] = _x('Date', 'column name'); $new_columns['comments'] = _x('评论', 'column name'); $new_columns['views'] = _x('Views', 'column name'); return $new_columns; } add_action('manage_posts_custom_column', 'manage_book_columns', 10, 2); function manage_book_columns($column_name, $id) { global $wpdb; switch ($column_name) { case 'id': echo $id; break; default: break; } } /**************页面添加自定义列************/ add_filter('manage_pages_columns', 'add_new_pages_columns'); function add_new_pages_columns($book_columns) { $new_columns['cb'] = '<input type="checkbox" />'; $new_columns['id'] = __('ID'); $new_columns['title'] = _x( 'Title', 'column name' ); $new_columns['author'] = __('Author'); $new_columns['date'] = _x('Date', 'column name'); $new_columns['comments'] = _x('评论', 'column name'); $new_columns['views'] = _x('Views', 'column name'); return $new_columns; } add_action('manage_pages_custom_column', 'manage_pages_columns', 10, 2); function manage_pages_columns($column_name, $id) { global $wpdb; switch ($column_name) { case 'id': echo $id; break; default: break; } }
实现的效果,如下图:
补充知识:
若你一开始不知道自己的后台管理文章列表包含哪些字段,这里教你一个方法去查看
按F12,进入开发者模式,查看后台管理页面,如下图:
发现了没有,id 值就是上面代码的列字段,例如: $new_columns['id'] 、$new_columns['title'] 等等
__()表示自定义列, _x() 表示WordPress自带定义的列 (哈,纯属自己猜想,留请高人解答)
高级的添加ID、图像数量、百度收录列
最后,还是给出一个高级的自定义版本的完整代码
/** 后台管理文章显示ID **/ /**********文章添加自定义列***********/ add_filter('manage_posts_columns', 'add_postid_posts_columns'); function add_postid_posts_columns($book_columns) { $new_columns['cb'] = '<input type="checkbox" />'; $new_columns['id'] = __('ID'); $new_columns['title'] = _x( 'Title', 'column name' ); $new_columns['images'] = __( 'Images'); $new_columns['author'] = __('Author'); $new_columns['categories'] = __('Categories'); $new_columns['tags'] = __('Tags'); $new_columns['date'] = _x('Date', 'column name'); $new_columns['comments'] = _x('评论', 'column name'); $new_columns['views'] = _x('Views', 'column name'); $new_columns['baidu_record'] = _x('百度收录', 'column name'); return $new_columns; } add_action('manage_posts_custom_column', 'manage_book_columns', 10, 2); function manage_book_columns($column_name, $id) { global $wpdb; switch ($column_name) { case 'id': echo $id; break; case 'images': $num_images = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->posts WHERE post_parent = {$id};")); echo $num_images; break; case 'baidu_record': $baidu_record = $wpdb->get_var($wpdb->prepare("SELECT meta_value FROM $wpdb->postmeta WHERE post_id = {$id} and meta_key = 'baidu_record';")); @$record_url='http://zhanzhang.baidu.com/sitesubmit/index?sitename='.get_permalink(); @$result="<a style='color:red;' target='_blank' href=\"$record_url\">未收录</a>"; if($baidu_record=="1") { // echo $baidu_record; // echo "是"; $record_url='http://www.baidu.com/s?wd=sitemap:blog.mimvp.com '.get_the_title(); @$result="<a style='color:blue;' target='_blank' href=\"$record_url\">已收录</a>"; } echo $result; break; default: break; } } /**************页面添加自定义列************/ add_filter('manage_pages_columns', 'add_new_pages_columns'); function add_new_pages_columns($book_columns) { $new_columns['cb'] = '<input type="checkbox" />'; $new_columns['id'] = __('ID'); $new_columns['title'] = _x( 'Title', 'column name' ); $new_columns['author'] = __('Author'); $new_columns['date'] = _x('Date', 'column name'); $new_columns['comments'] = _x('评论', 'column name'); $new_columns['views'] = _x('Views', 'column name'); return $new_columns; } add_action('manage_pages_custom_column', 'manage_pages_columns', 10, 2); function manage_pages_columns($column_name, $id) { global $wpdb; switch ($column_name) { case 'id': echo $id; break; default: break; } }
聪明的人一看就知道后面我将要说什么了,或者他自己直接就做出来了
实现效果,见本文上面的第一张图,想实现吗?
想的话,请继续折腾米扑博客的如下参考推荐
参考推荐:
米扑博客:WordPress 百度收录检测与后台文章显示收录状态
米扑博客:总结分享 WordPress显示评论者IP归属地、浏览器、终端设备、电信运营商
哈哈,参考推荐都是米扑博客实现的经典功能,
你要是全部都实现了,说明你很厉害
你要是一周内全部实现了,说明你真的很厉害
最后,声明一下,本文参考了 wordpress进阶教程(四):在文章管理列表添加自定义列,并做了许多改进,也算我自己的折腾吧 ?
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2017-10-21 23:43:03
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!