我們知道 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 檔案):

  1. add_filter('manage_book_posts_columns', 'add_new_book_columns');   
  2.   
  3. function add_new_book_columns($book_columns) {   
  4.        
  5.     $new_columns['cb'] = '<input type="checkbox" />';//這個是前面那個選框,不要丟了   
  6.   
  7.     $new_columns['id'] = __('ID');   
  8.     $new_columns['title'] = '書本名';   
  9.     $new_columns['images'] = __('Images');   
  10.     $new_columns['author'] = __('Author');   
  11.        
  12.     $new_columns['categories'] = __('Categories');   
  13.     $new_columns['tags'] = __('Tags');   
  14.     
  15.     $new_columns['date'] = _x('Date', 'column name');   
  16.   
  17.     //直接返回一個新的陣列   
  18.     return $new_columns;   
  19. }  

事情還沒完呢,我們看到雖然我們新增了列,但是其中沒有資料。其中 ID 和 影像是我新建立的,用來顯示文章 ID 和圖片數量。

給自定義列賦值

顯示具體的列是在 wp-admin/includes/class-wp-posts-list-table.php 檔案類的 single_row 函式,函式的 foreach 迴圈中對於 titleauthor 都有具體的顯示方法,後面 else 提供了動作鉤子:manage_{$post->post_type}_posts_custom_column,我們自己新增的列當然屬於 else,所以我們將使用這個動作鉤子來顯示列中的具體值。

  1. add_action('manage_book_posts_custom_column', 'manage_book_columns', 10, 2);   
  2.     
  3. function manage_book_columns($column_name$id) {   
  4.     global $wpdb;   
  5.     switch ($column_name) {   
  6.     case 'id':   
  7.         echo $id;   
  8.         break;   
  9.     
  10.     case 'images':   
  11.         //透過資料庫查詢附件數量   
  12.         $num_images = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->posts WHERE post_parent = {$id};"));   
  13.         echo $num_images;    
  14.         break;   
  15.     default:   
  16.         break;   
  17.     }   
  18. }  

OK,看效果

工作完成。

 

不過我知道,一般人用不上這個,一般我們只想將預設文章的 ID 顯示出來,透過前面的程式碼,大家都會,下面貼出程式碼給小白使用者使用,只需要將下面的程式碼新增到主題的 functions.php 中即可:

  1. /**********文章***********/  
  2. add_filter('manage_posts_columns', 'add_new_posts_columns');   
  3. function add_new_posts_columns($book_columns) {   
  4.        
  5.     $new_columns['cb'] = '<input type="checkbox" />';   
  6.     $new_columns['id'] = __('ID');   
  7.     $new_columns['title'] = _x( 'Title', 'column name' );   
  8.     $new_columns['author'] = __('Author');   
  9.     $new_columns['categories'] = __('Categories');   
  10.     $new_columns['tags'] = __('Tags');   
  11.     $new_columns['date'] = _x('Date', 'column name');   
  12.     return $new_columns;   
  13. }   
  14. add_action('manage_posts_custom_column', 'manage_posts_columns', 10, 2);   
  15. function manage_posts_columns($column_name$id) {   
  16.     global $wpdb;   
  17.     switch ($column_name) {   
  18.     case 'id':   
  19.         echo $id;   
  20.         break;   
  21.     default:   
  22.         break;   
  23.     }   
  24. }   
  25. /**************頁面************/  
  26. add_filter('manage_pages_columns', 'add_new_pages_columns');   
  27. function add_new_pages_columns($book_columns) {   
  28.        
  29.     $new_columns['cb'] = '<input type="checkbox" />';   
  30.     $new_columns['id'] = __('ID');   
  31.     $new_columns['title'] = _x( 'Title', 'column name' );   
  32.     $new_columns['author'] = __('Author');   
  33.     $new_columns['date'] = _x('Date', 'column name');   
  34.     return $new_columns;   
  35. }   
  36. add_action('manage_pages_custom_column', 'manage_pages_columns', 10, 2);   
  37. function manage_pages_columns($column_name$id) {   
  38.     global $wpdb;   
  39.     switch ($column_name) {   
  40.     case 'id':   
  41.         echo $id;   
  42.         break;   
  43.     default:   
  44.         break;   
  45.     }   
  46. }