WP_Queryを利用した投稿の取得
WP_Queryを利用した投稿の取得は、DBからの情報取得の方法の中でももっとも基本となるものです。まずはWP_Queryの基本について見ていきましょう。
<?php
// html開始前
$args = array('post_type' => 'post');
$query = new WP_Query($args);
?>
<!-- body内 -->
<pre>
<?php
// SQLを構築するための設定項目を表示
var_dump($query->query_vars);
// 実行されたSQLを表示
var_dump($query->request);
// SQLの結果を表示
var_dump($query->posts);
?>
</pre>
まずはこの3つの内容について確認していきましょう。 基本的に、WP_Queryは
- クエリ条件(query_vars)の設定
- クエリ(request)の作成
- クエリ結果(posts)の取得
という流れで動作します。 最初の例のように、クエリ条件を示す引数を作成して WP_Queryのコンストラクタに渡すことによって、 自動的に上記の3つの処理が行われ、 取得されたクエリ結果(posts)が利用できる状態になります。
1. クエリ条件(query_vars)の設定
WP_Queryにどのような引数を渡すかによって、WP_Queryで実行されるSQL(request)が変化します。
配列によるクエリ条件の設定
クエリの条件を配列にまとめ、WP_Queryのコンストラクタに引き渡すことによって取得したい投稿を指定することができます。
// 著者が1である投稿の一覧を取得
$query = new WP_Query(
array(
'post_type' => 'post',
'author' => 1
)
);
引き渡す配列により柔軟なクエリの作成が可能です。 例えばカテゴリを指定して投稿を取得したい場合は
// カテゴリが未分類である投稿の一覧を取得
$query = new WP_Query(
array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array( '未分類' ),
),
),
)
);
このようにtax_query(taxonomy query の略)という設定値を用います。 その他様々な条件指定の方法がありますので、
こちらを参考に色々と試して見ましょう。
文字列によるクエリ条件の設定
クエリ条件は文字列を利用して設定することも可能です。
// 文字列による設定(urlのクエリ文字列からの設定)
// 投稿者のidを指定
$query = new WP_Query( 'author=1' );
// カテゴリを指定
$query = new WP_Query( 'category_name=未分類' );
// タグを指定
$query = new WP_Query( 'tag=cooking' );
配列よりも直感的な書き方が可能です。
また、重要なポイントとして、urlからクエリ条件を設定する際にはこの方法が用いられることも知っておくと良いでしょう。(詳しい内容は後述します。)
複数条件の組み合わせ
より複雑な取得も可能です。
$query = new WP_Query(
array(
'post_type' => 'post', //投稿タイプの指定
'meta_query' => array( // メタ情報の指定
array(
'key' => '_edit_last',
)
),
'tax_query' => array( // タクソノミー情報の指定
array(
'taxonomy' => 'category',
'field' => 'id',
'terms' => 1,
)
),
'date_query' => array( //日付情報の指定
array(
'after' => '2014/01/01',
'inclusive' => true,
)
),
)
);
2. クエリ(request)の作成
1で設定したクエリ条件からどのようなクエリが作成されるのかを確認して見ましょう。
<?php
$query = new WP_Query( 'author=1' );
?>
<pre><?php var_dump($query->request); ?></pre>
上記を実行すると、生成されるクエリ($query->request)は以下のようなものになります。
SELECT
SQL_CALC_FOUND_ROWS # あとで行数を取得できるようにするための指定
wp_posts.ID
FROM wp_posts
WHERE
1=1 # クエリ結合の都合上必ずtrueになる条件が設定される
AND wp_posts.post_author IN (1) # 著者が1
AND wp_posts.post_type = 'post' # 投稿を取得
AND (
wp_posts.post_status = 'publish' # ステータスが公開
OR wp_posts.post_status = 'private' # ステータスが非公開(ログイン時)
)
ORDER BY wp_posts.post_date DESC # 日付の降順
LIMIT 0, 10 # 最初の10件を取得
ポイントとして、
- クエリ条件(著者が1)が反映されている
- 取得しているのはIDのみ
という2点を押さえておくと良いでしょう。
IDのみ取得している理由
WP_Queryから発行されるSQLでは投稿のIDのみが取得されています。では、どのようにして投稿の一覧を取得しているのかを確認して見ましょう。
$wpdb->queries を利用して実行されたSQLの一覧を表示させます。
<?php
$query = new WP_Query( 'author=1' );
?>
<pre><?php var_dump($wpdb->queries); ?></pre>
表示される結果の中から
SELECT wp_posts.* FROM wp_posts WHERE ID IN (投稿IDの一覧)"
となっている部分を確認して見ましょう。 このように、WP_Queryで取得したIDの一覧を元に、投稿の一覧を取得していることが確認できます。
- 条件に当てはまるIDの一覧を取得
- IDの一覧に含まれる投稿を取得
という2段構えで動作していることを確認しておくと良いでしょう。