かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

WordPress 投稿が0件でもpost_typeを取得したい。

WordPresspost_typeを取得する場合 通常 get_post_type() を使うのですが、投稿が無い時(0件の時) get_post_type()false を返すため今のページのpost_typeを取得できない場合があります。(カスタム投稿タイプを作って投稿が0件のアーカイブページとか)

Source File: wp-includes/post.php

<?php
function get_post_type( $post = null ) {
    if ( $post = get_post( $post ) )
        return $post->post_type;
    return false;
}

引用元: get_post_type() | Function | WordPress Developer Resources

これは投稿がないとglobal $postがNULLなためget_post( $post )が見つからないのでfalseが返る仕様になっているようです。

get_query_var() を使う

get_query_var( 'post_type' ) を使うと、投稿が0件で $post が NULL の時でも、そのページのpost_typeを取得することができます。

<?php
$post_type = get_query_var( 'post_type' );
echo  $post_type;

カスタム投稿タイプなど投稿が0件でもアーカイブページを表示したり、グローバルナビゲーションなどでpost_typeが必要になる場合はこちらを使うのが良いのではないかと思います。

投稿の一覧ページ( is_home() )の問題

WordPress管理画面の設定 表示設定 > フロントページの表示 で指定できる投稿の一覧ページでは、
投稿が1件以上ある場合でもglobal変数の$wp_queryにはpost_typeが設定されていないので get_query_var( 'post_type' )post_typeを取得することはできませんでした。
投稿がある場合は get_post_type() で取得することが出来るのですが、
投稿が0件の時はget_query_var( 'post_type' ) でも get_post_type() でも post_type を取得することができません。
投稿のpost_typeのデフォルトがpostなので、is_home() && !get_post_type() の時はデフォルト値としてpostをハードコーディングで当てるしかなさそうです。

追記
カテゴリー・タクソノミーのアーカイブでは投稿があっても、query_varにpost_typeはセットされていないようで、 get_query_var( 'post_type' ) は 常に NULL になっていました。

taxonomyオブジェクトを取得して taxonomy_obj-> object_type[0] とすれば、post_type が取得できるようです。
カテゴリーの場合は get_taxonomy('category') で、カスタムタクソノミーはget_query_var('taxonomy')でタクソノミー名を取得してget_taxonomy('タクソノミー名') とすれば taxonomyオブジェクト が取得できます。

EX: post_type を取得する関数

アーカイブページ・シングルページなどで分けてpost_typeを返す関数を作成してみました

<?php
function get_current_post_type() {
  $post_type = get_post_type();
  
 if( empty($post_type) ) {
    // 投稿が 0 件の時
    if( is_category() ) {
      $tax = get_taxonomy('category');
      $post_type = $tax->object_type[0];
    } else
    if( is_tax() ) {
      // category, taxonomy get_query_var( 'post_type' ) は常に null
      // 投稿が 1件 でもあれば get_post_type() で取得可能
      $term = get_query_var('taxonomy');
      $tax = get_taxonomy( $term );
      $post_type = $tax->object_type[0];
    } else
    if( is_archive() ) {
      // 投稿が 0 件の時 get_post_type() は false を返すので get_query_var() で取得する
      $post_type = get_query_var( 'post_type' );
    } else
    if( is_home() ) {
      // 投稿の一覧で投稿が0件の時は 'post' を設定
      $post_type = 'post';
    }
  }
  return $post_type;
}

 
はてなblogさん。。。
マークダウンで引用内にコードブロック出力するにはどうしたら良いのですか???エンジニア系のblogだと結構必要じゃない?


[参考]