首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

WordPress 文章查詢參數完整指南:作者、分類、標籤、日期、自訂欄位與進階組合

     編輯:PHP 綜合知識

前言

WP_Query 支援極豐富的查詢參數,涵蓋作者、分類、標籤、日期、自訂欄位、權限、搜尋、排序等。本文系統整理最常用的參數群組、語法格式、組合邏輯與實戰範例,作為開發時的速查手冊。

作者參數

參數型別說明
authorint|string單一或多個作者 ID (逗號分隔),負號排除
author_namestring使用者別名 (user_nicename)
author__inarray作者 ID 陣列 (包含)
author__not_inarray作者 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]]);

分類參數

參數型別說明
catint|string分類 ID (含子分類),負號排除,逗號分隔多個
category_namestring分類別名 (slug),逗號=OR,加號=AND
category__andarray分類 ID 陣列 (必須同時屬於,不含子分類)
category__inarray分類 ID 陣列 (屬於任一,不含子分類)
category__not_inarray分類 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]]);

標籤參數

參數型別說明
tagstring標籤別名,逗號=OR,加號=AND
tag_idint標籤 ID
tag__andarray標籤 ID 陣列 (AND)
tag__inarray標籤 ID 陣列 (OR)
tag__not_inarray標籤 ID 陣列 (排除)
tag_slug__andarray標籤別名陣列 (AND)
tag_slug__inarray標籤別名陣列 (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 / dayint年/月/日
date_queryarray複雜日期範圍 (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_valuestring單一欄位查詢
meta_queryarray複雜多欄位查詢 (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'],
    ],
]);

搜尋、排序、分頁、權限參數

參數型別說明
sstring搜尋關鍵字
orderbystring|arraydate, title, rand, meta_value, meta_value_num, comment_count 等
orderstringASC / DESC
posts_per_pageint每頁數量,-1 表全部
paged / pageint當前頁碼
offsetint跳過前 N 篇 (會破壞分頁)
post_statusstring|arraypublish, draft, pending, private, future, any
permstring'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),即能建立高效、精準的文章查詢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved