WordPress 如何自定義文章類型?深入了解什麼是 Custom Post Type (CPT)?

更新日期:2026-01-28
/
WordPress製作技巧:如何創建自定義文章類型?

WordPress 網站中,自定義文章類型 (Custom Post Type, CPT) 是擴展網站功能的關鍵工具,能讓你不再受限於預設的文章與頁面。無論是打造作品集、商品展示,或是特殊內容分類,學會自定義文章類型都能大幅提升網站的專業度與靈活性。本篇文章將以簡單易懂的方式,帶你從 CPT 基礎概念、建立方法到範例程式碼,完整掌握 WordPress 自定義文章類型的實作技巧。

什麼是 WordPress 自定義文章類型?

WordPress 自定義文章類型(Custom Post Type,簡稱 CPT)是 WordPress 內建的一項功能,允許你在預設的「文章」與「頁面」之外,建立專屬的內容類別。每一種自定義文章類型都可以擁有獨立的後台管理介面、欄位結構、分類法,以及前台顯示邏輯。

WordPress 本身已經內建幾種自定義文章類型,例如「媒體」、「選單」、「修訂版本」都屬於這個概念的一部分。當你在做一個電商網站時,「產品」就是一種自定義文章類型;做一個房仲網站時,「物件」也是。這些內容在結構上與一般部落格文章差異很大,混在同一個列表裡管理會造成很大的麻煩。

從技術角度來說,自定義文章類型儲存在 WordPress 的 wp_posts 資料表裡,透過 post_type 欄位加以區分。這代表它與核心系統高度整合,查詢效率與穩定性都有一定保障,不是一個外掛架構在上面的脆弱功能。

為什麼需要使用自定義文章類型而非預設文章?

預設文章適合時序性內容,像是新聞、部落格文章。但當你的網站需要管理「作品集」、「活動行程」、「課程」、「客戶案例」這類結構固定、重複出現的內容時,用預設文章硬撐會有明顯的問題。

第一個問題是分類混亂。假設你同時在寫部落格又在上架課程,兩種內容混在同一個列表裡,後台管理會越來越難維護,搜尋與篩選都不精準。

第二個問題是欄位不足。預設文章只有標題、內文、標籤、分類,但一個課程可能需要「講師」、「上課時間」、「報名連結」、「課程難度」這些欄位,預設文章根本無法原生支援。

第三個問題是顯示邏輯難以控制。自定義文章類型可以搭配獨立的模板檔案,讓每種內容有完全不同的前台呈現方式,而不是所有內容都套同一個版型。

簡單說,當你的網站內容不只是「寫文章」這件事,自定義文章類型幾乎是必要的選擇。

如何在 functions.php 中註冊自定義文章類型

透過程式碼註冊是最靈活的做法,適合有基礎 PHP 知識的使用者。核心函數是 register_post_type(),需要掛在 init 這個 action hook 上。

以下是一個「課程」自定義文章類型的實際範例:

function register_course_post_type() {
    $args = array( 
        'label'        => '課程',
        'public'       => true,
        'has_archive'  => true,
        'rewrite'      => array( 'slug' => 'courses' ),
        'supports'     => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
        'menu_icon'    => 'dashicons-welcome-learn-more',
        'show_in_rest' => true,
    );
    register_post_type( 'course', $args );
}
add_action( 'init', 'register_course_post_type' );

幾個重要參數說明:public 設為 true 代表這個類型在前台可見;has_archive 設為 true 讓你可以有一個列表頁;show_in_rest 設為 true 是讓區塊編輯器(Gutenberg)能夠正常運作的關鍵,許多人漏掉這個參數後發現編輯器異常。

完成程式碼新增後,必須進入「設定 > 永久連結」重新儲存一次,否則新的文章類型網址會顯示 404 錯誤。這是初學者最常遇到卻最容易被忽略的步驟。

建議不要直接修改 functions.php 主題檔案,而是建立一個子主題或使用 Code Snippets 插件來管理這些程式碼,避免主題更新時覆蓋你的修改。

使用插件快速創建自定義文章類型的方法

