WordPress 勾選父分類自動勾選所有子分類:分類連動教學

在 WordPress 後台編輯文章時,若分類層級較深且子分類繁多,編輯人員往往需要逐一勾選父分類與其下的所有子分類,這不僅浪費時間,也容易發生漏選導致前台顯示邏輯錯誤。另一種常見狀況是取消勾選父分類時,子分類依然維持勾選狀態,造成資料關聯的不一致。

為什麼需要分類連動功能?

WordPress 原生的分類核取方塊在 UI 設計上是各自獨立的,並沒有父子層級的逻辑連動。但在許多實務情境中,分類具有包含關係,當文章屬於某個大類別時,通常也應自動歸類到其下所有細分項目中。透過 JavaScript 監聽 DOM 樹的結構變化,我們可以讓核取狀態自動向下傳遞,確保資料結構的完整性並提升上架效率。

實作程式碼:使用 jQuery 遍歷分類層級

以下程式碼利用 WordPress 後台內建的 jQuery 函式庫,鎖定分類核取方塊的 ID 規則進行連動控制:

jQuery(document).ready(function($) {
    // 當分類核取方塊的狀態(勾選或取消)改變時觸發
    $('input[type="checkbox"][id^="in-category-"]').change(function() {
        var checkbox = $(this);
        var isChecked = checkbox.prop('checked');
        var currentLi = checkbox.closest('li'); // 獲取當前點擊分類所在的 <li> 容器

        // 在當前分類下尋找所有子分類容器(ul.children)
        // 並將其中所有核取方塊的狀態同步為與父分類一致
        currentLi.find('ul.children input[type="checkbox"]').each(function() {
            $(this).prop('checked', isChecked);
        });
    });
});

步驟拆解與邏輯說明

  • 定位目標元素:利用 id^="in-category-" 選取器。WordPress 分類項目的 ID 通常以此字串開頭,這能確保我們精準選中分類核取方塊,而不影響後台其他功能的 Checkbox。
  • 鎖定父子範圍:透過 closest('li') 向上尋找最近的列表項,以此作為基準點向下搜尋 ul.children。這樣可以確保連動行為只會發生在當前點擊的「分支」內,不會誤觸到其他同層級的分類。
  • 同步布林值:將父分類的 checked 屬性值直接賦予給所有子代元素,實現一次勾選、全部選取,或一次取消、全部清除的行為。

實務踩坑與注意事項

在實作這類連動功能時,最常見的問題在於「動態載入」的內容。如果你的網站有使用自定義的 Quick Edit(快速編輯)或是在 AJAX 載入分類的面板中,上述的直接綁定方式可能會失效。建議在這種情況下改用事件委託(Event Delegation)的方式,將事件監聽器掛在 #category-all 或更高層級的容器上。

此外,要注意「常用分類」標籤頁與「所有分類」標籤頁的 ID 結構可能略有不同。此段代碼主要是針對標準的文章編輯頁面開發。如果網站使用了自定義分類法(Custom Taxonomies),請務必檢查後台生成的 HTML 原始碼,確認其 ID 前綴是否仍為 in-category-,若前綴隨分類法名稱改變,則需要調整正則匹配選取器。最後,這種同步是「單向向下」的,如果需求是「選取任一子分類就必須選取父分類」,則需要另外編寫向上遍歷(Parents traversal)的邏輯。

看不懂沒關係,照做就能用

以上的原理看不懂沒關係,只要照著下面的步驟操作就能直接套用:

  1. 安裝並啟用 FluentSnippets 外掛
  2. 點擊「Add New Snippet」新增片段
  3. 選擇程式碼類型為「Javascript」並將文章中的程式碼貼入
  4. 在執行位置(Priority & Location)設定中,選擇「Admin Only」
  5. 點擊儲存並將片段狀態切換為「啟用」
  6. 前往文章編輯後台,對分類進行勾選或取消勾選,確認子分類是否會自動同步狀態
如果啟用後網站出現異常,回到 Snippets 將該片段停用即可立刻復原,不會影響其他設定。
文章分享