~/blog/wordpress-custom-user-roles-capabilities-guide-2.md
WordPress 開發與技巧 · 2025 / 08 / 22 · 4 views

WordPress 權限之亂終結者:手刻自訂使用者角色,打造滴水不漏的管理後台

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
WordPress 權限之亂終結者:手刻自訂使用者角色,打造滴水不漏的管理後台
目錄 table-of-contents.md

在 WordPress 的世界打滾這麼多年,我看過太多網站因為權限管理不當而引發的災難。最常見的劇本就是:「這個行銷同事需要上稿,但又怕他亂動設定,只好給他『管理員』,然後祈禱不要出事。」嘿,兄弟,我們寫程式的,不是靠祈禱的好嗎?

WordPress 預設的「管理員」、「編輯」、「作者」等角色,在很多情境下,要嘛權力過大,要嘛處處受限,就像是尺寸完全不合的衣服,穿起來彆扭又危險。今天,我就要帶你徹底擺脫這種困境,不用再依賴那些功能臃腫的權限管理外掛。我們要親自動手,用最精準、最輕量的方式,為你的網站量身打造滴水不漏的使用者角色與權限系統。

為什麼 WordPress 預設角色不夠用?權限管理的真實痛點

我們先來複習一下 WordPress 的五大預設角色,你就會明白我的意思:

  • 管理員 (Administrator): 網站的上帝,擁有一切權力,包含刪除整個網站。這權限,你敢隨便給人嗎?
  • 編輯 (Editor): 可以管理所有文章、頁面、留言和分類,但不能動網站核心設定。
  • 作者 (Author): 只能撰寫和發布自己的文章。
  • 投稿者 (Contributor): 只能撰寫文章,但需要編輯或管理員審核才能發布。
  • 訂閱者 (Subscriber): 只能管理自己的個人資料。

看起來分工明確,但在真實的商業場景中,很快就會碰壁:

  • 電商網站的「倉庫管理員」: 他需要管理 WooCommerce 的訂單、處理出貨狀態,或許還要能編輯商品庫存,但他絕對不該有權限去修改網站外觀或安裝外掛。
  • 內容網站的「SEO 專家」: 他需要編輯所有文章和頁面的 SEO 標題、描述,甚至需要存取 SEO 外掛的設定,但他不應該有發布或刪除文章的權力。
  • 多作者部落格的「社群小編」: 他需要回覆所有文章的留言,但完全不需要碰觸任何文章內容的編輯。

看到問題了嗎?把「管理員」權限交出去,就像把家裡鑰匙連同保險箱密碼一起給了鐘點工;只給「編輯」或「作者」,他們又綁手綁腳,無法完成工作。這就是我們今天要解決的「權限之亂」。

權限管理的兩種途徑:外掛 vs. 程式碼

面對這個問題,通常有兩條路可以走。身為一個有點囉嗦的工程師,我得把兩條路的優劣都跟你說清楚。

方便快速的外掛方案 (例如 User Role Editor)

對於不熟悉程式碼的站長來說,使用像 User Role Editor 這類外掛是最直覺的選擇。它提供圖形化介面,讓你用勾選的方式來新增、刪除或修改角色的權限 (Capabilities)。

  • 優點:簡單、快速、不需要寫任何程式碼。
  • 缺點:你的網站多了一個外掛需要維護,可能增加系統負擔或潛在的衝突、安全風險。當你的權限邏輯變得複雜時,完全依賴外掛可能會讓你未來的功能擴展受到限制。

精準可控的程式碼方案 (工程師的首選)

這就是我們今天的重頭戲。透過在你的網站中加入一小段程式碼,我們可以精準地創造出任何我們想要的角色,並賦予它不多不少、恰到好處的權限。這也是所有專業 WordPress 開發者處理權限問題的標準做法。

  • 優點:極致輕量、完全客製化、程式碼掌握在自己手中,安全且易於維護,未來擴展性極強。
  • 缺點:你需要對 PHP 有基本的了解,並且知道要把程式碼放在哪裡。

實戰開始!用程式碼打造你的專屬角色

好了,理論說完了,我們來動手吧。首先,你得決定這段神聖的程式碼要安放在何處。

程式碼該放哪?functions.php 還是自訂外掛?

很多人會直覺地把程式碼丟到佈景主題的 `functions.php` 檔案裡。這當然可以運作,但這不是最佳實踐。為什麼?因為一旦你更換了佈景主題,你辛苦建立的自訂角色就全部消失了!這絕對是個災難。

