WordPress 帖子類型:完整指南

已發表: 2021-02-16

如果您是那種非常關心設計和組織的 WordPress 開發人員,那麼是時候全面了解 WordPress 帖子類型了。

眾所周知,並非所有 WordPress 網站都是簡單的博客。 通常,開發人員需要的不僅僅是簡單、標準的頁面和帖子。 他們需要能夠添加全新的內容類型。

但是,打破 WordPress 設計和開發的玻璃天花板,同時仍為用戶提供出色的 UX 的最佳方法是什麼?

答案可以在 WordPress 帖子類型和 WordPress 自定義帖子類型中找到。

通過學習、理解和實現 WordPress 帖子類型的全部潛力,您將把您的管理區域變成一個令人興奮的、有組織的和個性化的地方,完全屬於您自己。

WordPress 帖子類型允許設計人員通過創建新的存儲桶來放置您獨特的內容類型來輕鬆組織內容。

但這究竟是什麼意思,你從哪裡開始呢?

使用 WordPress 自定義帖子類型可以為您網站的整體用戶體驗做什麼?

讓我們來了解一下。

什麼是 WordPress 帖子類型?

在最基本的範圍內,WordPress 帖子類型的工作方式類似於您管理區域中熟悉的帖子和頁面。

默認情況下,WordPress 核心包含幾種不同的內容類型,這些內容類型分為帖子類型。 這些內容類型之一稱為帖子。 但是,這只是 WordPress 中眾多標準帖子類型中的一種。

當您使用 WordPress 核心時,它會自動附帶以下帖子類型,每種類型都存儲在 WordPress 數據庫的 wp_posts 表中:

  • 頁面
  • 帖子
  • 修訂
  • 附件
  • 自定義 CSS
  • 導航菜單
  • 變更集

這些帖子類型中的每一種都有編輯器和標題字段,就像您習慣使用常規頁面和帖子一樣。

當您創建自定義帖子類型時(我們將在本指南中向您展示),它會像標準 WordPress 帖子類型一樣出現在您的 WordPress 管理菜單中。

一旦您實現了 WordPress 自定義帖子類型,您就可以向其中添加內容,就像向帖子部分添加新的博客內容一樣。

但是,使用 WordPress 帖子類型,您可以使這些帖子類型比標準帖子和頁面做更多的事情。 您還可以自定義站點前端向站點用戶顯示帖子類型內容的方式。

新的帖子類型可以是您想要的任何內容。 根據您網站的主題,它可能是這樣的:

  • 家園
  • 評論
  • 實例探究
  • 電影
  • 勵志名言
  • 等等。

WordPress 帖子類型功能使任何新類型的內容成為可能。

當然,有一些插件可以幫助您創建 WordPress 帖子類型。 但是您可能並不一定希望插件能夠對您的網站設計和功能進行如此多的控制。

如果您想完全控制您的設計和用戶體驗,最好的選擇是編寫您自己的自定義帖子類型。

我們將在本指南的後面為那些喜歡該選項來創建 WordPress 自定義帖子類型的人推荐一個插件。

但註冊、添加或創建 WordPress 帖子類型的最佳方式是將其直接編碼到您網站的主題中。 這是通過使用 WordPress register-post-type 功能完成的。

通過使用此功能,您可以立即將內容添加到新的帖子類型存儲桶中,並將其顯示在您的網站上。

更好的是,它只需要添加五行代碼即可開始。

看看 WordPress 自定義帖子類型

現在您已經對 WordPress 帖子類型和自定義帖子類型有了基本的了解,現在是時候動手了。

首先,請按照以下步驟創建新的帖子類型:

  1. 登錄到您的管理區域。
  2. 打開您的代碼編輯器和主題的functions.php 文件。
  3. 將下面顯示的五行代碼添加到functions.php 文件的頂部。
  4. 刷新瀏覽器。
  5. 檢查新帖子類型菜單項的評論下的 WordPress 管理菜單。
  6. 刷新你的永久鏈接。

這是要添加的代碼:

<?php 
  add_action( 'init', function() {
    $label = 'Books';
    $type = 'book';
    register_post_type( $type, [ 'public' => true, 'label' => $label ] );
  });

您現在應該有一個新的帖子類型。

但是你實際上可以用新的帖子類型做什麼?

WordPress 帖子類型和 WordPress 自定義帖子類型的力量

為了真正深入研究帖子類型,讓我們使用一個具體示例來創建一個新的投資組合網站,該網站需要包含一系列案例研究。

