给wordpress后台文章列表增加自定义排序栏

来源:互联网 发布:年金险 知乎 编辑:程序博客网 时间:2024/05/04 17:40
受到Joost de Valk文章custom post type snippets的启发,Joost的这篇文章简单地提供了一段怎么给文章增加自定义排序栏的代码,在这我就详细地说下怎么给后台文章列表增加自定义排序栏!

当然在看这篇教程之前你要确保自己会怎么去使用自定义文章模型和模型分类了,如果你不知道的话可以参考下官网的自定义文章模型专栏文章模型和栏目分类

本教程分为两部分:1.会说说怎么样创建一个自定义模型文章栏目,2.然后对这些栏目进行排序,当然我们为了简单在这里就列举两项栏目进行排序:

  • 元数据:根据文章的某个元数据键值进行排序;
  • 分类:增加一个链接,用户点进去之后只查找此分类的文章。

第二大部分:创建一个自定义模型文章栏目
前提准备

此教程我将会举例使用自定义文章电影模型:

  • movie:我自定义的电影模型
  • 类型: 对电影分类(栏目)
  • 播放时间: 这个电影模型的一个自定义字段(元数据键值),用于记录电影的播放时间

我在此之前就增加了几篇电影,下面是截图.

看起来很是简单丑陋,不过wordpress有很强大的功能,我自定义了一些function之后就漂亮多了,下面看我优化后的截图


现在是不是看起来舒服多了,我们可以增加一些此文章模型的相关信息,还可以利用元数据来进行排序

增加自定义栏目

第一步就是要在这里显示出自定义栏目,我们可以利用wordpress一个很灵活的钩子功能来达到目的,它的使用方法是增加一个名字为manage_edit-自定义模型名_columns的钩子来对所有的自定义模型列表进行控制,此教程我们使用的是电影模型,自定义的post_type是movie,所以我们只需要在function.php(后面的代码都是放这里)里面增加一个名字为manage_edit-movie_columns的钩子即可

在这里我们就把原来默认的栏目去掉,然后设置我们自己需要显示的栏目,在这里我就列举了5项:

  • cb: 就是多选框栏(用于全选和反选)
  • title: 电影的名字,可以点击进去查看电影详情
  • duration: 电影模型的元数据,记录电影的播放时间
  • genre: 系定义分类,用来分类电影的
  • date: 默认的数据娴熟栏目

要筛选这些栏目的数据其实也很简单,只需要返回一个数组键值或者值,当然键值就是栏目的名字,变量就是lable标签的显示数据.看代码

[php] view plaincopyprint?
  1. add_filter( 'manage_edit-movie_columns''my_edit_movie_columns' ) ;  
  2. function my_edit_movie_columns( $columns ) {  
  3.     $columns = array(  
  4.         'cb' => '<input type="checkbox" />',  
  5.         'title' => __( 'Movie' ),  
  6.         'duration' => __( 'Duration' ),  
  7.         'genre' => __( 'Genre' ),  
  8.         'date' => __( 'Date' )  
  9.     );  
  10.     return $columns;  
  11. }  

让自定义栏目显示相应的数据

到处,我们已经把表格头部的栏目显示部分做好了,现在就来给每个自定义栏目增加相应的显示内容,你可能有点担心durationgenre这两栏的数据,因为其他的栏目像titile,wordpress是可以自动为其分配数据的。

针对这个我们就要使用到wordpress的名为manage_模型名_posts_custom_column的action钩子. 上面说了此教程的模型名为movie所以把“模型名”替换掉就是manage_movie_posts_custom_column.

我们需要使用到的是php的switch语句来显示相应的数据(当然你用if判断语句也是可以的)

  • duration栏,只需要把默认的duration显示出来,如果没有数据就显示成:未知
  • genre栏, 除了需要显示相应的分类,还要加上点击进去显示相应分类电影的链接

下面我就列出了自己的代码段,你可以根据自己项目需求来修改和完善.