工程師的堅持:使用者角色和權限是網站的核心功能,它不應該跟你的「外觀 (佈景主題)」綁在一起。因此,最專業、最可靠的做法是建立一個小小的自訂外掛來存放這些程式碼。這樣一來,無論你怎麼更換主題,你的權限系統都穩如泰山。關於如何從零打造一個外掛,你可以參考這篇《想寫自己的 WordPress 外掛?別再只會複製貼上!資深工程師帶你從零打造第一個外掛》

核心函式與工程師的囉嗦時間:只在『啟用時』執行一次!

WordPress 提供了幾個核心函式來讓我們操作角色和權限,最主要的是 `add_role()` 和 `add_cap()`。

一個非常、非常、非常重要的觀念是:新增角色的動作,只需要在你的程式碼(通常是外掛)「啟用」的那一刻執行一次就好!

我見過太多新手把 `add_role()` 直接寫在程式碼裡,導致每次頁面載入時,WordPress 都要去資料庫檢查一次這個角色是否存在,不存在就寫入。這完全是多餘且浪費資源的行為。正確的做法是使用 `register_activation_hook`,讓程式碼只在啟用外掛時執行一次。

基本結構如下:

/**
 * 在外掛啟用時執行的函式
 */
function roamer_create_custom_roles() {
    // 新增角色的程式碼會放在這裡
}
register_activation_hook( __FILE__, 'roamer_create_custom_roles' );

/**
 * 在外掛停用時執行的函式
 */
function roamer_remove_custom_roles() {
    // 移除角色的程式碼會放在這裡
}
register_deactivation_hook( __FILE__, 'roamer_remove_custom_roles' );

完整範例:打造「電商營運經理」與「SEO 專家」

現在,我們就用上面的結構來實際創造兩個角色。

案例一:電商營運經理 (Shop Manager)

我們的目標是建立一個「電商營運經理」角色,他需要:

  • 管理 WooCommerce 訂單、商品、客戶。
  • 查看 WooCommerce 報表。
  • 擁有「編輯」角色的基本文章管理權限。
  • 不能碰觸網站設定、外掛、佈景主題。

策略很簡單:我們先複製「編輯」角色的所有權限,然後把 WooCommerce 相關的權限加上去。

function roamer_create_custom_roles() {
    // 1. 取得「編輯」角色的所有權限
    $editor_caps = get_role( 'editor' )->capabilities;

    // 2. 定義 WooCommerce 相關權限
    $woo_caps = array(
        'manage_woocommerce'              => true, // 管理 WC 設定
        'view_woocommerce_reports'        => true, // 查看報表
        'edit_product'                    => true, // 編輯單一商品
        'read_product'                    => true, // 閱讀商品
        'delete_product'                  => true, // 刪除商品
        'edit_products'                   => true, // 編輯多個商品
        'edit_others_products'            => true, // 編輯他人商品
        'publish_products'                => true, // 發布商品
        'read_private_products'           => true, // 讀取私密商品
        'delete_products'                 => true, // 刪除多個商品
        'delete_private_products'         => true, // 刪除私密商品
        'delete_published_products'       => true, // 刪除已發布商品
        'edit_published_products'         => true, // 編輯已發布商品
        'assign_product_terms'            => true, // 指派商品分類/標籤
        'edit_shop_order'                 => true, // 編輯單一訂單
        'read_shop_order'                 => true, 
        'delete_shop_order'               => true, 
        'edit_shop_orders'                => true, 
        'edit_others_shop_orders'         => true, 
        'publish_shop_orders'             => true, 
        'read_private_shop_orders'        => true,
        'delete_private_shop_orders'      => true, 
        'delete_published_shop_orders'    => true,
    );

    // 3. 合併權限
    $all_caps = array_merge( $editor_caps, $woo_caps );

    // 4. 新增角色!
    add_role( 
        'shop_manager_custom', 
        '電商營運經理', 
        $all_caps
    );
}

案例二:SEO 專家 (SEO Specialist)

接下來是「SEO 專家」,他需要:

  • 編輯所有文章和頁面(但不能發布或刪除)。
  • 管理分類和標籤。
  • 存取 SEO 外掛(以 Yoast SEO 為例)的設定權限。

這次我們複製「作者」的權限,再慢慢往上加。

function roamer_create_custom_roles() {
    // ... (前面電商經理的程式碼) ...

    // 1. 取得「作者」角色的權限
    $author_caps = get_role( 'author' )->capabilities;

    // 2. 定義我們需要新增的權限
    $seo_caps = array(
        'edit_others_posts'   => true, // 編輯他人文章
        'edit_others_pages'   => true, // 編輯他人頁面
        'edit_pages'          => true, // 編輯頁面
        'manage_categories'   => true, // 管理分類
        // --- Yoast SEO 權限 ---
        'wpseo_manage_options' => true, // 管理 Yoast 設定
        'wpseo_edit_advanced_metadata' => true, // 編輯進階元數據
    );

    // 3. 合併權限
    $all_caps = array_merge( $author_caps, $seo_caps );

    // 4. 移除他們不該有的權限
    unset( $all_caps['publish_posts'] );
    unset( $all_caps['delete_posts'] );
    unset( $all_caps['delete_published_posts'] );

    // 5. 新增角色
    add_role(
        'seo_specialist',
        'SEO 專家',
        $all_caps
    );
}

