WordPress : get_queried_object()の返り値のまとめ
Posted by admin at 7:54 日時 2013/09/11
WordPressでfunctions.phpなどあらかじめ分岐されたテンプレートではないPHPでクエリーオブジェクトを取得して何かしたいときに、いつもget_queried_objectの挙動が不安なのでメモってみた。
※3.6時点
- ホーム:NULL
- 投稿シングル:WP_Postオブジェクト
WP_Post Object ( [ID] => 1 [post_author] => 1 [post_date] => 2013-08-24 05:57:40 [post_date_gmt] => 2013-08-24 05:57:40 [post_content] => WordPress へようこそ。これは最初の投稿です。編集もしくは削除してブログを始めてください ! [post_title] => Hello world! [post_excerpt] => [post_status] => publish [comment_status] => open [ping_status] => open [post_password] => [post_name] => hello-world [to_ping] => [pinged] => [post_modified] => 2013-09-11 07:07:54 [post_modified_gmt] => 2013-09-10 22:07:54 [post_content_filtered] => [post_parent] => 0 [guid] => http://localhost/wordpress/?p=1 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 1 [filter] => raw [format_content] => )
- 固定ページ:WP_Postオブジェクト
WP_Post Object ( [ID] => 2 [post_author] => 1 [post_date] => 2013-08-24 05:57:40 [post_date_gmt] => 2013-08-24 05:57:40 [post_content] => これはサンプルページです。 [post_title] => サンプルページ [post_excerpt] => [post_status] => publish [comment_status] => open [ping_status] => open [post_password] => [post_name] => sample-page [to_ping] => [pinged] => [post_modified] => 2013-08-24 05:57:40 [post_modified_gmt] => 2013-08-24 05:57:40 [post_content_filtered] => [post_parent] => 0 [guid] => http://localhost/wordpress/?page_id=2 [menu_order] => 0 [post_type] => page [post_mime_type] => [comment_count] => 0 [filter] => raw [format_content] => )
- カテゴリーアーカイブ:stdClassオブジェクト
stdClass Object ( [term_id] => 1 [name] => 未分類 [slug] => %e6%9c%aa%e5%88%86%e9%a1%9e [term_group] => 0 [term_taxonomy_id] => 1 [taxonomy] => category [description] => [parent] => 0 [count] => 3 [cat_ID] => 1 [category_count] => 3 [category_description] => [cat_name] => 未分類 [category_nicename] => %e6%9c%aa%e5%88%86%e9%a1%9e [category_parent] => 0 )
- タグアーカイブ:stdClassオブジェクト
stdClass Object ( [term_id] => 3 [name] => タグ [slug] => %e3%82%bf%e3%82%b0 [term_group] => 0 [term_taxonomy_id] => 3 [taxonomy] => post_tag [description] => [parent] => 0 [count] => 1 )
- 日付アーカイブ:NULL
- 添付ファイル:WP_Postオブジェクト
WP_Post Object ( [ID] => 57 [post_author] => 1 [post_date] => 2013-09-11 07:14:15 [post_date_gmt] => 2013-09-10 22:14:15 [post_content] => [post_title] => IMG_0118 [post_excerpt] => [post_status] => inherit [comment_status] => open [ping_status] => open [post_password] => [post_name] => img_0118 [to_ping] => [pinged] => [post_modified] => 2013-09-11 07:14:15 [post_modified_gmt] => 2013-09-10 22:14:15 [post_content_filtered] => [post_parent] => 0 [guid] => http://localhost/wordpress/wp-content/uploads/2013/09/IMG_0118.jpg [menu_order] => 0 [post_type] => attachment [post_mime_type] => image/jpeg [comment_count] => 0 [filter] => raw [format_content] => )
- 検索結果:NULL
- 404:NULL
- 投稿タイプアーカイブ:stdClassオブジェクト
stdClass Object ( [labels] => stdClass Object ( [name] => dog [singular_name] => dog [add_new] => Add dog [add_new_item] => Add New dog [edit_item] => Edit dog [new_item] => New dog [view_item] => View dog [search_items] => Search dog [not_found] => No dog Found [not_found_in_trash] => No dog Found in Trash [parent_item_colon] => [all_items] => dog [menu_name] => dog [edit] => Edit [view] => View dog [parent] => Parent dog [name_admin_bar] => dog ) [description] => [publicly_queryable] => 1 [exclude_from_search] => [capability_type] => post [map_meta_cap] => 1 [_builtin] => [_edit_link] => post.php?post=%d [hierarchical] => [public] => 1 [rewrite] => Array ( [slug] => dog [with_front] => 1 [pages] => 1 [feeds] => 1 [ep_mask] => 1 ) [has_archive] => 1 [query_var] => dog [register_meta_box_cb] => [taxonomies] => Array ( [0] => category ) [show_ui] => 1 [menu_position] => [menu_icon] => [can_export] => 1 [show_in_nav_menus] => 1 [show_in_menu] => 1 [show_in_admin_bar] => 1 [delete_with_user] => [label] => dog [singular_label] => dog [name] => dog [cap] => stdClass Object ( [edit_post] => edit_post [read_post] => read_post [delete_post] => delete_post [edit_posts] => edit_posts [edit_others_posts] => edit_others_posts [publish_posts] => publish_posts [read_private_posts] => read_private_posts [read] => read [delete_posts] => delete_posts [delete_private_posts] => delete_private_posts [delete_published_posts] => delete_published_posts [delete_others_posts] => delete_others_posts [edit_private_posts] => edit_private_posts [edit_published_posts] => edit_published_posts [create_posts] => edit_posts ) )
- タクソノミーアーカイブ:stdClassオブジェクト
stdClass Object ( [term_id] => 4 [name] => Jason Statham [slug] => jason-statham [term_group] => 0 [term_taxonomy_id] => 4 [taxonomy] => actors [description] => [parent] => 0 [count] => 0 )
所感
- WP_Postオブジェクトは便利だ。post_typeパラメーターで見分けがつく
- カテゴリーだけ後方互換性のためかオブジェクトの内容が違う。重複しているだけなので category_nicename や cat_name パラメーターは使わないほうが汎用性が高い
- stdClassで返ってくるのは今のところタクソノミーと投稿タイプの2パターンがあり得る。stdClassやめてくれマジで
- タクソノミーが絡まないアーカイブや検索結果がNULLなのはこういうもんだと思うしかなさそうだ
- get_queried_object_id() の返り値は、post_id または term_id でそれ以外は0。投稿タイプアーカイブは get_queried_object() だとオブジェクトが返ってくるが get_queried_object_id() は無反応なので注意
ということで考えられる妥当な条件分岐(なげえ)
$obj = get_queried_object(); if (is_object($obj)) { if ($obj instanceof WP_Post) { echo '投稿'; if ( is_front_page() ) { echo '表示設定で選択したフロントページ'; } elseif( is_home() ) { echo '表示設定で選択した投稿ページ'; } } elseif ($obj instanceof stdClass) { // ここ何とかして! if ( isset($obj->taxonomy) ) { echo 'タクソノミー'; } elseif ( isset($obj->labels) ) { echo '投稿タイプ'; } } } elseif( is_archive() ) { echo 'タクソノミー、投稿タイプ以外のアーカイブ'; } elseif( is_search() ) { echo '検索結果'; } elseif( is_home() ) { echo '通常のホーム'; } else { echo '404'; }
うーん、素直に条件分岐関数を使ったほうがマシっぽいですな。