WordPress 自定義文章類型相關文章顯示實作筆記

前言

在 WordPress 開發中,常見需求是於自定義文章類型(Custom Post Type,CPT)頁面中顯示與該文章相關的一般文章。本文以名為 member_info 的 CPT 為例,示範如何利用 WP_Query 依據當前 CPT 文章標題搜尋並顯示相關文章。

程式碼實現

我們透過 WP_Query 搜尋標題或內容包含當前 member_info 文章標題的文章,並限制顯示數量。以下為範例程式碼,適合放入 single-member_info.php 或對應模板:

if (is_singular('member_info')) {
  $current_title = get_the_title(); // 取得當前 member_info 文章標題

  $args = array(
    'post_type' => 'post', // 僅搜尋一般文章
    'posts_per_page' => 5, // 限制顯示數量
    's' => $current_title, // 以標題作為搜尋關鍵字
  );

  $query = new WP_Query($args);

  if ($query->have_posts()) {
    echo '
<h3>相關文章</h3>';
    echo '
<ul>';
    while ($query->have_posts()) {
      $query->the_post();
      echo '
<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
    }
    echo '</ul>';
  } else {
    echo '
<h3>相關文章</h3>';
    echo '
<p>沒有找到相關文章</p>';
  }

  wp_reset_postdata();
}

程式碼解析

1. 檢查文章類型

if (is_singular('member_info')) {

確保程式碼只在 member_info 單篇文章頁執行,避免影響其他頁面。

2. 取得當前文章標題

$current_title = get_the_title();

利用 WordPress 內建函式取得目前 CPT 文章標題,作為搜尋關鍵字。

3. 設定查詢參數

$args = array(
  'post_type' => 'post',
  'posts_per_page' => 5,
  's' => $current_title,
);
  • post_type 限定搜尋一般文章。
  • posts_per_page 限制最多顯示 5 篇。
  • s 參數用於全文搜尋,搜尋包含標題的文章。

4. 輸出查詢結果

if ($query->have_posts()) {
  echo '
<h3>相關文章</h3>';
  echo '
<ul>';
  while ($query->have_posts()) {
    $query->the_post();
    echo '
<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
  }
  echo '</ul>';
} else {
  echo '
<h3>相關文章</h3>';
  echo '
<p>沒有找到相關文章</p>';
}

判斷是否有符合條件的文章,並以列表形式輸出標題與連結。

5. 重置查詢狀態

wp_reset_postdata();

避免自訂查詢影響後續 WordPress 迴圈或內容顯示。

實際應用與延伸

  • 可用於產品頁面顯示與產品名稱相關的部落格文章。
  • 課程頁面展示與課程名稱相關的學習資源。
  • 可進一步結合自訂欄位或關聯插件,提升相關文章精準度。

常見坑

  • s 參數為全文搜尋,可能導致結果不夠精確。
  • 查詢結果過多時,建議加入分頁或限制數量。
  • 請確保模板檔案命名與 CPT 名稱一致,避免無法正確載入。

完整程式碼

<?php
if (is_singular('member_info')) {
  $current_title = get_the_title(); // 取得當前 member_info 文章的標題

  // 查詢與當前 member_info 相關的 post 文章
  $args = array(
    'post_type' => 'post', // 只搜尋一般文章
    'posts_per_page' => 5, // 限制顯示數量
    's' => $current_title, // 內文搜尋關鍵字
  );

  $query = new WP_Query($args);

  if ($query->have_posts()) {
    echo '
<h3>相關文章</h3>';
    echo '
<ul>';
    while ($query->have_posts()) {
      $query->the_post();
      echo '
<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
    }
    echo '</ul>';
  } else {
    echo '
<h3>相關文章</h3>';
    echo '
<p>沒有找到相關文章</p>';
  }

  wp_reset_postdata();
}
?>