WordPressのquery.phpを読む(1)

これから何回かに分けて、wp-includs/query.phpを読んで勉強していきます。

やろうと思った理由

WordPressが好きで色々勉強しているのはありますが、技術力の限界が見えてきました。

やりたいことがあると、ググってコードを持ってきて、読んでカスタマイズする、というやり方で今まで色々なことを実現してきました。その過程で、色々なことを知って、理解度も深まって、やりたいことを実現するための方法が、ピンと来ることも増えました。

phpについても、少しずつできることが増えて嬉しく思っています。念願だったphpのクラスについても、classのクラスを経て、読んだり書いたりできるようになりました。殊に、WordPressのコアのソースを見て、いきなりゲッ、っとならずに取り組めるようになりました。

このあたりで、コピペコーディングといいますか、まあそういうやり方だけでなく、もう少し詳しく知って、できることの幅を広げてみようかな、と思っています。

上記のツイートは昨年の9月のもので、以来ずっと気になっており、また最近、query_postsとget_postsの違い[追記あり]という記事も話題になりまして、これはwp-includes/query.phpと関連の深いものです。

WordPressでの構築の際には、できるだけテンプレート階層の力を借りて、あんまりコードを書かなくても欲しいコンテンツが取得できるように気をつけているのですが、「とにかくそうなる」ということしか分かっていないので、ちゃんと理解したいというのもあります。

というわけで、少しずつ始めます。

コメント

WordPressのコアファイルには、先頭にそのファイルの役割などを説明するコメントがあります。

<?php
/**
 * WordPress Query API
 *
 * The query API attempts to get which part of WordPress to the user is on. It
 * also provides functionality to getting URL query information.
 *
 * @link http://codex.wordpress.org/The_Loop More information on The Loop.
 *
 * @package WordPress
 * @subpackage Query
 */

翻訳
WordPress クエリ API

クエリAPIは、ユーザーがWordPressのどの部分を利用しているのかという情報を取得します。また、URLクエリ情報を取得する機能も提供します。

@link http://codex.wordpress.org/The_Loop ループについての情報の続きはこちら

@package WordPress
@subpackage Query

ループとも関わりが深いのですね。

定義されている関数とクラスのリスト

このファイル内では、以下が定義されています。

  • WP_Queryクラス
  • WP_Queryクラスのインスタンスである$wp_queryを利用する関数

関数には一部、$wp_queryを利用しないものもありますが、いずれも以下のようにWP_Queryクラスと関連しています。

  • query_posts():WP_Queryを別個にnewしている
  • wp_reset_query():$wp_query$wp_the_queryというバックアップ用のWP_Queryのインスタンスを代入する
  • setup_postdata():$wp_queryを利用するget_query_var()関数が含まれる

$wp_queryオブジェクトの生成

$wp_queryは、query.phpで定義されているクラスWP_Queryのインスタンス。

newされているのは、WordPressのルートにあるwp-settings.phpの中です。wp-settings.phpファイルは、WordPressのルートのindex.php → wp-blog-header.php → wp-config.php → wp-settings.phpという順番で読み込まれる、WordPressの動作のかなり始めの方で必ず読み込まれるファイルです。
(参考:WordPressの実行フローを視覚化してみる

/**
 * WordPress Query object
 * @global object $wp_the_query
 * @since 2.0.0
 */
$wp_the_query = new WP_Query();

/**
 * Holds the reference to @see $wp_the_query
 * Use this global for WordPress queries
 * @global object $wp_query
 * @since 1.5.0
 */
$wp_query =& $wp_the_query;

ここで、$wp_the_query$wp_queryがありますが、同じものを指していて、テーマやプラグインの中で$wp_queryを呼び出して操作した時のためのバックアップ用です。
(参考: WordPress ループ&クエリーのモヤモヤを解消しよう!

コデックス”関数リファレンス/WP Query”ページの冒頭

WP_Query は wp-includes/query.php に定義されているクラスで、WordPress ブログへの複雑なリクエストを取り扱います。 wp-blog-header.php (バージョン 2.0 では WP クラス) が $wp_query オブジェクトに現在のリクエストを定義する情報を与えることで、$wp_query はどのタイプのクエリを扱っているのか (カテゴリーアーカイブ、年月別アーカイブ、フィード、検索など) を確定し、要求された投稿を取り出します。$wp_query はリクエスト上の情報を多く保持していて、後からでも利用することができます。

ということです。今回はここまでで、次回は上記の「wp-blog-header.php が $wp_query オブジェクトに現在のリクエストを定義する情報を与えることで、$wp_query はどのタイプのクエリを扱っているのかを確定し、要求された投稿を取り出します。」の処理を追いかけようと思います。

「WordPressのquery.phpを読む」シリーズ

  1. 今回。はじめに的な位置づけと定義ファイル概要
  2. wp-blog-header.phpおよび、wp()関数、WPクラス、$postsの生成過程

続く

↓ プラグインを作る方々への本、書きました。 ↓

“WordPressのquery.phpを読む(1)” への 1 件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です