前言
WP_Query 支援極豐富的查詢參數,涵蓋作者、分類、標籤、日期、自訂欄位、權限、搜尋、排序等。本文系統整理最常用的參數群組、語法格式、組合邏輯與實戰範例,作為開發時的速查手冊。
作者參數
| 參數 | 型別 | 說明 |
| author | int|string | 單一或多個作者 ID (逗號分隔),負號排除 |
| author_name | string | 使用者別名 (user_nicename) |
| author__in | array | 作者 ID 陣列 (包含) |
| author__not_in | array | 作者 ID 陣列 (排除) |
範例
// 單一作者
new WP_Query('author=123');
new WP_Query('author_name=john');
// 多作者
new WP_Query('author=2,6,17'); // ID
new WP_Query(['author__in' => [2, 6]]); // 陣列
// 排除作者
new WP_Query('author=-12');
new WP_Query(['author__not_in' => [2, 6]]);
分類參數
| 參數 | 型別 | 說明 |
| cat | int|string | 分類 ID (含子分類),負號排除,逗號分隔多個 |
| category_name | string | 分類別名 (slug),逗號=OR,加號=AND |
| category__and | array | 分類 ID 陣列 (必須同時屬於,不含子分類) |
| category__in | array | 分類 ID 陣列 (屬於任一,不含子分類) |
| category__not_in | array | 分類 ID 陣列 (排除) |
範例
// 單一分類 (含子分類)
new WP_Query('cat=4');
new WP_Query('category_name=news');
// 多個分類 OR
new WP_Query('cat=2,6,17');
new WP_Query('category_name=staff,news');
// 多個分類 AND (必須同時屬於)
new WP_Query('category_name=staff+news');
new WP_Query(['category__and' => [2, 6]]);
// 排除分類
new WP_Query('cat=-12,-34');
new WP_Query(['category__not_in' => [2, 6]]);
標籤參數
| 參數 | 型別 | 說明 |
| tag | string | 標籤別名,逗號=OR,加號=AND |
| tag_id | int | 標籤 ID |
| tag__and | array | 標籤 ID 陣列 (AND) |
| tag__in | array | 標籤 ID 陣列 (OR) |
| tag__not_in | array | 標籤 ID 陣列 (排除) |
| tag_slug__and | array | 標籤別名陣列 (AND) |
| tag_slug__in | array | 標籤別名陣列 (OR) |
範例
new WP_Query('tag=wordpress,plugin'); // OR
new WP_Query('tag=wordpress+plugin'); // AND
new WP_Query(['tag__in' => [12, 34]]); // OR
new WP_Query(['tag__and' => [12, 34]]); // AND
new WP_Query(['tag_slug__in' => ['php', 'js']]);
日期參數
| 參數 | 型別 | 說明 |
| year / monthnum / day | int | 年/月/日 |
| date_query | array | 複雜日期範圍 (3.7+) |
date_query 範例
// 最近一週
new WP_Query([
'date_query' => [
['after' => '1 week ago'],
],
]);
// 2024 年 1 月至 3 月
new WP_Query([
'date_query' => [
['after' => '2024-01-01', 'before' => '2024-03-31', 'inclusive' => true],
],
]);
// 發布時間在上午 9 點到下午 6 點之間
new WP_Query([
'date_query' => [
['hour' => 9, 'compare' => '>='],
['hour' => 18, 'compare' => '<='],
],
]);
自訂欄位參數
| 參數 | 型別 | 說明 |
| meta_key / meta_value | string | 單一欄位查詢 |
| meta_query | array | 複雜多欄位查詢 (3.2+) |
meta_query 範例
// 價格區間
new WP_Query([
'meta_query' => [
['key' => '_price', 'value' => [100, 500], 'compare' => 'BETWEEN', 'type' => 'NUMERIC'],
],
]);
// 多條件 AND (預設 relation=AND)
new WP_Query([
'meta_query' => [
'relation' => 'AND',
['key' => '_color', 'value' => 'red'],
['key' => '_size', 'value' => ['M', 'L'], 'compare' => 'IN'],
],
]);
// 存在性查詢
new WP_Query([
'meta_query' => [
['key' => '_featured', 'compare' => 'EXISTS'],
],
]);
搜尋、排序、分頁、權限參數
| 參數 | 型別 | 說明 |
| s | string | 搜尋關鍵字 |
| orderby | string|array | date, title, rand, meta_value, meta_value_num, comment_count 等 |
| order | string | ASC / DESC |
| posts_per_page | int | 每頁數量,-1 表全部 |
| paged / page | int | 當前頁碼 |
| offset | int | 跳過前 N 篇 (會破壞分頁) |
| post_status | string|array | publish, draft, pending, private, future, any |
| perm | string | 'readable' 只查可讀私有文章 |
進階組合實戰範例
1. 首頁:置頂文章 + 一般文章,排除特定分類
$args = [
'post_type' => 'post',
'posts_per_page' => 10,
'category__not_in' => [99], // 排除分類 ID 99
'ignore_sticky_posts' => false, // 保留置頂邏輯
];
new WP_Query($args);
2. 產品列表:多重分類篩選 + 價格區間 + 排序
$args = [
'post_type' => 'product',
'tax_query' => [
'relation' => 'AND',
['taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => 'electronics'],
['taxonomy' => 'brand', 'field' => 'slug', 'terms' => ['apple', 'samsung'], 'operator' => 'IN'],
],
'meta_query' => [
['key' => '_price', 'value' => [1000, 5000], 'compare' => 'BETWEEN', 'type' => 'NUMERIC'],
],
'orderby' => 'meta_value_num',
'order' => 'ASC',
'posts_per_page' => 12,
'paged' => get_query_var('paged') ?: 1,
];
new WP_Query($args);
3. 搜尋結果:只搜尋標題、特定文章類型
add_action('pre_get_posts', function($q) {
if (!$q->is_admin() && $q->is_main_query() && $q->is_search()) {
$q->set('post_type', ['post', 'product']);
$q->set('posts_per_page', 20);
// 僅搜尋標題需自行修改 SQL (posts_search filter)
}
});
tax_query 完整語法
'tax_query' => [
'relation' => 'AND', // 或 OR
[
'taxonomy' => 'category', // 分類法名稱
'field' => 'slug', // term_id / slug / name
'terms' => 'news', // 單一值或陣列
'operator' => 'IN', // IN / NOT IN / AND / EXISTS / NOT EXISTS
'include_children' => true, // 是否包含子項 (僅階層分類法)
],
// 更多條件...
]
常見效能建議
- 避免
meta_query 大量資料查詢 (無索引),考慮建立自訂表或使用 Elasticsearch
posts_per_page => -1 會載入所有文章,極度危險,務必限制數量
- 使用
'fields' => 'ids' 僅取得 ID 陣列,大幅減少記憶體
'no_found_rows' => true 禁用 SQL_CALC_FOUND_ROWS,不需分頁時加速查詢
- 善用
transient 快取查詢結果
小結
WP_Query 參數體系龐大但邏輯一致:分類法用 tax_query、自訂欄位用 meta_query、日期用 date_query、作者/標籤有專屬參數。掌握關係邏輯 (AND/OR/NOT IN/EXISTS) 與型別指定 (NUMERIC/DATE),配合效能優化參數 (fields, no_found_rows, transient),即能建立高效、精準的文章查詢。