創建自定義帖子類型
已發表: 2016-08-23很長一段時間以來,WordPress 並不是“只是一個博客”平台。 幫助它轉變為適當的內容管理系統 (CMS) 的關鍵功能之一是自定義帖子類型。
這是關於自定義帖子類型 (CPT) 主題的 3 部分系列文章的第一篇。 這些是我們將在接下來的兩個中討論的主題:
- 自定義分類法
- 顯示自定義帖子類型(模板和查詢)
但是現在,讓我們仔細看看自定義帖子類型以及如何設置它們。
什麼是自定義帖子類型?
默認情況下,WordPress 使用這些帖子類型:
- 郵政
- 頁
- 依戀
- 修訂
- 菜單項
那麼,什麼是自定義帖子類型? 自定義帖子類型基本上是具有自定義參數(自定義字段、自定義類別/標籤結構……)的 WordPress 帖子。 自定義帖子類型的經典示例是:書籍、評論、推薦、團隊成員、作品集等。 但是您可以將它用於任何表明您創建的內容類型的內容。
你為什麼要用一個?
您可以只使用常規的 WP 帖子並使用類別和標籤來分隔不同的“帖子類型”。 但這並不理想,並且可能會導致並發症。 以下是您可能要使用自定義帖子類型的幾個原因:
- 如果您想將某些內容與 WordPress 中的其他可用帖子類型分開
- 您需要一些專屬於您要發布的內容的自定義字段
- 您需要以不同於其他帖子類型(如帖子或頁面)的方式顯示內容
假設您正在撰寫美食博客。 您通常會發布餐廳評論,但您也想發布自己的食譜。 食譜將成為完美的自定義帖子類型,因為您可能需要與常規帖子不同的佈局。 也許還有一些自定義字段,例如成分。 隨著食譜CPT的引入,博客部分將只包含您的正常帖子,並且您的食譜將有自己的部分(自己的食譜存檔頁面)。 這將使只想查看您的食譜的訪問者更容易。
在本系列文章中,我們將為我們的 Shaka 主題創建推薦 CPT。 假設用戶想要一個可以顯示每個客戶推薦的頁面。 他想向此自定義帖子類型添加一些自定義字段,並且他還希望使用不同的佈局來顯示這些推薦。 我們先來看看如何註冊自定義帖子類型。
如何創建自定義帖子類型?
有兩種方法可以創建新的自定義帖子類型。
第一個選項是使用一個插件來為您註冊自定義帖子類型。 這種方法對於不熟悉 PHP 代碼的用戶很有用。 您只需輸入所需的詳細信息,其餘的由插件完成。
第二種方法是手動註冊自定義帖子類型。 這意味著您必須編寫一些代碼,但不要驚慌,這相當簡單,我還將向您展示一個巧妙的技巧。
使用插件創建自定義帖子類型——簡單的方法
如果您想快速輕鬆地將自定義帖子類型添加到您的網站,那麼您應該使用提供此類功能的插件。 最流行的插件可能是自定義帖子類型 UI,它免費且易於使用。 讓我們設置它:
- 從您的 wp-admin 儀表板安裝並激活自定義帖子類型 UI 插件,
- 激活插件後,CPT UI 管理菜單項將可用。 轉到 CPT UI -> 添加/編輯帖子類型,
- 在這裡,您會發現很多設置,您可以應用這些設置來自定義您的 CPT。 我們不會在本文中詳細介紹它們。 但是每個設置標籤旁邊都有一個工具提示圖標來解釋每個設置的作用。 讓我們為我們的用例(推薦 CPT)設置我們需要的東西,
- 輸入 slug:testimonials,複數標籤:Testimonials 和單數標籤:Testimonial,
- 您可以單擊編輯附加標籤按鈕以設置更準確的標籤。 但是我們可以跳過這個,如果我們稍後看到問題,我們可以回來,
- 對於我們的用例,所有默認設置都可以,我們將只添加對自定義字段的支持(在支持部分中選擇自定義字段複選框),
- 單擊添加帖子類型,以創建自定義帖子類型。
一旦我們創建了自定義帖子類型,就會出現一個新的 Testimonials wp-admin 儀表板菜單項。 我們現在可以使用創建自定義帖子類型(標題、編輯器、特色圖片和自定義字段)時選擇的所有字段創建新的推薦。
我們還可以為此自定義帖子類型設置分類,但我們將在下一篇文章中介紹。
手動創建自定義帖子類型 - 涉及編碼
您可能會問自己:如果您可以使用插件創建自定義帖子類型,為什麼會有人想要使用代碼手動創建它?
使用插件創建插件的能力當然非常方便,但在某些情況下您可能希望通過代碼來實現。 例如,如果您正在為您的客戶開發一個網站,並且您不希望客戶能夠更改這些設置,或者您不想在他的網站上再安裝一個插件。 此外,如果您希望創建用於多個站點的主題(或子主題),則在代碼中註冊自定義帖子類型比為每個站點重複插件步驟更容易。 每種方法都有一些優點和缺點,因此您必須決定哪種方法最適合您的情況。
創建自定義帖子類型的代碼可以直接放在主題中(在functions.php中)。 或者,您可以創建一個新插件並將 CPT 代碼放在那裡。 這也是 WordPress 社區中一個有爭議的問題。 一邊說應該是放在插件裡面,這樣如果換了主題,CPT的數據就留下了(但是輸出沒有樣式,在新主題下不好看)。 而對方則認為最好把CPT代碼直接放在主題中,因為它是特定於主題的,也是專門為這個主題設計的。
就個人而言,我認為將樣式(主題)與功能(插件)分開總是更好,因此為 CPT 註冊創建一個新插件是一個更好的選擇。 為新主題添加樣式以使 CPT 輸出看起來更好比因為切換到新主題而丟失 CPT 的數據更容易。
使用代碼註冊自定義帖子類型
我確實答應了一個巧妙的把戲,不是嗎? 好吧,您實際上不需要編寫代碼即可通過代碼註冊自定義帖子類型。 這聽起來可能很奇怪,但這是真的。 您可以在 generatewp.com 上使用此工俱生成 CPT 註冊所需的代碼。 您所要做的就是輸入一些數據並生成代碼。 我為我們的推薦用例做了這個,結果如下:
// Register Custom Post Type function custom_post_type_testimonials() { $labels = array( 'name' => _x( 'Testimonials', 'Post Type General Name', 'text_domain' ), 'singular_name' => _x( 'Testimonial', 'Post Type Singular Name', 'text_domain' ), 'menu_name' => __( 'Testimonials', 'text_domain' ), 'name_admin_bar' => __( 'Testimonials', 'text_domain' ), 'archives' => __( 'Item Archives', 'text_domain' ), 'parent_item_colon' => __( 'Parent Item:', 'text_domain' ), 'all_items' => __( 'All Items', 'text_domain' ), 'add_new_item' => __( 'Add New Item', 'text_domain' ), 'add_new' => __( 'Add New', 'text_domain' ), 'new_item' => __( 'New Item', 'text_domain' ), 'edit_item' => __( 'Edit Item', 'text_domain' ), 'update_item' => __( 'Update Item', 'text_domain' ), 'view_item' => __( 'View Item', 'text_domain' ), 'search_items' => __( 'Search Item', 'text_domain' ), 'not_found' => __( 'Not found', 'text_domain' ), 'not_found_in_trash' => __( 'Not found in Trash', 'text_domain' ), 'featured_image' => __( 'Featured Image', 'text_domain' ), 'set_featured_image' => __( 'Set featured image', 'text_domain' ), 'remove_featured_image' => __( 'Remove featured image', 'text_domain' ), 'use_featured_image' => __( 'Use as featured image', 'text_domain' ), 'insert_into_item' => __( 'Insert into item', 'text_domain' ), 'uploaded_to_this_item' => __( 'Uploaded to this item', 'text_domain' ), 'items_list' => __( 'Items list', 'text_domain' ), 'items_list_navigation' => __( 'Items list navigation', 'text_domain' ), 'filter_items_list' => __( 'Filter items list', 'text_domain' ), ); $args = array( 'label' => __( 'Testimonials', 'text_domain' ), 'labels' => $labels, 'supports' => array( 'title', 'editor', 'thumbnail', 'custom-fields' ), 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_position' => 5, 'show_in_admin_bar' => true, 'show_in_nav_menus' => true, 'can_export' => true, 'has_archive' => true, 'exclude_from_search' => false, 'publicly_queryable' => true, 'capability_type' => 'page', ); register_post_type( 'testimonials', $args ); } add_action( 'init', 'custom_post_type_testimonials' );
… 可以在項目中使用的完全有效的 PHP 代碼。 如前所述,您可以將此代碼放入新創建的插件中,也可以將其放入主題的functions.php文件中。 為了簡單起見,我選擇了後者。 我把這段代碼放在主題的functions.php文件中,然後Testimonials wp-admin菜單出現了,我現在可以創建新的testimonials(就像上面的插件方法一樣)。

