側邊欄最新文章依分類篩選與排除
整理日期:2026-03-27
在維護多個企業品牌網站時,業主提出以下需求:
- 文章單頁:側邊欄的「最新文章」小工具,只顯示與當前文章相同分類的文章,而不是全站最新文章,並且要排除目前正在閱讀的這篇文章。
- 分類彙整頁:在分類頁面時,側邊欄的最新文章也應該只篩選該分類下的文章。
- 避免衝突:若網站裝有 WooCommerce,篩選邏輯不可影響到商品單頁的相關版面。
先拆成幾層看
Section titled “先拆成幾層看”- 側邊欄的最新文章是用 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;} );不建議先做的事
Section titled “不建議先做的事”- 不要為了這個簡單的過濾需求去安裝複雜的側邊欄管理外掛(如 Widget Logic 等),這會增加資料庫查詢與外掛維護負擔。
- 不要直接去修改 WordPress 核心檔案,因為下次系統更新時修改會全部被覆蓋。
下次遇到可以先整理什麼
Section titled “下次遇到可以先整理什麼”- 發生需求的文章類型與分類架構(是否有複數分類、大分類與小分類的階層關係)。
- 確認側邊欄使用的是 WordPress 內建小工具,還是佈景主題(例如 Astra, GeneratePress)自訂的動態區塊。
- 檢查網站是否含有其他 Custom Post Types,確保程式碼條件篩選的安全性。
側邊欄widget_posts_argsWordPressPHP篩選