為此,我們將註冊一個新的帖子類型來管理每個案例研究。

使用默認的二十二十 WordPress 主題,我們將首先將我們的研究帖子類型添加到主題中。

首先,在您的代碼編輯器中打開二十二十主題的functions.php 文件。 這是您編寫帖子類型代碼的地方。

新的帖子類型必須在functions.php 文件的頂部註冊。 這是通過使用 add_action() 的 init WordPress 鉤子完成的。 當您使用函數 register_post_type 添加帖子類型時,如果沒有 init 鉤子,它將無法正常工作。

然後,從 register_post_type 的三個參數開始:

  1. 公開 - 這意味著設置帖子類型,以便每個人都可以訪問它。
  2. 描述 - 這不是經常使用,但它仍然很好。
  3. 標籤——這是一個我們稍後會擴展的論點。
<?php 
  add_action( 'init', function() {
    $type = 'study';
    $label = 'Studies';
    $arguments = [
        'public' => true, // Allow access to post type
        'description' => 'Case studies for portfolio.', // Add a description
        'label' => $label // Set the primary label
    ];
    register_post_type( $type, $arguments);
  });

確保每次完成更改時刷新永久鏈接。

自定義帖子類型標籤

默認情況下,WordPress 將在您網站的整個管理區域中將新帖子類型標記為 Post。 但您可能希望將標籤標記為名為 Study 而不是 Post 的新帖子類型。

為了覆蓋帖子類型的默認標籤,您需要手動調用它們。

要正確設置標籤,請創建一個新函數來編譯標籤,而不會弄亂您的帖子類型註冊代碼。

只需將以下功能添加到您的主題中,即可在帖子類型註冊過程中使用:

<?php 
  function xcompile_post_type_labels($singular = 'Post', $plural = 'Posts') {
    $p_lower = strtolower($plural);
    $s_lower = strtolower($singular);

    return [
      'name' => $plural,
      'singular_name' => $singular,
      'add_new_item' => "New $singular",
      'edit_item' => "Edit $singular",
      'view_item' => "View $singular",
      'view_items' => "View $plural",
      'search_items' => "Search $plural",
      'not_found' => "No $p_lower found",
      'not_found_in_trash' => "No $p_lower found in trash",
      'parent_item_colon' => "Parent $singular",
      'all_items' => "All $plural",
      'archives' => "$singular Archives",
      'attributes' => "$singular Attributes",
      'insert_into_item' => "Insert into $s_lower",
      'uploaded_to_this_item' => "Uploaded to this $s_lower",
    ];
  }

然後,在註冊碼中,您需要調用我們剛剛創建的函數 xcompile_post_type_labels()。 將它用於您的標籤,然後檢查您的管理區域。

<?php 
  add_action( 'init', function() {
    $type = 'study';

    // Call the function and save it to $labels
    $labels = xcompile_post_type_labels('Study', 'Studies');

    $arguments = [
      'public' => true,
      'description' => 'Case studies for portfolio.',
      'labels' => $labels // Changed to labels
    ];
    register_post_type( $type, $arguments);
  });

到目前為止一切如何?

WordPress 自定義帖子類型的菜單圖標和位置

自從引入 WP Dashicons 以來,將菜單圖標添加到帖子類型變得非常容易。

為此,首先將 menu_icon 參數設置為 Dashicon 名稱。 對於此示例,我們將通過使用值 dashicons-desktop 來使用計算機桌面圖標。

<?php 
  add_action( 'init', function() {
    $type = 'study';
    $labels = xcompile_post_type_labels('Study', 'Studies');

    $arguments = [
      'public' => true,
      'description' => 'Case studies for portfolio.',
      'menu_icon' => 'dashicons-desktop', // Set icon
      'labels' => $labels
    ];
    register_post_type( $type, $arguments);
  });

現在,如果您想更改菜單項的位置,請使用 menu_position 參數。 此參數將採用從 0 開始到 100 結束的值。所選值將在菜單基礎上列出更高或更低的菜單項,0 值位於頂部,100 位於底部。

現在,我們應該向新的帖子類型添加特色圖片。

如何啟用和禁用特色圖像、標題和編輯器

要添加或更改帖子類型的默認管理表單字段,例如特色圖片、標題和編輯器字段,請使用 set support 參數。

您可以使用帖子類型支持參數打開和關閉許多選項。 他們是:

  • 標題字段
  • 編輯
  • 作者框
  • 縮略圖(特色圖片)
  • 摘抄
  • 引用
  • 自定義字段
  • 註釋
  • 修訂
  • 頁面屬性
  • 後期格式

