iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
0
自我挑戰組

WordPress 客製化從 0 開始系列 第 22

Day 22 客製化 WordPress 的精髓:內容類型 (post type)

大家好,我是 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()


上一篇
Day 21 客製化 WordPress 程式的起點:勾點 (hook)
下一篇
Day 23 WordPress 的自訂欄位 (custom fields)
系列文
WordPress 客製化從 0 開始30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
thanatus25
iT邦新手 5 級 ‧ 2020-09-27 20:31:06

推薦這個網站 可以很方便的generate創立post type的code
https://generatewp.com/generator/

感覺很厲害欸!超實用,感謝分享~

我要留言

立即登入留言