> WordPress中文手册 > 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; } 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; } } /**********文章***********/ 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; } }

wordpress进阶教程(四):在文章管理列表添加自定义列
事情还没完呢,我们看到虽然我们添加了列,但是其中没有数据。其中 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_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; } 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; } } /**********文章***********/ 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; } }

OK,看效果
wordpress进阶教程(四):在文章管理列表添加自定义列
工作完成。

不过我知道,一般人用不上这个,一般我们只想将默认文章的ID显示出来,通过前面的代码,大家都会,下面贴出代码给小白用户使用,只需要将下面的代码添加到主题的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; } 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; } } /**********文章***********/ 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; } }