読んで理解するWP_Query【WordPress】

公開日:

最終更新日:

読んで理解するWP_Query【WordPress】

「WordPressなら簡単にブログが作れます!」みたいな触れ込みをよく見かけますが、正直なところ「WEB制作初心者には敷居が高すぎるのでは・・・。」と感じます。

有料・無料含めてかなり融通が利くテンプレートも多くありますが、「もっとこうしたい」「思い通りに配置したい」となってくると、やっぱりある程度のPHPの知識も必要になってきます。

今回のテーマはWordPressのカスタマイズもしくはオリジナルテーマ作成で必ず理解が必要になるWP_Queryについて書きます。

とにかくvar_dump()してみる

PHPでわからない変数や関数があればまずvar_dump()をしてみましょう。
変数であれば「変数に保存されている値(クラスオブジェクトなど)」関数であれば「戻り値(関数終わりがreturnされている場合)」もしくは「出力される文字列(関数にechoが含まれている場合)」が結果として表示されます。

今回だと$wp_queryには「WP_Queryオブジェクト」が保存されています。
例としてこの投稿の$wp_queryをdumpしてみます。(一部改変などしているので参考程度です。)

<?php
var_dump($wp_query);
// ↓dump結果
object(WP_Query)#1196 (52) {
  ["query"]=>
  array(2) {
    ["p"]=>
    string(2) "80"
    ["preview"]=>
    string(4) "true"
  }
  ["query_vars"]=>
  array(64) {
    ["p"]=>
    
    ["preview"]=>
    string(4) "true"
    ["error"]=>
    string(0) ""
    ["m"]=>
    string(0) ""
    ["post_parent"]=>
    string(0) ""
    ["subpost"]=>
    string(0) ""
    ["subpost_id"]=>
    string(0) ""
    ["attachment"]=>
    string(0) ""
    ["attachment_id"]=>
    int(0)
    ["name"]=>
    string(0) ""
    ["static"]=>
    string(0) ""
    ["pagename"]=>
    string(0) ""
    ["page_id"]=>
    int(0)
    ["second"]=>
    string(0) ""
    ["minute"]=>
    string(0) ""
    ["hour"]=>
    string(0) ""
    ["day"]=>
    int(0)
    ["monthnum"]=>
    int(0)
    ["year"]=>
    int(0)
    ["w"]=>
    int(0)
    ["category_name"]=>
    string(0) ""
    ["tag"]=>
    string(0) ""
    ["cat"]=>
    string(0) ""
    ["tag_id"]=>
    string(0) ""
    ["author"]=>
    string(0) ""
    ["author_name"]=>
    string(0) ""
    ["feed"]=>
    string(0) ""
    ["tb"]=>
    string(0) ""
    ["paged"]=>
    int(0)
    ["meta_key"]=>
    string(0) ""
    ["meta_value"]=>
    string(0) ""
    ["s"]=>
    string(0) ""
    ["sentence"]=>
    string(0) ""
    ["title"]=>
    string(0) ""
    ["fields"]=>
    string(0) ""
    ["menu_order"]=>
    string(0) ""
    ["embed"]=>
    string(0) ""
    ["category__in"]=>
    array(0) {
    }
    ["category__not_in"]=>
    array(0) {
    }
    ["category__and"]=>
    array(0) {
    }
    ["post__in"]=>
    array(0) {
    }
    ["post__not_in"]=>
    array(0) {
    }
    ["post_name__in"]=>
    array(0) {
    }
    ["tag__in"]=>
    array(0) {
    }
    ["tag__not_in"]=>
    array(0) {
    }
    ["tag__and"]=>
    array(0) {
    }
    ["tag_slug__in"]=>
    array(0) {
    }
    ["tag_slug__and"]=>
    array(0) {
    }
    ["post_parent__in"]=>
    array(0) {
    }
    ["post_parent__not_in"]=>
    array(0) {
    }
    ["author__in"]=>
    array(0) {
    }
    ["author__not_in"]=>
    array(0) {
    }
    ["ignore_sticky_posts"]=>
    bool(false)
    ["suppress_filters"]=>
    bool(false)
    ["cache_results"]=>
    bool(true)
    ["update_post_term_cache"]=>
    bool(true)
    ["lazy_load_term_meta"]=>
    bool(true)
    ["update_post_meta_cache"]=>
    bool(true)
    ["post_type"]=>
    string(0) ""
    ["posts_per_page"]=>
    int(12)
    ["nopaging"]=>
    bool(false)
    ["comments_per_page"]=>
    string(2) "50"
    ["no_found_rows"]=>
    bool(false)
    ["order"]=>
    string(4) "DESC"
  }
  ["tax_query"]=>
  NULL
  ["meta_query"]=>
  object(WP_Meta_Query)#5221 (9) {
    ["queries"]=>
    array(0) {
    }
    ["relation"]=>
    NULL
    ["meta_table"]=>
    NULL
    ["meta_id_column"]=>
    NULL
    ["primary_table"]=>
    NULL
    ["primary_id_column"]=>
    NULL
    ["table_aliases":protected]=>
    array(0) {
    }
    ["clauses":protected]=>
    array(0) {
    }
    ["has_or_relation":protected]=>
    bool(false)
  }
  ["date_query"]=>
  bool(false)
  ["queried_object"]=>
  object(WP_Post)#5220 (24) {
    ["ID"]=>
    
    ["post_author"]=>
    
    ["post_date"]=>
    
    ["post_date_gmt"]=>
    
    ["post_content"]=>
    string(

このような感じでオブジェクトの内容が展開されます。
投稿ページに対するほぼ全ての情報が含まれているので、WP_Queryの情報さえ読み解くことができればWordPressの独特な関数群も理解しやすいです。(オブジェクトに含まれているプロパティと同名の関数が多いので。)

WP_Queryでよく参照するプロパティはquery_varsqueried_objectあたりでしょうか。
わざわざ$wp_query->query_varsなどしなくても実際にはget_query_var()やget_queried_object()といった便利な関数があるので、あまり使用機会はないかもしれませんが知っておいて損はないと思います。

投稿ページの情報だけでなくアーカイブページの情報も取得可能

もちろん投稿ページや固定ページなどの1ページのみの情報取得だけでなく、アーカイブページでdumpした場合はそのアーカイブページに所属している投稿情報を取得することもできます。

よくハマる例といえば「WordPressのテンプレート構造通りに作成しているのに該当のページが表示されない・・・。」といった記事をよく見かけます。

その場合はWP_Queryをdumpしてみてページ内検索を使って「is_」と検索してみましょう。

is_〇〇の値を確認してtrueになっていれば該当条件に当てはまるアーカイブといった感じになります。
falseになっていれば意図しないパラメータが含まれていたり、固定ページや投稿ページとスラッグが被っている可能性もあるので、もう一度注意深く全体を見直しましょう。

まとめ

実際にWordPressを使いこなすまではいかなくとも、ちょっとしたカスタマイズや小難しいことをやろうとするとWP_Queryの理解は必然的に必須になってくると思います。

「プラグインを使えば簡単にできる内容だから」といってもプラグインは増やせば増やすほどコンフリクトが起きたり
メンテナンスがされなくなればそのうち違うプラグインを探さなくてはいけなくなるといった管理の手間もかかります。

少し勉強するだけで解決できる内容であれば、だいたいGoogleが教えてくれる時代なので、チャチャっとパクって有効活用して知識を広げていきましょう。

かくいう私もまだまだコピペ記述が多かったりしますが・・・。

関連記事

componentを活用して再利用可能なviewを作成する【Laravel】

componentを活用して再利用可能なviewを作成する【Laravel】

公開日時:2019年8月19日

更新日時:2019年8月19日

Laravelの共通処理はtraitにまとめると便利【Laravel】

Laravelの共通処理はtraitにまとめると便利【Laravel】

公開日時:2019年8月07日

更新日時:2019年8月08日

Laravelのドキュメントルートからpublicを消す【Laravel】

Laravelのドキュメントルートからpublicを消す【Laravel】

公開日時:2019年7月16日

更新日時:2019年8月08日

Eloquentでデータベースから値を取得する【Laravel】

Eloquentでデータベースから値を取得する【Laravel】

公開日時:2019年7月01日

更新日時:2019年7月12日