如何在 WordPress 中創建專屬的自定義分類法

已發表: 2022-03-11

WordPress 是最強大的開源博客和內容管理系統之一,它被用於為大部分互聯網提供動力。 多達四分之一的網站運行 WordPress,並且對 WordPress 開發服務的需求並不缺乏。

與許多其他 CMS 不同,WordPress 因其靈活性和可定制性而受到許多人的喜愛。 分類法是 WordPress 的核心功能之一,可讓您按照需要的方式組織內容。 儘管它內置了一些默認分類法,但 WordPress 允許您添加任意數量的自定義分類法。

但是,讓分類法完全按照您希望的方式運行可能需要您擺弄一些未記錄的方法。

各種 WordPress 分類選項的圖形表示

在本文中,您將了解如何在 WordPress 中定義專有的自定義分類法,這些分類法的行為更像類別而不是標籤,從而使您可以比開箱即用的方式更嚴格地對帖子進行分類。

什麼是分類法?

根據 WordPress 法典:

分類法是將事物組合在一起的一種方式。

例如,可以根據不同的特徵將一堆不同類型的水果分組在一起,然後可以為這些組分配名稱。

在 WordPress 中,分類法用於對不同組下的帖子、頁面甚至自定義帖子類型進行分組。

分類中不同分組的名稱稱為術語。 以水果為例,以及如何根據顏色對它們進行分組。 在這種情況下,不同顏色的名稱將成為術語。

默認情況下,WordPress 內置了四種分類法:類別標籤鏈接類別帖子格式。 您可以在此處了解有關這些默認分類法的更多信息。

在這些內置分類法中,類別和標籤非常相似,但有一個重要區別:類別是專有分類法(即,對於每個帖子,您最多可以選擇一個類別),而每個帖子可以分配多個標籤。

此外,類別通常是預定義的,而標籤可以隨時定義。

定義自定義分類法

您可以使用register_taxonomy()函數定義自定義分類。 您可以在此處了解有關該功能的更多信息。

要了解此功能的工作原理,讓我們為帶有風景照片的帖子定義一個自定義分類。

 function view_init() { register_taxonomy( 'view', 'post', array( 'label' => __( 'View' ), 'capabilities' => array( 'assign_terms' => 'edit_guides', 'edit_terms' => 'publish_guides' ) ) ); } add_action( 'init', 'view_init' );

在上面的代碼片段中,我們為帖子定義了一個名為view的新分類法。

您可以認為此分類法用於根據照片中存在的視圖的種類或性質(例如,山、湖或森林)對照片進行分類。

與往常一樣,屬於該類別特定術語的帖子將出現在/view/{view_name}下。

上面代碼片段中的功能行是可選的。 沒有它,WordPress 將默認功能與帖子相同的用戶。 如上所示,這將允許任何具有自定義“edit_guides”功能的用戶將分類分配給帖子,並允許任何具有自定義“publish_guides”功能的用戶創建新的分類項。

根據官方文檔,可以定義四種能力:

分類功能包括assigntermsedittermsmanageterms (在管理導航中顯示分類)和deleteterms

如何使用分類法

在您的代碼中,您可以使用wp_set_object_terms()函數將術語添加到使用分類法的對像中。 您可以使用the_terms()函數列出現有術語。 此外,您可以使用wp_tag_cloud()函數為您的自定義分類生成一組術語。 您可以在此處了解有關這些功能的更多信息。

在 UI 方面,WordPress 在每個分類的帖子上創建一個新的元框。 元框類似於標籤元框,可讓您將一個或多個術語鏈接到您的帖子。 這是 WordPress 默認所做的,這也是我們可以通過使分類排他性來改變的:使自定義分類的行為類似於類別分類。

強制分類法的排他性

當我們使用register_taxonomy()方法創建自定義分類時,WordPress 會在帖子編輯頁面中添加一個包含多項選擇的元框:

使用此元框,用戶可以選擇任意數量的現有(已使用)術語,也可以使用文本框添加新術語。

要創建類似類別的分類法,其中每個帖子最多屬於一組預定義類別中的一個類別,您可以通過稍微調整 WordPress 來做到這一點:

  • 隱藏 WordPress 創建的默認元框。
  • 在帖子編輯頁面上創建一個自定義元框,它將為單個項目選擇提供控件。
  • 保存帖子時保存分類值。

讓我們來看看每個步驟。

隱藏由 WordPress 創建的默認元框

為此,我們需要在調用register_taxonomy時將show_in_quick_editmeta_box_cb選項設置為false

