wordpressをカスタマイズをしたい
wordpressをカスタマイズしているとさまざまな関数や変数やオブジェクトに出くわすことになります。より深くカスタマイズしていくとどうしても用意された関数ではなく、自分でデータを処理したい場面も出てくるでしょう。
その時、自分が処理したいデータがどこにどのように入っているのか、また、どんなデータ構造になっているかを知ることはとても大切なことです。
今回は特に触る事が多いであろうグローバル変数の$postについて説明したいと思います。
wordpressグローバル変数$postとは
$postが出来るまで
$postはループで「今の投稿データ」が格納されるグローバル変数です。通常$postにデータが入る流れは簡単に説明すると以下の様になります。
- 1.URLからクエリの解析
- 2.解析したクエリでデータベースから情報を引っ張る
- 3.$wp_queryにデータベースから得たデータが格納される
- 4.テンプレートでのループの開始
- 5.$wp_queryメソッドのhave_posts()で投稿データの有無を判断する
- 6.記事があった場合、$wp_queryメソッドのthe_post()で$postに「現在の投稿データ」が入る
$postの使い道
$postの使い道はずばり投稿データのカスタマイズにあります。たとえば投稿の中から任意のhtmlタグを抜き出す処理や、ID取得からの他の処理につなげる、リストとシングルページで表示形式を変える為のタイトル加工や日付加工など、考えられる処理は多いです。
$wp_queryにはクエリによって得られたすべての投稿データや状態情報が入るので、非常に膨大で複雑な構造になっています。
たくさんのメソッドが存在しており、$wp_queryを操作することも可能ではありますが、投稿データの為に$wp_queryは扱うのには大きすぎます。
そこで、一つ一つの投稿データを格納する$postの出番です。$postは一つの投稿データ(タイトル、投稿日時、本文など)を格納するので、$wp_queryよりもずっと構造が単純で、格納される情報も少なく扱いやすいです。
投稿データをなんらかの形でカスタマイズする場合は$postを主体にアイデアを練るのがお勧めです。
wordpressグローバル変数$postの中身
$postの各プロパティの意味・型など
以下に$postの各プロパティについてまとめてみましました。いろいろ調べてまとめたが、普段使わない値もあり少し説明に不安なところがあります。できればWordPressCodex等を合わせて参照してもらえればと思います。
パラメータ名 | 意味 | 値の型 | 値の例 | 値へのアクセス | 関係するテンプレートタグ・関数 |
---|---|---|---|---|---|
ID | 投稿のID | 整数値(int) | 189 | $post->ID | the_ID()</dd |
post_author | 投稿の著者 | 文字列(string) | ※著者のIDが入る | $post->post_author | the_author(), the_modified_author(), get_modified_author() |
post_date | 作成日時(日本なら日本標準時) | 文字列(string) | 2015-01-18 15:49:02 | $post->post_date | the_date(), the_time(), get_the_date(), get_post_time() |
post_date_gmt | 作成日時(グリニッジ標準) | 文字列(string) | 2015-01-18 6:49:02 | $post->post_date_gmt | the_date(), the_time(), get_the_date(), get_post_time() |
post_content | 投稿本文 | 文字列(string) | ※エディタ等で書かれたhtmlタグを含めた本文がそのまま入っている | $post->post_content | the_content(), the_content_rss(), get_the_content |
post_title | 投稿タイトル | 文字列(string) | これはタイトルです | $post->post_title | the_title(), the_title_rss(), the_title_attribute(), get_the_title() |
post_excerpt | 投稿の抜粋 | 文字列(string) | ※抜粋に記述された文字列が格納されている | $post->post_excerpt | the_excerpt(), the_excerpt_rss(), get_the_excerpt() |
post_status | 投稿の状態 | 文字列(string) | publish(公開済), future(予約投稿), private(非公開), draft(下書き), Auto-draft(自動下書き), Inherit(メディア、リビジョン等), trash(ゴミ箱) | $post->post_status | the_author(), get_the_author() |
comment_status | コメントの扱い | 文字列(string) | open(公開), colse(非公開) | $post->comment_status | 特になし |
ping_status | ピンバックの扱い | 文字列(string) | open(公開), colse(非公開) | $post->ping_status | 特になし |
post_password | 投稿のパスワード(設定している場合のみ) | 文字列(string) | ※英数字のみ使用可 | $post->post_password | post_password_required() |
post_name | 投稿のスラッグ名 | 文字列(string) | car-sport-about | $post->post_name | get_page()※ver3.5.0から非推奨 |
to_ping | ping送信先 | 文字列(string) | ※ping送信先のURLが入る | $post->to_ping | 特になし |
pinged | トラックバック送信先(履歴) | 文字列(string) | ※トラックバック送信先のURLが入る | $post->pinged | 特になし |
post_modified | 更新日時(日本なら日本標準時) | 文字列(string) | 2015-01-18 15:49:32 | $post->post_modified | the_modified_date(), the_modified_time() |
post_modified_gmt | 更新日時(グリニッジ標準) | 2015-01-18 15:49:32 | $post->post_modified_gmt | the_modified_date(), the_modified_time() | |
post_content_filtered | フィルター処理後の投稿本文(等) | ※フィルターでの処理結果をキャッシュする目的等で使われるフィールド ※どちらかというと開発寄りのパラメータ | $post->post_content_filtered | 特になし | |
post_parent | 親投稿のID | 整数値(int) | ※親投稿のIDが入る | $post->post_parent | 特になし |
guid | 投稿のURL | 文字列(string) | http://hoge.jp?p=100 ※パーマリンク設定でのURLではなく?p=形式のデフォルトURLが入る | $post->guid | the_permalink(), get_permalink(), get_post_permalink(), get_page_link() |
menu_order | 表示順のオーダー | 整数値(int) | ※固定ページのパラメータ「順序」にて設定した数字 | $post->menu_order | 特になし |
post_type | 投稿の形式 | 文字列(string) | post(投稿), page(固定ページ), revision(更新記録), Attachment(添付) | $post->post_type | register_post_type() |
post_mime_type | 投稿形式がAttachmentの場合のMIME形式 | 文字列(string) | image/png, image/jpeg, image/gif等 | $post->post_mime_type | 特になし |
comment_count | コメント数 | 文字列(string) | ※ピンバックとコメントの合計数になるとのこと | $post->comment_count | comments_number() |
filter | サニタイズの形式 | 文字列(string) | raw(数値フィールドの値をサニタイズ), edit(各種フィルターフックでサニタイズ), db(各種フィルターフックでサニタイズ), display(各種フィルターフックでサニタイズ), attribute(各種フィルターフック後にesc_attr()でサニタイズ), js(各種フィルターフックの後にesc_js()サニタイズ) | $post->filter | esc_attr() |
$postの中身を見てみたい人はvar_dump()かprint_r()を使いましょう。
@MINOはvar_dump()派。print_r()よりも情報が詳細だ(データの型なども表示される)。見た目も<pre>タグで囲ってしまえば、そこそこきれいですが、やはりちょっと見難いです。
var_dump()した場合はページソースを直接確認する方が読みやすいです。確認にはページソース閲覧をお勧めします。
以下のようにループ内でvar_dumpを記述してあげれば、ループで得られる投稿の情報がズラズラと表示されるはずです。
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<pre><?php var_dump($post); ?></pre>
<!--なんらかのhtml-->
<?php endwhile; ?>
<?php endif; ?>
まとめ
wordpressカスタマイズの一歩は$postからなどともいわれるように[誰によって?]、最初に手を付けるにはうってつけな難易度だと思っています。
$postをうまくハンドリングできるようになると、投稿データをいかようにも扱うことができ、見せ方をいろいろ工夫することができます。 もちろんjavascript等と連携すれば、かなり高度な処理にも通じるはずです。
wordpressを使い倒してやろうないでしょうか。