前言
在 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();
}
?>