跳到內容

側邊欄最新文章依分類篩選與排除

整理日期:2026-03-27

在維護多個企業品牌網站時,業主提出以下需求:

  1. 文章單頁:側邊欄的「最新文章」小工具,只顯示與當前文章相同分類的文章,而不是全站最新文章,並且要排除目前正在閱讀的這篇文章。
  2. 分類彙整頁:在分類頁面時,側邊欄的最新文章也應該只篩選該分類下的文章。
  3. 避免衝突:若網站裝有 WooCommerce,篩選邏輯不可影響到商品單頁的相關版面。

  • 側邊欄的最新文章是用 WordPress 內建的「最新文章(Recent Posts)」小工具,還是第三方區塊/外掛渲染的。
  • 能否用最輕量、不新增外掛的 PHP Filter 方式,直接攔截並修改小工具的查詢參數(Query Args)。
  • 網站是否有使用其他自訂文章類型(Custom Post Type),例如 WooCommerce 商品(product),需確保判斷式足夠精準。

WordPress 內建的 WP_Widget_Recent_Posts 類別在執行 WP_Query 之前,會套用 widget_posts_args 篩選器。我們可以透過此 Hook 攔截參數。

在實作判斷時:

  • 若只用 is_single(),會同時匹配到 post 文章以及 WooCommerce 的 product 商品頁。
  • 改用 is_singular('post') 可以精準定位為「一般部落格文章單頁」,避免對商品頁造成非預期的查詢干擾。

在子佈景主題的 functions.php(或透過 Code Snippets 外掛)加入以下 PHP 程式碼:

/**
* 側邊欄「最新文章」小工具 — 文章頁顯示同分類,分類頁只顯示該分類
*/
add_filter( 'widget_posts_args', function( $args ) {
// 精準判斷是否為一般文章單頁,避免干擾商品或其他 Post Type 頁面
if ( is_singular( 'post' ) ) {
$cats = wp_get_post_categories( get_the_ID() );
if ( ! empty( $cats ) ) {
$args['category__in'] = $cats;
$args['post__not_in'] = array( get_the_ID() ); // 排除當前正在閱讀的文章
}
}
// 若在分類彙整頁,則自動篩選目前分類
elseif ( is_category() ) {
$args['cat'] = get_queried_object_id();
}
return $args;
} );

  • 不要為了這個簡單的過濾需求去安裝複雜的側邊欄管理外掛(如 Widget Logic 等),這會增加資料庫查詢與外掛維護負擔。
  • 不要直接去修改 WordPress 核心檔案,因為下次系統更新時修改會全部被覆蓋。

  • 發生需求的文章類型與分類架構(是否有複數分類、大分類與小分類的階層關係)。
  • 確認側邊欄使用的是 WordPress 內建小工具,還是佈景主題(例如 Astra, GeneratePress)自訂的動態區塊。
  • 檢查網站是否含有其他 Custom Post Types,確保程式碼條件篩選的安全性。

  • 側邊欄
  • widget_posts_args
  • WordPress
  • PHP
  • 篩選