進階應用:創造並檢查「自訂權限」

最酷的地方來了。我們不只可以組合 WordPress 內建的權限,還可以創造屬於我們自己的全新權限!這在你開發自訂功能時超級有用。

想像一下,你的網站有個功能,是把某篇文章標示為「本週主打」,你希望這個功能只有「編輯」和我們剛建立的「電商營運經理」能用。

步驟一:為角色新增自訂權限

我們可以在啟用外掛時,為特定角色加上一個我們自己發明的權限,例如 `mark_as_weekly_featured`。

function roamer_add_custom_capabilities() {
    $roles_to_add_cap = [ 'editor', 'shop_manager_custom' ];
    foreach ( $roles_to_add_cap as $role_name ) {
        $role = get_role( $role_name );
        if ( $role ) {
            $role->add_cap( 'mark_as_weekly_featured', true );
        }
    }
}
// 同樣地,這也應該放在啟用掛鉤中
register_activation_hook( __FILE__, 'roamer_add_custom_capabilities' );

步驟二:在程式碼中檢查權限

然後,在你開發「本週主打」功能的程式碼處(例如,在文章編輯頁面顯示一個勾選框),用 `current_user_can()` 來檢查當前登入的使用者是否擁有這個權限。

// 假設這是在文章編輯頁面的某個地方
if ( current_user_can( 'mark_as_weekly_featured' ) ) {
    // 如果使用者有這個權限,就顯示「設為本週主打」的選項
    echo '<label><input type="checkbox" name="weekly_featured"> 設為本週主打</label>';
}

看到了嗎?透過這種方式,你的功能和權限系統完美結合,既安全又極具彈性。這才是專業的開發流程,也讓你更容易打造出客戶喜愛的客製化後台體驗

結論:告別權限之亂,成為後台的真正主宰

今天我們從為什麼需要自訂角色,一路談到如何用最專業、最穩健的方式來實作它。透過程式碼來管理權限,或許一開始有點門檻,但它帶來的穩定性、安全性與靈活性,遠遠超過依賴外掛。這不僅能讓你打造出更安全的網站,也讓團隊協作流程更加順暢。

別再把「管理員」權限當成萬能鑰匙了。花點時間思考你的網站真正需要哪些角色,他們又需要哪些恰如其分的權限。動手實作,你就能終結權限之亂,成為 WordPress 後台的真正主宰。

延伸閱讀

如果你對於規劃複雜的權限系統,或是在 WordPress 開發上遇到任何挑戰,覺得需要更專業的技術支援,浪花科技的團隊隨時都在這裡。我們專注於解決複雜的技術問題,打造高效能、高安全性的網站。歡迎點擊這裡,填寫表單與我們聯繫,讓我們一起聊聊如何讓你的網站變得更強大!

// FAQ

常見問題

WordPress 預設有哪些使用者角色?
WordPress 內建五大角色:管理員(Administrator)擁有一切權力;編輯(Editor)可管理所有文章、頁面、留言與分類但不能動核心設定;作者(Author)只能撰寫並發布自己的文章;投稿者(Contributor)只能寫文章、需審核才能發布;訂閱者(Subscriber)只能管理自己的個人資料。
自訂使用者角色的程式碼該放在 functions.php 還是自訂外掛?
建議放在自訂外掛,而非佈景主題的 functions.php。因為使用者角色與權限是網站核心功能,不該與外觀綁在一起;若放在 functions.php,一旦更換主題,辛苦建立的自訂角色就會全部消失。
新增 WordPress 角色的 add_role() 應該在何時執行?
新增角色只需在外掛啟用的那一刻執行一次,應使用 register_activation_hook 註冊。若直接把 add_role() 寫在每次頁面載入都執行的程式碼裡,會讓 WordPress 反覆檢查資料庫,造成多餘且浪費資源的行為。
如何用程式碼建立一個基於既有角色再加權限的自訂角色?
可以先用 get_role('editor')->capabilities 取得現有角色的所有權限,將其與額外需要的權限(例如 WooCommerce 的 manage_woocommerce、edit_shop_orders 等)以 array_merge 合併,再呼叫 add_role('shop_manager_custom', '電商營運經理', $all_caps) 建立新角色。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?