如果不想碰程式碼,Custom Post Type UI(CPT UI)是目前安裝量超過 200 萬的主流選擇。它提供完整的圖形介面,讓你填寫幾個欄位就能建立自定義文章類型,連分類法(Taxonomy)都可以一併設定。

安裝啟用後,後台側邊欄會出現「CPT UI」選單。點選「Add/Edit Post Types」,填入 Post Type Slug(例如 course)、文字標籤,以及你需要開啟的功能選項,最後按下儲存,就完成了基本設定。整個過程大約五分鐘。

另一個值得一提的選項是 Pods Framework。Pods 不只能建立自定義文章類型,還能同時定義這個類型專屬的欄位,適合需要一站式解決方案的使用者。它的學習曲線比 CPT UI 稍高,但功能更完整,特別適合需要複雜資料結構的網站。

插件方式的缺點是網站效能與插件的維護狀態高度相關。如果插件停止更新或與新版 WordPress 不相容,你的自定義文章類型設定可能會出問題。相較之下,程式碼方式的可控性更高,在技術允許的情況下,中長期維護成本反而更低。

自定義文章類型的分類與標籤管理技巧

WordPress 的分類法(Taxonomy)是獨立的系統,可以綁定到任何文章類型。預設的「分類目錄」與「標籤」是綁定在 post 這個文章類型上的,你完全可以建立新的分類法,專門用於你的自定義文章類型。

舉例來說,一個課程網站可能需要「課程類別」(如:程式設計、設計、行銷)這種階層式分類法,同時也需要「課程標籤」這種非階層式分類法。兩者都需要透過 register_taxonomy() 來建立,並在 register_post_type() 的 taxonomies 參數中指定關聯。

用程式碼建立分類法時,hierarchical 參數決定它的行為模式:true 代表像分類目錄有父子關係,false 代表像標籤是平行的。rewrite slug 建議使用有意義的英文詞,對 SEO 有直接幫助。

另一個常被忽略的技巧是,你可以讓多種自定義文章類型共用同一個分類法。假設你有「課程」和「工作坊」兩種類型,但都使用「主題分類」這個分類法,只需在 register_taxonomy() 的 object_type 參數中同時帶入兩個文章類型名稱即可,不需要重複建立兩套分類系統。

在前端顯示自定義文章類型的常用模板方法

WordPress 的模板階層(Template Hierarchy)完整支援自定義文章類型。對於單篇內容,WordPress 會依序尋找 single-post.php、single.php、singular.php 這幾個檔案。對於列表頁(archive),則會依序尋找 archive-post.php、archive.php。

實際操作上,你只需在主題資料夾內建立一個名為 single-course.php 的檔案,WordPress 就會自動在顯示課程單頁時套用這個模板,不需要其他設定。這讓你可以完全控制課程的版型,獨立於部落格文章的樣式。

如果你使用的是區塊主題(FSE,Full Site Editing),模板系統改在 Site Editor 裡管理,你可以在那裡建立專屬於特定文章類型的模板,邏輯相同但操作介面不同。

除了模板檔案,WP_Query 是另一個常用工具,讓你在任意頁面嵌入特定文章類型的內容列表。query 參數中指定 post_type 就能精準抓取內容。搭配 Shortcode 或自訂區塊,你可以把課程列表放在任何你想放的地方。

自定義文章類型的權限與可見性設定

register_post_type() 裡有幾個參數直接控制這個類型的可見性與權限,不了解的話很容易設錯。

public 是最核心的開關。設為 true 時,publicly_queryable、show_ui、show_in_nav_menus 這幾個子參數預設都會繼承為 true。但你可以單獨覆蓋,例如某個類型只希望在後台管理但不對外公開,就設 public => false 並單獨設 show_ui => true。

capability_type 參數決定這個文章類型使用哪套權限規則。預設繼承 post 的權限(edit_posts、delete_posts 等),大多數情況這樣已足夠。如果你需要一套獨立的權限讓特定角色只能管理這個類型,設定 capability_type => ‘course’ 搭配 map_meta_cap => true,WordPress 會自動生成對應的 capability 名稱,再用 User Role Editor 這類插件分配給對應角色。

exclude_from_search 參數控制這個類型的內容是否出現在前台搜尋結果,與 SEO 索引是獨立的概念,兩者不要混淆。

