大家好,我是 Eric。
昨天我們介紹了 WordPress 的勾點 (hook) 機制。今天我們將進一步介紹客製化 WordPress 的另一個核心:內容類型 (post type)*。
* Post type 目前的通譯名稱為「文章類型」,但是 post 應為「內容儲存」的單位,因此這個網站將以「內容類型」稱之。
內容類型可以延伸的運用,最常見的就是投影片輪播,以及「作品集」、「使用者證言」等。
根據 WordPress 的開發人員手冊,我們會透過 init
這個勾點 (hook) 來註冊內容類型,其基本程式碼如下:
add_action( 'init', 'register_my_cpt' );
function register_my_cpt(){
$labels = array( // 定義內容類型會使用的標籤
"name" => "在控制台選單顯示的名稱",
"singular_name" => "在控制台選單顯示的名稱",
"all_items" => "在控制台選單顯示的名稱,如 [所有文章]",
"add_new" => "如 [新增]",
"add_new_item" => "如 [新增文章]",
"edit_item" => "如 [編輯文章]",
"new_item" => "在導覽列新增項目顯示的名稱",
"view_item" => "如 [檢視文章]",
"view_items" => "[檢視文章],複數型態",
);
$args = array(
"label" => "在控制台選單顯示的名稱",
"labels" => $labels,
"description" => "",
"public" => true,
"publicly_queryable" => true,
"delete_with_user" => false,
"show_in_rest" => false,
"rest_base" => "",
"rest_controller_class" => "WP_REST_Posts_Controller",
"has_archive" => true,
"show_in_menu" => true,
"show_in_nav_menus" => true,
"exclude_from_search" => false,
"capability_type" => "post",
"hierarchical" => false,
"rewrite" => array(
"slug" => "內容類型代稱",
"with_front" => true
),
"query_var" => true,
"supports" => array( "title", "thumbnail" ),
);
register_post_type( '內容類型名稱', $args );
}
引述名稱 | 引述型別 | 說明
-------+-------+-------
label | 字串 string | 在控制台選單顯示的名稱。
labels | 陣列 array | 控制台選單顯示的詳細名稱。
description | 字串 string | 關於內容類型的敘述,顯示在 [全部文章] 頁面中。
public | 布林值 boolean | 是否可以公開存取,選 false
的話則無法透過網址存取。
publicly_queryable | 布林值 boolean | 是否可以公開透過 ? 參數查詢。
delete_with_user | 布林值 boolean | 刪除使用者後,內容是否一併刪除。
show_in_rest | 布林值 boolean | 是否可以透過 Rest API 查詢,與區塊編輯器有關。
rest_base | 字串 string | 作為 Rest API 的查詢端點 (endpoint)。
show_in_menu | 布林值 boolean | 是否顯示在控制台。
show_in_nav_menu | 布林值 boolean | 是否顯示在頂端導覽列中。
exclude_from_search | 布林值 boolean | 是否排除於搜尋之外。
has_archive | 布林值 boolean | 是否有彙整頁。
capability_type | 字串 string | 權限,post
代表作者以上可以存取,page
則需要編輯以上。
hierarchical | 布林值 boolean | 是否會有上層內容,以頁面為例,每個頁面可以有上層頁面。
rewrite | 陣列 array | 陣列包含 slug
,譬如 http://你的網域/內容類型代稱/文章代稱
;以及 with_front
,如果是 true
,則會承接 [永久連結] 設定中的架構。例如 http://你的網域/blog/內容類型代稱/文章代稱
。
query_var | 布林值 boolean | 是否可以透過 ? 參數查詢,如果 publicly_queryable 是 false,則無視 query_var 的設定。
supports | 陣列 array | 支援功能,包含標題 title
、精選圖片 thumbnail
、編輯器 editor
、文章修改版本 revisions
等。
事實上,自訂內容類型除了記得上述的所有引數外,還有更簡便的方法:外掛。透過 Custom Post Type UI 這款外掛,可以從控制台的介面直接新增、管理自訂內容類型。
我自己的做法,會是透過 Custom Post Type UI 產生自訂內容類型後,接著使用 [Tools] 將程式碼匯出,插入子佈景主題的 functions.php 中。
除了內容類型外,WordPress 還有下列幾種客製化的方式,我們在這裡簡介各種客製化範圍的使用情境。
客製化範圍 | 使用情境
-------+-------
網站選項 (option) | 適用於全站的設定值,譬如網站的網址結構、網站管理員等。
內容類型 | 有別於 [文章] 與 [頁面] 的其他內容類型,譬如投影片輪播、常見問題、作品集等。
自訂欄位 (custom field) | 附屬於個別內容的中繼資料 (meta data),譬如說各分店的地址與聯絡方式。
區塊 (block) | 附屬於個別內容的「內容」,譬如說各分店的內裝與簡介。
以我目前接觸過的案件,以下的內容我都會透過自訂內容類型來呈現:
仔細觀察不同的外掛,你會發現許多外掛都會透過自訂內容類型的方式來進行客製化。以 Contact Form 7 為例,我們可以在 includes/contact-form.php 中看到以下的程式碼。Contact Form 7 便是藉此在控制台中新增 [聯絡表單] 這種內容類型:
register_post_type( self::post_type, array(
'labels' => array(
'name' => __( 'Contact Forms', 'contact-form-7' ),
'singular_name' => __( 'Contact Form', 'contact-form-7' ),
),
'rewrite' => false,
'query_var' => false,
'public' => false,
'capability_type' => 'page',
'capabilities' => array(
'edit_post' => 'wpcf7_edit_contact_form',
'read_post' => 'wpcf7_read_contact_form',
'delete_post' => 'wpcf7_delete_contact_form',
'edit_posts' => 'wpcf7_edit_contact_forms',
'edit_others_posts' => 'wpcf7_edit_contact_forms',
'publish_posts' => 'wpcf7_edit_contact_forms',
'read_private_posts' => 'wpcf7_edit_contact_forms',
),
) );
今天我們介紹的自訂內容類型,廣泛地用在各種外掛與佈景主題當中。通常我在規劃網站架構的時候,便會同時規劃該網站是否需要自訂內容類型。
雖然內容類型提供我們一條客製化的捷徑,很有彈性的增加不同的資料類型,但這同時是 WordPress 讓一般開發人員詬病的地方:將全部的內容都以 post
的型態儲存。在 WordPress 中,不論是聯絡表單、商品、常見問題、課程等,都被視為「內容」(post),如果沒有妥善規劃的話,不利於建立不同內容類型的關聯。但這已經牽涉到資料結構的設計,已經不是我們這次鐵人賽涵蓋的範圍,所以便點到為止。
接下來,我們要再討論客製化 WordPress 的另外一個範圍:自訂欄位 (custom fields),或是說,中繼資料 (meta)。
[WordPress 筆記] Day 4 Post Types 與內容管理
【第 12 天】自定義 WordPress 文章類型
register_post_type()
推薦這個網站 可以很方便的generate創立post type的code
https://generatewp.com/generator/
感覺很厲害欸!超實用,感謝分享~