對於您的新研究帖子類型,您可以覆蓋默認的 WordPress 選項並通過應用縮略圖選項添加您自己的特色圖片。

在執行此操作之前,請確保您已啟用對後縮略圖的主題支持。 這是通過使用 add-theme-support 功能完成的。

只需添加幾行代碼即可使用支持功能,並且將啟用特色圖像。

<?php 
  // Add theme support for featured image / thumbnails
  add_theme_support('post-thumbnails');

  add_action( 'init', function() {
    $type = 'study';
    $labels = xcompile_post_type_labels('Study', 'Studies');

    // Declare what the post type supports
    $supports = ['title', 'editor', 'revisions', 'page-attributes', 'thumbnail'];

    $arguments = [
      'supports' => $supports, // Apply supports
      'public' => true,
      'description' => 'Case studies for portfolio.',
      'menu_icon' => 'dashicons-desktop',
      'labels' => $labels,
    ];
    register_post_type( $type, $arguments);
  });

沒有多少 WordPress 設計師或開發人員深入了解 WordPress 自定義帖子類型。 現在是輕拍自己的後背的好時機。

WordPress 自定義帖子類型的層次結構

雖然 WordPress 帖子不能有子帖子,但頁面可以。 頁面的子頁面被視為子頁面。

如果您願意,您可以使用層次參數讓 WordPress 自定義帖子類型使用類似頁面的層次結構。

對於我們的研究帖子類型示例,我們不一定需要這個。 但是,如果您的特定項目需要它,這是要使用的代碼:

<?php 
  add_action( 'init', function() {
    $type = 'study';
    $labels = xcompile_post_type_labels('Study', 'Studies');

    // Declare what the post type supports
    $supports = ['title', 'editor', 'revisions', 'page-attributes', 'thumbnail'];

    $arguments = [
      'hierarchical' => false, // Do not use hierarchy
      'supports' => $supports,
      'public' => true,
      'description' => 'Case studies for portfolio.',
      'menu_icon' => 'dashicons-desktop',
      'labels' => $labels,
    ];
    register_post_type( $type, $arguments);
  });

如何為新的帖子類型啟用 REST API

REST API 永遠改變了 WordPress。 因此,您會希望您的新帖子類型能夠訪問 WordPress 的所有最新功能,例如 Gutenberg。

為新的 WordPress 自定義帖子類型啟用 REST API 就像將 show_in_rest 參數設置為 true 一樣簡單。

啟用 REST API 後,您的新帖子類型將開始使用 Gutenberg(如果它也支持編輯器)。

<?php 
  add_action( 'init', function() {
    $type = 'study';
    $labels = xcompile_post_type_labels('Study', 'Studies');

    // Declare what the post type supports
    $supports = ['title', 'editor', 'revisions', 'page-attributes', 'thumbnail'];

    $arguments = [
      'show_in_rest' => true, // Enable the REST API
      'hierarchical' => false,
      'supports' => $supports,
      'public' => true,
      'description' => 'Case studies for portfolio.',
      'menu_icon' => 'dashicons-desktop',
      'labels' => $labels,
    ];
    register_post_type( $type, $arguments);
  });

當您在 WordPress 中啟用 REST API 時,您還可以通過特定的 WordPress 端點以 JSON 對象的形式訪問新的帖子類型。

要查看帖子類型 REST 的端點,請使用此 /wp-json/wp/v2/study。

要將 URL 中的帖子類型基本名稱更改為研究而不是研究,請使用 rest_base 參數。

<?php 
  add_action( 'init', function() {
    $type = 'study';
    $labels = xcompile_post_type_labels('Study', 'Studies');

    // Declare what the post type supports
    $supports = ['title', 'editor', 'revisions', 'page-attributes', 'thumbnail'];

    $arguments = [
      'rest_base' => 'studies', // Change the REST base
      'show_in_rest' => true,
      'hierarchical' => false,
      'supports' => $supports,
      'public' => true,
      'description' => 'Case studies for portfolio.',
      'menu_icon' => 'dashicons-desktop',
      'labels' => $labels,
    ];
    register_post_type( $type, $arguments);
  });

就像這樣,設置了 API 並在帖子類型上啟用了古騰堡。

如何將古騰堡添加到 WordPress 自定義帖子類型

請記住,除非 Gutenberg 支持編輯器並啟用了 REST API,否則無法為自定義帖子類型啟用。

