「webで何か」作るブログ

35歳という遅すぎるスタートをなんとかする為のブログです。基本的に自分にとっての役立ちメモ。

WordPressの仕組みをもう少し掘り下げてみる

github.ioへ移転しました。

WordPressを学ぶにあたって、一番わかりにくいのはその全体像ではないかな、と思うようになりました。

この半年程度でいくつかWordPressテーマを作成したのですが、正直最初のうちはよくわからないまま参考書に従って作っていっただけで、single.phpってコード自体はpage.phpと全く一緒なんだけどなんで表示されるものが違うの?とか、テンプレート階層って何?!とか、そんな疑問がずっと頭にあったんです。

(書いてはあったけど理解できなかったのが大半。)

どんな書籍やブログ記事等でもテンプレート階層やWordPressの仕組みの説明はあるものの、いまいち納得というか、腹に落ちる感覚を掴めずにとてもモヤモヤした気持ちでした。

幸い現在はその仕組み、全体像が掴めたので、とても気持ちよくテーマ作成ができるようになりました。

というわけで以前、WordPressの仕組みを興味ない人にざっくり伝える、という記事を書いたのですが、

 

pochiweb.hatenablog.com

 

非常にざっくりした説明で、あまり役に立つ代物ではなかったので、今度はもう少し詳しく書いて行こう、という記事です。

まずはデータベースのこと

f:id:pochiweb:20170629081445j:plain

WordPressを触ったことのある方なら、データベースという単語にも触れていることと思います。

MySQLMariaDBなどですね。これらは両方、データベースシステムの名称です。役割は同じ。

データベースは、その名の通り様々なデータを保存してくれるシステムで、sqlというプログラミング言語を使うことによりデータの書き込みや削除、書き換え、さらに検索機能や並べ替え機能などが可能です。

WordPressにおいては、記事本文や画像へのパスのほか、サイトが表示する内容を保存するために使用されています。

実際にどんなデータが保存されるかはこの後触れる予定ですが、興味のある方はデータベース構造 - WordPress Codex 日本語版にて詳しく解説されていますので、見てみてください。

今の段階ではWordPressで作成されたページの情報全てがこのデータベースに保存されるんだな(厳密には違いますが、話を単純にするために)、程度の考えで良いと思います。

 

「データベースには、WordPressのデータが全て保存されている」

データベースに届く情報はどこから発信されているか?

データベースに全ての情報が保存されているとして、保存される情報はどこから入力されるのか?という疑問がありますね。

それが管理画面の各入力画面です。

WordPressでコンテンツを公開する時には、投稿タイトルやテンプレートなど、記事を作成する際に様々な情報を書き込んだり選択したりしますよね。

それら管理画面から入力した様々な情報が、データベースに送信されていきます。

どんな情報が、どのように保存されているのか?

 

続いて、どんな情報が保存されているのか、代表的なものを見ていきましょう。

以下のような記事を投稿したとします。

 

f:id:pochiweb:20170701160501p:plain

この場合、次のような情報が届けられていきます。(もちろん、ほんの一部です。)

  • post_id:投稿を管理するための番号。自動で付与されます。
  • post_type:ページの種類を保存します。 「投稿」を選んでいればpost、「固定ページ」を選んでいればpageが保存される値になります。

※途中ですが、「キー(key)」、「値(value)」という単語について解説します。

データベースに何か情報を保存する際には、「キー」と「値」がセットになっているのが普通なのですが、これは以下のようなエクセルの表をイメージしてもらうとわかりやすいです。

f:id:pochiweb:20170701160625p:plain

「post_id」や「post_title」などがkey、「1」や「WordPressとデータベース」がその値です。

WordPressでは様々なキーがあらかじめ用意されており、それらを組み合わせて様々な機能に利用しています。

  • post_title:投稿タイトル。②の内容がpost_titleというkeyの値として保存される
  • link_image:投稿内に掲載された画像へのパスを値として保存します。

まだまだあるのですが、投稿画面から規定の情報が色々と届けられているらしい、というくらいの認識で問題ないでしょう。

「クエリ」について

f:id:pochiweb:20170702140808j:plain

WordPressの仕組みを理解するということであれば、データベースについてはこれで十分でしょう。

というわけで、続いて「クエリ」についても紹介します。

クエリとはWikipediaによると

クエリ: query英語発音: [ˈkwɛri]英語発音: [ˈkwɪəri]クウィァリ))とは、一般に一連の問い合わせの中の個々の質問を意味する。 

 とされています。