進階技巧:結合自定義欄位提升文章功能

自定義文章類型的真正威力在於結合自定義欄位(Custom Fields / Meta Fields)。光有一個「課程」類型卻只能填標題和內文,還不夠實用。加上自定義欄位後,你可以讓每筆課程記錄帶有「講師姓名」、「課程費用」、「報名截止日期」這些結構化資料。

Advanced Custom Fields(ACF)是目前最被廣泛使用的自定義欄位插件,免費版功能已相當完整。你可以建立一個欄位群組,設定顯示條件為「文章類型等於 course」,這樣欄位就只會出現在課程的編輯頁面,不會污染其他類型的介面。

ACF 支援超過 30 種欄位類型,包括日期選擇器、關係型欄位、圖片上傳、重複欄位(Repeater,付費功能)等。關係型欄位特別有用,例如讓課程可以關聯到講師這個自定義文章類型,建立跨類型的資料連結。

在前台輸出自定義欄位的值,ACF 提供 get_field() 和 the_field() 兩個函數,使用方式直觀。如果你用 WP_Query 抓資料,也可以透過 meta_query 對自定義欄位值進行篩選,例如只顯示費用低於特定金額的課程,或只列出未來七天內開課的課程,這是建立進階搜尋與篩選功能的基礎。

最佳實踐與常見錯誤避免指南

規劃自定義文章類型時,最常見的錯誤是過度創建。很多人一開始什麼都想建立獨立類型,結果網站累積了十幾種很少使用的類型,後台變得雜亂,查詢效能也受影響。建議的判斷標準是:這種內容是否有至少五個以上固定欄位,而且預期會有超過二十筆以上的資料?如果否,用一般頁面或分類就夠了。

Slug 的命名要謹慎,一旦網站上線並被搜尋引擎收錄,更改 slug 會導致所有相關 URL 失效,必須設定 301 轉址才能補救,否則會影響 SEO 排名。英文、全小寫、用連字號分隔,是命名的基本原則。

記得在 register_post_type() 中設定 show_in_rest => true,除了讓 Gutenberg 正常運作,也是讓 Yoast SEO 或 Rank Math 能夠正確偵測並為這個文章類型開啟 SEO 設定的前提。這兩款 SEO 插件都支援對自定義文章類型單獨設定 sitemap 收錄策略,值得進入插件設定確認配置。

最後,如果你的自定義文章類型是透過程式碼註冊,強烈建議把這段程式碼放進一個自製的「功能型插件」(Functionality Plugin)而非主題的 functions.php。原因很簡單:主題換掉時,放在 functions.php 裡的程式碼會一起消失,那些文章類型的後台會突然不見,雖然資料還在資料庫,但管理介面會完全無法操作,對非技術人員來說就像資料消失了一樣,是非常難以解釋的狀況。

常見問題

自訂文章類型是WordPress的一項功能,可讓使用者建立並定義新的內容類型,不受限於預設的「文章」和「頁面」。藉此可創造更豐富的內容架構,並提升內容管理的靈活性。

WordPress預設提供「文章」和「頁面」兩種基本文章類型。除此之外,WordPress也支援自訂文章類型,能滿足各種內容需求,如產品、投資組合、活動等。

使用自訂文章類型的好處包括:1)滿足特定內容需求 2)提升內容架構的組織性 3)增強內容管理的靈活性 4)優化內容的SEO表現。透過自訂文章類型,網站能更貼近業務需求,並提升使用者體驗。

建立自訂文章類型的步驟包括:1)定義內容類型 2)設定欄位屬性 3)註冊自訂文章類型 4)在後台管理介面中管理內容。使用外掛或主題內建功能皆可完成上述流程,快速建立所需的內容類型。

自訂文章類型的應用場景十分廣泛,如產品展示、部落格文章、投資組合、活動行事曆等。透過靈活的內容架構,網站能更有效組織和呈現各類內容,提升使用者體驗。

關於作者

BrianLO Studio

我們分享 WordPress 網頁設計、平面設計、網站SEO優化,以及 AI 工具的知識,針對香港中小企業的實際需要,助你提升品牌形象!

相關文章

一站式設計及網上推廣

立即開始,打造品牌網站

WhatsApp 免費查詢