您還可以為自定義帖子類型設置不同的圖標,該圖標將顯示在 wp-admin 菜單中。 您只需在 $args 數組中添加這一行: 'menu_icon' => 'dashicons-businessman'
。 您可以在此處找到所有可能圖標的列表:WordPress Dashicons。 (感謝亞歷山大的這個提示)。
讓我們仔細看看代碼:
- 整個 CPT 註冊過程封裝在
custom_post_type_testimonial()
函數中,該函數在代碼段末尾的init
WP 鉤子中使用以下代碼:add_action( 'init', 'custom_post_type_testimonials' );
. 這個add_action
調用是最後的調用,它使一切都處於運動狀態並使 WordPress 發揮它的魔力。 - 函數內的第一個代碼塊是一個名為
$labels
的數據數組,其中包含此自定義帖子類型的翻譯字符串。 - 第二個塊是用於 CPT 註冊的參數數組,您可以在此處定義 CPT 的所有設置。 CPT 應該支持哪些字段,是否公開可見,wp-admin 菜單的位置,是否有存檔頁面等等。 要查看完整的選項集,請訪問此 WP codex 頁面。
- 函數的最後一行是
register_post_type( 'testimonials', $args );
. 這將使用我們在上面的$args
中指定的設置註冊“推薦”自定義帖子類型。
而已! 我們已經使用一些 PHP 代碼註冊了一個自定義帖子類型。
我將在生成的代碼中更改的唯一改進是使用轉義國際化函數。 因此,我將使用esc_html_x()
和esc_html__()
而不是_x()
和__()
() 。 轉義輸出值(甚至是翻譯字符串)總是好的,但這是另一篇博文的主題。
該系列的下一篇文章:如何創建自定義分類。