WordPressパーマリンク設定を思い浮かべて欲しいのですが、デフォルトのパーマリンク設定では末尾は?p=123となっていますよね。

これは、postIDが123の記事を表示せよ、という要求になっていて、その要求文が「クエリ」です。

言い換えると、URLにデータベースへの要求が書かれているとも言えます。

クエリには、投稿名やカテゴリーの名称のほか、色々なものがあります。

 

ただ実際のところ、SEO的にも管理のしやすさ的にも、パーマリンク設定を変更するのが一般的ですから、実際はあまりこの形式のURLは見当たりませんよね。

多いのはpost_nameでのURL形式や、カスタムURLだと思いますが、これはサーバ側で処理をすることにより、表示するURL書き換えていて、実際はpost_idやcategoryなど、クエリ文がしっかりとサーバーに対して渡されています。

クエリにも色々と細かい話があるのですが、仕組みとしては以上を理解しておけば十分です。

テンプレート階層

f:id:pochiweb:20170702140650j:plain

長くなってきたので、これまでの内容を少し振り返りましょう。

ここまでの流れをまとめると

  1. 記事作成において様々な情報がデータベースに保存される
  2. アクセスしてきたURLに、データベースへのクエリが書かれている
  3. 要求された内容をデータベースから取り出し、ページを表示している

ということになります。

そしてここからは、テンプレート階層について簡単に紹介します。

テンプレートとは

まずテンプレートとは何かですが、ページを表示するための雛形です。

ファイルの中にはデータベースに保存された情報(記事本文やページタイトル)を表示するための関数であるWordPress関数がHTMLとともに書かれています。

テンプレートタイプ

WordPressには以下のようなテンプレートタイプが用意されています。

代表的なものをいくつか紹介していきます。

  • 「投稿」(single.php):管理画面左の「投稿」から作成されるページ。post_typepost
  • 「固定ページ(page.php)」:同じく、「固定ページ」から作るページ。post_typepage
  • アーカイブページ(archive.php)」:時系列で「投稿」を列記していくページ。
  • 「カテゴリーページ(category.php)」:カテゴリ別に「投稿」を列記していくページ。

他に、特定の「投稿」や「カテゴリーページ」に対してのみ有効なテンプレートを作ることもできます。

  • 「投稿+任意の文字列」(single-任意の.文字列php):特定の「投稿」に対して使用するテンプレート
  • 「固定ページ+任意の文字列(page-+任意の文字列.php)」:特定の「固定ページ」に使用するテンプレート。

などです。

これらを利用して全てのページごとのテンプレートを用意することも可能ですが、それではCMSの利点が失われてしまいますから、最低限のテンプレートで済ませるというのが一般的です。そこで役立っているのが次に紹介するテンプレート階層というシステムです。

 

テンプレート階層とクエリ

ここで、先ほどのクエリのことを思い出して欲しいのですが、クエリには様々なタイプがあります。例えばカテゴリー名~~のものを要求するクエリや固定ページを要求するクエリなどです。

テンプレートは、このクエリに応じて選択される仕組みになっています。

カテゴリー名Aのページへのリクエストがあれば、カテゴリーAテンプレートを。

固定ページAへのリクエストがあれば、固定ページAのテンプレートを探して表示する仕組みが用意されています。

ただ、先ほども触れたとおり、一般的にはに全てのページごとにデザインを変更するようなことはないですよね。

とは言え、いくつものテンプレートを用意するかもしれません。

そこで活躍するのがテンプレート階層というシステムです。

ものすごく大まかにいうと、WordPressではクエリに対して次のような流れでテンプレートを探し、合致した時点でそのテンプレートを使用してページを表示してます。

  1. そのページ専用のテンプレートがあるか?
  2. そのページが要求するタイプのテンプレートがあるか?(categorysingle.php)など)
  3. どれもないならindex.phpを使って表示

このシステムがあることで、たくさんのテンプレートを利用するユーザーにも、最低限のテンプレートで運用するユーザーにも

対応が可能になっています。

クエリやキーのカスタマイズ

テーマを作っていると、例えば

「同じカテゴリに属する投稿を表示したい」だったり、人気の投稿一覧を表示したい、という要望が出てくることがあります。

そんな時のために、WordPressではオリジナルのキーやクエリを作ることができるようになっています。

WP_Queryなどを利用したカスタマイズですね。今回では触れませんが、データベースとクエリを自由にカスタマイズすることで、様々なことが可能です。

最後に

長々とWordPressの仕組みを紹介してきましたが、今回の内容は以上になります。

自分のためではある記事ですが、もしどなたかの助けになれば嬉しいです。