啟用後,要將 Gutenberg 添加到您的帖子類型,我們需要暫時忘記我們的 Study 帖子類型並創建一個新的帖子類型,我們將其稱為文章。

我們將使用文章帖子類型來啟用古騰堡。

<?php 
  add_action( 'init', function() {
    $type = 'article';
    $labels = xcompile_post_type_labels('Article', 'Articles');

    $arguments = [
      'rest_base' => 'articles',
      'show_in_rest' => true, // Required for Gutenberg
      'supports' => ['editor'], // Required for Gutenberg
      'public' => true,
      'description' => 'Case studies for portfolio.',
      'menu_icon' => 'dashicons-desktop',
      'labels' => $labels,
    ];
    register_post_type( $type, $arguments);
  });

您會注意到需要添加 Gutenberg 的兩個參數是:

'show_in_rest' => true,
'supports' => ['editor'],

如何從 WordPress 自定義帖子類型中刪除古騰堡

如果您想從您的一種帖子類型中刪除 Gutenberg,只需將操作鉤子 use_block_editor_for_post_type 添加到您主題的 functions.php 文件中。

這是通過以下代碼完成的:

<?php 
add_filter('use_block_editor_for_post_type', function($enabled, $post_type) {

  // List of post types to remove
  $remove_gutenberg_from = ['study'];

  if (in_array($post_type, $remove_gutenberg_from)) {
    return false;
  }

  return $enabled;
  }, 10, 2);

這會強制從帖子類型中禁用古騰堡。

請注意,並非所有 WordPress 自定義帖子類型都應啟用 Gutenberg。 有時您可能希望使用帶有帖子類型的經典 WordPress 編輯器。

當需要從 REST API 訪問帖子類型時,禁用古騰堡功能也會派上用場。

在這些情況下,禁用古騰堡是您想要的方向。

啟用檔案和設置前端

我們終於到了解決 WordPress 自定義帖子前端設計的時候了。

當您想要設置 WordPress 自定義帖子類型內容列表時,您需要做三件事:

  1. 啟用 has_archive 參數。
  2. 將重寫規則 slug 設置為帖子類型名稱的複數形式。 在本指南的示例中,需要將其更改為“研究”。
  3. 刷新你的永久鏈接。
<?php 
  add_action( 'init', function() {
    $type = 'study';
    $labels = xcompile_post_type_labels('Study', 'Studies');

    // Declare what the post type supports
    $supports = ['title', 'editor', 'revisions', 'page-attributes', 'thumbnail'];

    $arguments = [
      'rewrite' => [ 'slug' => 'studies' ] // Change the archive page URL
      'has_archive' => true, // Enable archive page
      'rest_base' => 'studies',
      'show_in_rest' => true,
      'hierarchical' => false,
      'supports' => $supports,
      'public' => true,
      'description' => 'Case studies for portfolio.',
      'menu_icon' => 'dashicons-desktop',
      'labels' => $labels,
    ];
    register_post_type( $type, $arguments);
  });

完成所有這些後,是時候開始為自定義帖子類型的內容設置主題了。 現在,我們將使用默認的二十二十主題。 當然,您可以使用任何您喜歡的主題。

WordPress 自定義帖子類型模板

在我們對自定義帖子類型進行模板化之前,讓我們先看看 WordPress 模板層次結構。

如果您還不熟悉 WordPress 處理模板的方式,請將其視為類似於 CSS 處理特殊性的方式。 雖然陷入細節並不太重要,但這個簡單的類比將幫助您更好地理解 WordPress 模板層次結構。

在我們新的研究帖子類型的模板層次結構中,有兩個特定的模板文件需要注意。

他們是:

1. single-study.php – 當用戶導航到 http://yourcoolsite.com/studies/your-cool-study-post 以查看單個研究時,這是針對單個頁面的。

2. archive-study.php – 當用戶導航到 http://yourcoolsite.com/studies 以查看所有研究的列表時,這是存檔頁面。

默認情況下,WordPress 將使用主題的 single.php 和 archive.php 模板進行自定義帖子類型的前端設計。 但是,當自定義帖子類型存在特定模板時, single-study.php 和 archive-study.php 將覆蓋 WordPress 中的默認值。

單頁

由於我們在本指南中使用默認的 WordPress 二十二十主題,因此我們首先需要創建 single-study.php 的文件名並使用它。

在單個帖子類型模板文件中,添加此 WordPress 循環:

