投稿情報を連想配列で参照する

(3.5.0以降)
投稿情報を連想配列で参照する - キャストしないでto_array

説明

投稿情報は、タイトルや本文、投稿日時といったいくつかのデータが含んでおり、多くの場合オブジェクトになっている。これを連想配列で扱いたい場合はキャストして型変換することが多かった。基本的にはキャストで問題ないのだが、ふと目に留まったto_arrayメソッドが興味深かったのでメモとして残しておく。

3.5.0前後で様変わり

本編に入る前に、お断りというか注意点を。WordPressの投稿情報はバージョンによって変わってきており、元々は標準クラス(stdClass)のオブジェクトだったが、3.5.0以降はWP_Postクラスに変更され、今回取り上げているto_arrayメソッドはWP_Postクラスのもにになる。つまり3.5.0より前のバージョンでは今回取り上げているto_arrayメソッドは使用できないので、それを踏まえて読み進めてほしい。

まずは、次の表を見てほしい。これはWordPress 4.0.0において投稿情報を単純にキャストした内容とto_arrayメソッドで得られる連想配列のキーを示したものである。

内容arrayキャスト時のキーto_arrayメソッドのキー
投稿IDID
投稿者IDpost_author
投稿日時post_date
投稿日時(GMT)post_date_gmt
投稿内容post_content
タイトルpost_title
投稿内容の抜粋post_excerpt
投稿状態post_status
コメント投稿状態comment_status
トラックバック/ピンバック受付状態ping_status
パスワードpost_password
投稿名post_name
ping用URLto_ping
pingされてきたURLpinged
更新日時post_modified
更新日時(GMT)post_modified_gmt
DB用フィールドpost_content_filtered
親投稿の投稿IDpost_parent
ユニーク識別子guid
メニュー番号menu_order
投稿タイプpost_type
添付ファイルのMIMEタイプpost_mime_type
コメント数comment_count
フィルター名filter
先祖の投稿IDリストancestors
テンプレート名(固定ページのみ)page_template
カテゴリーIDリストpost_category
投稿タグIDリストtags_input

arrayキャストとto_arrayメソッドで得られる連想配列の違いは、表下側の4要素(page_templateは投稿タイプが固定ページのみ)である。to_arrayメソッドで拡張される4要素について、データの例や関連する関数を交えて順番に見ていこう。

to_arrayメソッドのキー関連する関数値の例
page(固定ページ)post(投稿)
ancestorsget_post_ancestors{ [0] => 142, [1] => 86 }{}
page_templateget_post_metaget_page_template_slug'default'
post_categoryget_the_terms{}{ [4] => 4 }
tags_inputget_the_terms{}{ [3] => 'タグ1', [10] => 'タグ2' }

まずはancestors。親の投稿ID、さらにその親投稿があればその投稿IDが格納されている。上記の例だとキー0が親記事の投稿ID、キー1が親の親記事のIDとなる。なおこのancestorsは、3.5.0より前のバージョンでは投稿情報(stdClass)オブジェクトには含まれていたが、3.5.0以降の投稿情報(WP_Post)オブジェクトには含まれておらず、結果としてarrayでキャストした連想配列にも含まれていない。

page_templateには、カスタムフィールドに保存されている固定ページのテンプレート名になる。デフォルトテンプレート(page.php)の場合は'default'、テーマ内の個別のテンプレートファイルが設定されている場合はそのファイル名となる。なおget_page_template_slug関数の場合は、'default'は''に置き換えられるてしまうので、その点は注意したい。

post_categoryには、その投稿情報のカテゴリーIDが格納された配列となる。キーとその値のどちらもカテゴリーIDになるため、最初のカテゴリーIDをはキー0では参照できない。別途カテゴリー情報を取得して使う感じなんでしょう。

最後のtags_inputは投稿タグの配列で、キーは投稿タグID、その値は投稿タグ名(スラッグではない)になっている。こちらは使いやすそうですね。

__getメソッドで個別に取得できる

なお、これらの4要素については、__getメソッドで個別に取得できる。

$ancestors = $post->__get( 'ancestors' );
$page_template = $post->__get( 'page_template' );
$post_category = $post->__get( 'post_category' );
$tags_input = $post->__get( 'tags_input' );

ちなみに、__getメソッドで上記以外のキー名を指定すると、カスタムフィールドの値を取得することができる。

$value = $post->__get( 'keyname' );

/* 以下と同等 */
$value = get_post_meta( $post->ID, 'keyname', true );
get_post_meta関数の第3パラメータがtrueになるため、同じキー名で複数の値を登録している場合は1つの値しか取得できないことになるが、これはこれで便利だろう。

関連

  • WP_Post - 投稿情報クラス
  • get_page_template_slug - 固定ページに指定されているテンプレートファイルのスラッグを取得する
  • get_post - 投稿情報を取得する
  • get_post_ancestors - 先祖の投稿IDを取得する
  • get_post_meta - カスタムフィールド情報を取得する
  • get_the_terms - 投稿記事のタクソノミー情報を取得する
  • wp_list_pluck - 配列内のオブジェクトまたは連想配列から特定の値だけを抽出する
  • $post - 投稿情報

お勧めコンテンツ

the_content(2009年11月12日 登録)

void the_content( [ string $more_link_text = null [ , int $stripteaser = 0 [ , string $more_file = '' ] ] ] )
投稿記事の内容のすべてまたは一部を表示する。

wp_generate_password(2013年2月22日 登録)

string wp_generate_password( [ int $length = 12 [ , bool $special_chars = true [ , bool $extra_special_chars = false ] ] ] )
パスワードを生成する。

cat_is_ancestor_of(2011年11月15日 登録)

bool cat_is_ancestor_of( mixed $cat1, mixed $cat2 )
カテゴリが子孫関係か調べる。

get_url_in_content(2013年8月2日 登録)

mixed get_url_in_content( string $content )
文字列の中に含まれるaタグのURLを抜き出す。

get_post_thumbnail_id(2010年7月13日 登録)

int get_post_thumbnail_id( [ int $post_id = null ] )
投稿情報にアイキャッチ画像(サムネイル)として設定されているアタッチメント情報のIDを取得する。

最終更新日時 : 2014-11-17 08:37