WP_Query 的初步認識

WP_Query 是在 WordPress 中是極度重要的一個類別( class ),其完整的程式碼是存在於 wp-includes/query.php 這一個檔案之中。
相信來這裡的人對於 php 或是 WordPress 都有一些程度上的熟悉,不然其實接下來的東西應該會不容易理解吧!

WP_Query 在 WP 中的工作,就是幫你把文章從資料庫中搜尋出來。所以大約在部落格中 70% 以上的作業都與其有關係。

關於 WP_Query 最正確的解釋當然是其位於 WP codex 中的說明,前往觀看。老樣子,全篇文章為英文。

那 WP_Query 有多強大呢?

可以依照作者、分類、標籤、自訂分類標籤、文章(頁面)、時間、meta等條件下去檢索想要的文章出來,
再依照文章的某一項資料進行排序,
最後回傳指定數量的文章給使用者進行處理。

這樣說感覺上好像有一點複雜,不過說的講簡單一點,就是使用 WP_Query 之後就可以不用自己辛苦的下 SQL 語法來搜尋文章!註1

就隨便寫幾個例子來看看,至於仔細的說明有時間我在寫!

隨機推薦給我 10篇文章。

$query_data = array(
	'post_type' => 'post',
	'post_status' => 'publish',
	'posts_per_page' => 10,
	'orderby' => 'rand'
);
$post_list = new WP_Query($query_data);

使用者A 發佈於 分類B 中的文章,全部給我顯示出來。
PS. 這裡的 A 跟 B 指的是 ID。

$query_data = array(
	'post_type' => 'post',
	'post_status' => 'publish',
	'author' => A,
	'cat' => B
	'posts_per_page' => -1,
);
$post_list = new WP_Query($query_data);

不過關於一個時間區間的文章,目前是沒辦法以單純調用 WP_Query 的方式達成,還需要配合 filter 下一小段 SQL 語法。這才是高級一點的應用方式。
給我最近一個月內修正的文章,數量20篇就好,以修正日來排序

function filter_where($where = '') {
	$where .= " AND post_modified > '" . date('Y-m-d', strtotime('-30 days')) . "'";
	return $where;
}
$query_data = array(
    'post_type' => 'post',
    'post_status' => 'publish',
    'posts_per_page' => 20,
	'orderby' => 'modified'
);
add_filter('posts_where', 'filter_where');
$query = new WP_Query($query_data);
remove_filter('posts_where', 'filter_where');

註1:大約99%的情況,因為我有一個外掛暫時想不到改用 WP_Query 來抓取文章的方法,主要是牽扯到 postmeta 的問題。