<?php
	/**
	 * The template for displaying single posts and pages.
	 *
	 * @link https://developer.wordpress.org/themes/basics/template-hierarchy/
	 *
	 * @package WordPress
	 * @subpackage Twenty_Twenty
	 * @since 1.0.0
	 */
	
	get_header();
	?>
	
	<main id="site-content" role="main">
	
	        <?php
	
	        if ( have_posts() ) {
	
	                while ( have_posts() ) {
	                        the_post();
	
	                }
	        }
	
	        ?>
	
	</main><!-- #site-content -->
	
	<?php get_template_part( 'template-parts/footer-menus-widgets' ); ?>
	
	<?php get_footer(); ?>

存檔頁面

帖子類型的存檔頁面使用與單個頁面相同的完全過程。 唯一的區別是您將使用archive-study.php 模板而不是single-study.php。

對於您的存檔頁面,您會希望它鏈接到每項研究,並且只顯示“研究”的標題。

當然,您可以隨意使用以下代碼獲得樂趣:

<?php
  /*
  Template Name: Archive-Study
  */
  get_header(); ?>

  <div id="container">
  	<div id="content" role="main">

  		<?php the_post(); ?>
  		<h1 class="entry-title"><?php the_title(); ?></h1>
  		
  		<?php get_search_form(); ?>
  		
  		<h2>Archives by Month:</h2>
  		<ul>
  			<?php wp_get_archives('type=monthly'); ?>
  		</ul>
  		
  		<h2>Archives by Subject:</h2>
  		<ul>
  			 <?php wp_list_categories(); ?>
  		</ul>

  	</div><!-- #content -->
  </div><!-- #container -->


  <?php get_footer(); ?>

現在您的存檔頁面已經完美到位,看起來您已經完成了。 但是如果你有一百個或更多的案例研究會發生什麼?

如何修改存檔頁面查詢

存檔頁面只會列出管理員在“設置”>“閱讀”中指定的項目數。 通常,您不希望對自定義帖子類型應用與主要博客或文章提要相同的限制。

當您想刪除存檔頁面上的限制時,只需使用鉤子 pre_get_posts 修改主查詢。

在您連接到 pre_get_posts 之後,您將能夠訪問和修改主要的 WP_Query 對象。

為了在您的檔案頁面上列出所有研究,您需要:

  1. 使用鉤子 pre_get_posts。
  2. 檢測方法 is_main_query 是否正在運行主查詢。
  3. 使用 is_post_type_archive 檢測您是否在研究存檔頁面上。
  4. 在主 WP_Query 中,將 posts_per_page 設置為 -1。 這將刪除所有數量限制並列出所有內容。
<?php
  add_action('pre_get_posts', function( WP_Query $query ) {
    if($query->is_main_query() && $query->is_post_type_archive('study')) {
      $query->set('posts_per_page', -1);
    }
  });

通過使用鉤子 pre_get_posts,您可以直接訪問 WordPress 已經在運行的 SQL 查詢。 該查詢使您無需編寫任何 SQL 即可訪問帖子、頁面和自定義帖子類型。

這總是一個獎勵。

為 WordPress 自定義帖子類型使用插件

如果您不是深入研究代碼的類型,而是希望使用插件創建和修改自定義帖子類型,自定義帖子類型 UI 提供了一個易於使用的界面,用於註冊和管理自定義帖子類型(和分類法)。

該插件受到高度評價,並配置為與 WordPress 5.5 及更高版本一起使用。

它已經被測試到 5.6。

使用生成器生成 WordPress 自定義帖子類型

想要一種非常簡單的方法來獲取自定義帖子類型(或分類法)的代碼? 查看 GenerateWP。 您可以使用 GenerateWP 創建範圍廣泛的自定義代碼。 這也很簡單。 只需填寫正確的表格並獲取要復制/粘貼的代碼。

您甚至可以在幾年前觀看以 GenerateWP 為特色的關於自定義帖子類型的培訓網絡研討會。 好消息是自定義帖子類型已經存在很長時間了,培訓仍然是相關的。

WordPress 帖子類型是您最好的新朋友

無論您是手動使用 WordPress 帖子類型還是使用插件,讓您的站點配備可用的最佳 WordPress 備份插件都非常重要。

編輯代碼總是有可能導致衝突,這可能會使您的網站朝著您不希望的方向發展。

在這些情況下,BackupBuddy 和 iThemes Security,一個強大的 WordPress 安全插件,將幫助您安全地恢復工作。