[php] view plaincopyprint?
  1. add_action( 'manage_movie_posts_custom_column''my_manage_movie_columns', 10, 2 );  
  2. function my_manage_movie_columns( $column$post_id ) {  
  3.     global $post;  
  4.     /*当然你可以用if语句*/  
  5.     switch$column ) {  
  6.         /* 如果栏目是'duration' 的时候 */  
  7.         case 'duration' :  
  8.             /* 得到文章的元数据. */  
  9.             $duration = get_post_meta( $post_id'duration', true );  
  10.             /* 如果没有数据的时候给出默认显示数据为未知. */  
  11.             if ( empty$duration ) )  
  12.                 echo __( '未知' );  
  13.             /* 如果存在数据的话我们把描述也加上*/  
  14.             else  
  15.                 printf( __( '%s minutes' ), $duration );  
  16.             break;  
  17.    
  18.         /* 如果栏目是 'genre'的时候*/  
  19.         case 'genre' :  
  20.             /* 得到文章的相应分类. */  
  21.             $terms = get_the_terms( $post_id'genre' );  
  22.             /* 如果有数据的时候,显示并加链接  */  
  23.             if ( !empty$terms ) ) {  
  24.                 $out = array();  
  25.                 /* 循环输出,并加链接*/  
  26.                 foreach ( $terms as $term ) {  
  27.                     $out[] = sprintf( '<a href="%s">%s</a>',  
  28.                                                 /*这个链接地址不是自定义的,你在edit.php里面可以看到Wp_Query($arg),在这里只给arg增加即可*/  
  29.                         esc_url( add_query_arg( array'post_type' => $post->post_type, 'genre' => $term->slug ), 'edit.php' ) ),  
  30.                         esc_html( sanitize_term_field( 'name'$term->name, $term->term_id, 'genre''display' ) )  
  31.                     );  
  32.                 }  
  33.                 /* join数据,并用逗号分开 */  
  34.                 echo join( ', '$out );  
  35.             }  
  36.             /* 如果没有数据的时候给出默认显示数据为未知. */  
  37.             else {  
  38.                 _e( '没有分类' );  
  39.             }  
  40.             break;  
  41.         /* 跳出switch语句 */  
  42.         default :  
  43.             break;  
  44.     }  
  45. }  

到此,你就可以点击电影的分类查看相应的电影文章了,比如你点击Science就会跳转之后显示所以属于Science分类的电影文章.


对自定义栏目进行排序

上面介绍了怎么增加自定义显示栏,下面只需要两步即可对自定义栏排序了.

  • 用代码把要排序的栏目加进排序的数组去
  • 由于是自定义栏目,得对实际的数据进行排序,如果是存在post表里面的数据这步就不需要了

第二大部分:最后的结果显示如图所示.


要注意的是我们实际上是使用元数据来排序的,也就是使用名为duration的meta_key排排序的,所以实际上得按照duration来进行正叙或者倒叙排

第一步就是通过名为manage_edit-{$post_type}_sortable_columns的filter来排序duration栏,下面给出代码

[php] view plaincopyprint?
  1. add_filter( 'manage_edit-movie_sortable_columns''my_movie_sortable_columns' );  
  2. function my_movie_sortable_columns( $columns ) {  
  3.     $columns['duration'] = 'duration';  
  4.     return $columns;  
  5. }  

下面的就稍微难点点,当管理员在列表页面的时候我们需要增加一下过滤request钩子.
为了确保管理员在列表页面,我们需要load-edit.php 的request钩子,来增加自定义钩子,我们需要检查下请求的参数里面是否需要我们自己来额外修改或增加的参数

[php] view plaincopyprint?
  1. /* 只要当管理员在'edit.php'的时候,才处理 */  
  2. add_action( 'load-edit.php''my_edit_movie_load' );  
  3. function my_edit_movie_load() {  
  4.     add_filter( 'request''my_sort_movies' );  
  5. }  
  6. /*对电影排序 */  
  7. function my_sort_movies( $vars ) {  
  8.     /* 判断是否浏览的是movie*/  
  9.     if ( isset( $vars['post_type'] ) && 'movie' == $vars['post_type'] ) {  
  10.         /* 看下是否已经对duration进行排序了*/  
  11.         if ( isset( $vars['orderby'] ) && 'duration' == $vars['orderby'] ) {  
  12.             /* 把自定义排序增加到$vars里面去 */  
  13.             $vars = array_merge(  
  14.                 $vars,  
  15.                 array(  
  16.                     'meta_key' => 'duration',  
  17.                     'orderby' => 'meta_value_num'  
  18.                 )  
  19.             );  
  20.         }  
  21.     }  
  22.     return $vars;  
  23. }  

用的参数是meta_key 和orderby. 让wordpress来根据durationd的键值和order正序或倒叙来显示

上面我使用的是meta_value_num(这个是Wp_Query的参数,不要解释吧)来排序的,因为duration是数字,如果你用的是 meta_value的话就会按照meta_value来排序的,meta_value_num是强制转化成数字类型之后来排序的

希望这篇教程对你有所帮助,当然你也不要觉得这个自定义排序很复杂,不复杂就不是程序了,呵呵,你也可以先尝试去掌握上面的列子,然后举一反三,不过这个排序也不一定是万能的,比如我在使用的时候想对序列化的数据进行排序就不行了,大家有什么好的方法可以提出来分享下!

好了,到此就结束了,里面有不当之处请指出,我会修改的!

0 0