wordpress进阶教程(四):在文章管理列表添加自定义列
我们知道wordpress默认的“文章”、和我们自己创建的新文章类型都有一个列出所有文章的管理页面,比如默认的“文章”管理页面,我们能偶预览到文章的标题、作者、分类、标签、评论数、日期。但是如果使我们自己创建的新文章类型,比如我们前面教程中创建了一个自定义文章类型book,如果我去掉标签支持、和分类(category)支持的话,我们在文章列表页面就只能看到文字的标题、作者、评论数、日期,这样我们怎么知道这篇文章属于哪个分类法呢?
如果你只是想给你的文章显示一个ID,请直接下拉到文章最后看代码即可。
更多应用比如:1、每次想知道文章ID都要将鼠标放在标题上才行,要直观一点。2、我想将文章的特色图片显示出来。3、我想将文章中的图片附件数量显示出来。4、在一些电子商务主题上,需要将一个商品的价格、团购网站的时间段显示出来。所以如果你要建一个特别一点的站,这篇文章很重要。
好了,这篇文章重要性不多说,懂的自然懂。
为文章管理页面添加列
我们要改变文章管理页面输出的内容,首先肯定要使用过滤器来过滤输出的参数,我们要用到过滤器manage_{post_type}_posts_columns,比如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和图片数量。
给自定义列赋值
显示具体的列是在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显示出来,通过前面的代码,大家都会,下面贴出代码给小白用户使用,只需要将下面的代码添加到主题的functions.php中即可:
- /**********文章***********/
- add_filter('manage_posts_columns', 'add_new_posts_columns');
- function add_new_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');
- return $new_columns;
- }
- add_action('manage_posts_custom_column', 'manage_posts_columns', 10, 2);
- function manage_posts_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');
- 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;
- }
- }
请教一下,能把文章列表中 的“作者” 一列,改为最后编辑的用户名称么?
把下面代码加入functions.php中即可
add_filter('manage_posts_columns', 'add_my_columns');
function add_my_columns($columns) {
$columns['author'] = '用户名称';
return $columns;
}
谢谢回复。
不过我的本意是 在文章列表页中, 去掉“作者”那一列,用这篇文章的最后的“编辑者”来代替。
既然遇到高手了,就接着问:如何让文章列表页面 默认 显示“草稿”状态的文章列表?
再次感谢。
默认就显示草稿,这个搞不定,这个得改掉左边菜单的链接才行。
请教一下你现在用的这个代码高亮插件是什么?感觉样式看着很舒服
树哥, 自定义的分类,显示不出来,帮帮忙解决一下
如何显示分类呢?
阿树大师:不好意思,这个问题一直没有解决,导致我后面没有办法调用这个自定义文章类型下的分类目录,不得不再咨询一下,我的问题是:
这个自定义文章类型中的文章列表不显示文章的分类,见图:
赐教,谢谢。
老师:我知道你很忙,费了我九牛二虎之力,终于在一个英文网站找到了答案,原来被那个默认的分类折腾了老半天,居然是新建一个分类名,然后调用自定义的分类目录。
$new_columns[‘destination’] =__(‘产品分类’);
case ‘destination’:
echo get_the_term_list($post->ID,’destination’,”,’, ‘,”);
break;
共勉。
再补充一下:
case ‘destination’ :
$terms = get_the_terms( $post_id, ‘destination’ );
if ( !empty( $terms ) ) {
$out = array();
foreach ( $terms as $term ) {
$out[] = sprintf( ‘<a href=”%s”>%s</a>’,
esc_url( add_query_arg( array( ‘post_type’ => $post->post_type, ‘destination’ => $term->slug ), ‘edit.php’ ) ),
esc_html( sanitize_term_field( ‘name’, $term->name, $term->term_id, ‘destination’, ‘display’ ) )
);
}
echo join( ‘, ‘, $out );
}
else {
_e( ‘No destination’ );
}
break;
case ‘destination’ : 为什么错误那? 贴完整好吗?
我COPY的代码是:
case ‘categories’:
echo $attributes;
$categories = get_the_category();
if ( !empty( $categories ) ) {
$out = array();
foreach ( $categories as $c ) {
$out[] = sprintf( ‘<a href=”%s”>%s</a>’,
esc_url( add_query_arg( array( ‘post_type’ => $post->post_type, ‘category_name’ => $c->slug ), ‘edit.php’ ) ),
esc_html( sanitize_term_field( ‘name’, $c->name, $c->term_id, ‘category’, ‘display’ ) )
);
}
/* translators: used between list items, there is a space after the comma */
echo join( __( ‘, ‘ ), $out );
} else {
_e( ‘Uncategorized’ );
}
break;
不好意思,有两个问题:
1,add_action(‘manage_posts_custom_column’, ‘manage_posts_columns’, 10, 2); 中的“10,2”是什么意思?
2,我试着把分类也显示出来,弄了半天没显示出来。
不胜感激,THX。
10指的是优先级,2指的是manage_posts_columns接受2个参数
THANKS SO MUCH。
现在可以把WP当做一门功课来学习了,学会了WP,也就学会了PHP。当然前提是要明白PHP,才能学好WP。
程序员就是一个能够自己绕圈子,还不会头晕的人,在没有圈子的情况下,自己制造圈子让自己绕。
我想问一下,如果我想让文章ID显示四位数,比如说 0001,0002,0012 这个样子,请问应该怎么做呢?
我是小白,几乎不懂php,请指教。最好能直接贴出代码+注释……..
将教程中代码
改成
请参考sprintf函数
谢谢。还有个问题。我只想在新注册的文章类型下显示ID,而原来的文章类型那里不显示,这能否做到?
因为新增的文章类型作为产品,需要一个产品ID,原来的文章类型作为新闻,是不需要ID的。