翻译自:http://wp.smashingmagazine.com/2013/12/05/modifying-admin-post-lists-in-WordPress/

你是否发现,当你新建一个自定义文章类型后,在后台的文章管理列表,仅仅只显示文章标题和日期?但事实上文章还包含很多信息,比如作者、分类、评论等,本片文章就叫你如何修改后台的文章列表的信息。

首先请确定你知道本文要将什么,后台文章管理列表指的是你再后台点击 「所有文章」「所有页面」 之后出现的文章的列表表格。

创建一个自定义的文章类型 (,我将使用 wp3.8.1 twentyfourteen 主题测试),在主题的 functions.php 文件插入以下的代码,关于如何创建一个文章类型,你也可以参考本站教程 WordPress 进阶教程 (二): 注册一个自定义的文章类型:

  1. add_action( 'init', 'bs_post_types' );   
  2. function bs_post_types() {   
  3.   
  4.     $labels = array(   
  5.         'name'                => __( 'Events', THEMENAME ),   
  6.         'singular_name'       => __( 'Event', THEMENAME ),   
  7.         'add_new'             => __( 'Add New', THEMENAME ),   
  8.         'add_new_item'        => __( 'Add New Event', THEMENAME ),   
  9.         'edit_item'           => __( 'Edit Event', THEMENAME ),   
  10.         'new_item'            => __( 'New Event', THEMENAME ),   
  11.         'all_items'           => __( 'All Event', THEMENAME ),   
  12.         'view_item'           => __( 'View Event', THEMENAME ),   
  13.         'search_items'        => __( 'Search Events', THEMENAME ),   
  14.         'not_found'           => __( 'No events found', THEMENAME ),   
  15.         'not_found_in_trash'  => __( 'No events found in Trash', THEMENAME ),   
  16.         'menu_name'           => __( 'Events', THEMENAME ),   
  17.     );   
  18.   
  19.     $supports = array( 'title', 'editor' );   
  20.   
  21.     $slug = get_theme_mod( 'event_permalink' );   
  22.     $slug = ( empty$slug ) ) ? 'event' : $slug;   
  23.   
  24.     $args = array(   
  25.         'labels'              => $labels,   
  26.         'public'              => true,   
  27.         'publicly_queryable'  => true,   
  28.         'show_ui'             => true,   
  29.         'show_in_menu'        => true,   
  30.         'query_var'           => true,   
  31.         'rewrite'             => array( 'slug' => $slug ),   
  32.         'capability_type'     => 'post',   
  33.         'has_archive'         => true,   
  34.         'hierarchical'        => false,   
  35.         'menu_position'       => null,   
  36.         'supports'            => $supports,   
  37.     );   
  38.   
  39.     register_post_type( 'event', $args );   
  40.   
  41. }  

添加代码之后,在后台发布一些文章,文章管理列表将如图:

给表格头部添加列

  1. add_filter('manage_event_posts_columns', 'bs_event_table_head');   
  2. function bs_event_table_head( $defaults ) {   
  3.     $defaults['event_date']  = 'Event Date';   
  4.     $defaults['ticket_status']    = 'Ticket Status';   
  5.     $defaults['venue']   = 'Venue';   
  6.     $defaults['author'] = 'Added By';   
  7.     return $defaults;   
  8. }  

注意:上面代码中我们使用了过滤器 manage_event_posts_columns,其中的 event 为上面创建的文章类型名。

如果你仅仅添加了上面的代码,你会发现,在后台的文章管理列表,仅仅是表格的头部出现了列的名称,但是没有具体的内容显示。

给列添加具体的显示内容

添加以下代码到 functions.php 中。

  1. add_action( 'manage_event_posts_custom_column', 'bs_event_table_content', 10, 2 );   
  2.   
  3. function bs_event_table_content( $column_name$post_id ) {   
  4.     if ($column_name == 'event_date') {   
  5.         $event_date = get_post_meta( $post_id, '_bs_meta_event_date', true );   
  6.             echo  date( _x( 'F d, Y', 'Event date format', 'textdomain' ), strtotime$event_date ) );   
  7.     }   
  8.     if ($column_name == 'ticket_status') {   
  9.         $status = get_post_meta( $post_id, '_bs_meta_event_ticket_status', true );   
  10.         echo $status;   
  11.     }   
  12.   
  13.     if ($column_name == 'venue') {   
  14.         echo get_post_meta( $post_id, '_bs_meta_event_venue', true );   
  15.     }   
  16.   
  17. }  

上面的代码中为新增加的几个列输出内容。
其中 events 的日期,是获取一个名为_bs_meta_event_date 的字段
ticket status 是获取_bs_meta_event_ticket_status 的字段
venue 是获取_bs_meta_event_venue 的字段。

有了具体的输出内容自会后,后台文章列表就不是空的了