自定義分類元框的屏幕截圖,您可以在其中將項目添加到可用術語集中

第一個選項在快速/批量編輯面板中隱藏分類,第二個選項在帖子編輯頁面中隱藏它:

 register_taxonomy( 'custom_taxonomy', 'post', array( 'labels' => array( 'name' => 'Custom Exclusive Taxonomy' ), 'show_in_quick_edit' => false, 'meta_box_cb' => false ));

當默認元框隱藏時,可以通過分類管理頁面將項目添加到分類的可用術語集中:

帶有多個單選按鈕的名為 Custom Exclusive Taxonomy 的元框的屏幕截圖

在帖子編輯頁面上創建自定義元框

要創建自定義元框,我們可以使用add_meta_boxes WordPress 掛鉤。 您可以在此處了解有關鉤子的更多信息。

 add_action('add_meta_boxes', 'add_custom_meta_box'); function add_custom_meta_box(){ add_meta_box( 'taxonomy_box', __('Custom Exclusive Taxonomy'), 'fill_custom_meta_box_content', 'post' ,'side'); }

我們使用以下參數調用add_meta_box方法:

  • taxonomy_box – 元框的 ID
  • __('Custom Exclusive Taxonomy') – 元框的標題
  • fill_custom_meta_box_content – 用於填充元框內容的函數
  • post - 這表示元框應該出現在帖子編輯頁面上。
  • side - 這表示應該插入元框的位置。

請注意我們如何將taxonomy_box指定為 ID。 然而,正是第三個參數中的函數讓我們定義將要放入盒子的內容。

我們現在將實現fill_custom_meta_box_content函數:

 <?php function fill_custom_meta_box_content( $post ) { $terms = get_terms( array( 'taxonomy' => 'custom_taxonomy', 'hide_empty' => false // Retrieve all terms )); // We assume that there is a single category $currentTaxonomyValue = get_the_terms($post->ID, 'custom_taxonomy')[0]; ?> <p>Choose taxonomy value</p> <p> <?php foreach($terms as $term): ?> <input type="radio" name="custom_taxonomy" value="<?php echo $term->term_id;?>"<?php if($term->term_id==$currentTaxonomyValue->term_id) echo "checked"; ?>> <label for="taxonomy_term_<?php echo $term->term_id;?>"><?php echo $term->name; ?></label> </input><br/> <?php endforeach; ?> </p> <?php }

在這裡,我們首先檢索分​​類的所有術語(即現有值)。 我們將使用這些來顯示單選按鈕控件的列表。

接下來,我們使用get_the_terms()函數檢索當前選擇的分類術語——我們需要它來選擇相應的單選按鈕。

請注意,此函數返回一個數組。 這是因為,默認情況下,帖子可以有任意數量的與之關聯的術語。 根據我們的假設,帖子最多有一個術語,所以我們訪問第一個數組元素。 (如果數組為空也沒關係;我們將獲取null作為當前值,並且不會選擇單選按鈕。)

發出 HTML 的代碼使用custom_taxonomy作為單選按鈕的名稱,並使用相應的術語 ID 作為它們的值; 單選按鈕 ID 屬性僅用於連接到標籤標籤。 結果,我們得到以下自定義元框:

Custom Exclusive Taxonomy 的“添加新標籤”功能的屏幕截圖現在可在 WordPress 儀表板側邊欄上使用

保存帖子時保存分類值

最後,我們需要在保存帖子時保留分類值。 為此,我們可以使用save_post鉤子:

 add_action('save_post', 'save_custom_taxonomy'); function save_custom_taxonomy($post_id){ if ( isset( $_REQUEST['custom_taxonomy'] ) ) wp_set_object_terms($post_id, (int)sanitize_text_field( $_POST['custom_taxonomy'] ), 'custom_taxonomy'); }

就是這樣! 我們完了。

您現在知道如何定義一個行為類似於內置類別分類的自定義分類。

注意:WordPress 已接受一項功能請求,以便更輕鬆地切換自定義分類法的排他性。 但是,該票已經有一段時間沒有看到太多的活動了。

包起來

分類法是 WordPress 中一個非常強大且有用的功能。 開箱即用,它們缺乏對帖子進行嚴格分類的能力,但與 WordPress 中的幾乎所有東西一樣,分類法和相關功能是高度可定制的。 這使我們可以通過幾個步驟來添加這個經常需要的能力。

此處介紹的方法還可用於在帖子編輯頁面上為分類術語選擇創建更多自定義 UI。

我希望您發現這個關於定義專有自定義分類法的快速教程很有用!