1. WordPress

【WordPress】get_post_typeで投稿タイプを取得する方法を解説

Share

WordPressでは、投稿には「投稿タイプ(post type)」という概念があります。

標準では「投稿(post)」や「固定ページ(page)」があり、さらにカスタム投稿タイプを追加することも可能です。

プログラム内で現在の投稿がどの投稿タイプかを判別したい場合、get_post_type() 関数が便利です。

この記事では get_post_type() の基本的な使い方から、応用例まで詳しく解説します。

get_post_type()とは?

get_post_type() は指定した投稿の投稿タイプを文字列で返す関数です。投稿タイプの例としては以下があります。

  • post … 通常のブログ投稿
  • page … 固定ページ
  • attachment … メディア添付ファイル
  • カスタム投稿タイプのスラッグ(例:movieproduct

引数に投稿IDや投稿オブジェクトを渡さなければ、現在の投稿(ループ内の投稿)に対して投稿タイプを返します。

基本的な使い方

ループ内で使う例です。

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();
        $post_type = get_post_type();
        echo 'この投稿の投稿タイプは: ' . $post_type;
    }
}

このコードは、投稿タイプを取得して画面に表示します。

投稿IDを指定して取得する方法

ループ外で特定の投稿の投稿タイプを取得したい場合は投稿IDを渡します。

$post_id = 42;
$post_type = get_post_type( $post_id );
echo '投稿ID 42 の投稿タイプは: ' . $post_type;

投稿オブジェクトを渡すことも可能

投稿オブジェクトを持っている場合は、そのまま渡せます。

$post = get_post( 42 );
$post_type = get_post_type( $post );
echo '投稿ID 42 の投稿タイプは: ' . $post_type;

投稿タイプに応じた処理を行う例

取得した投稿タイプを条件分岐に使うことで、タイプ別の表示や処理を行えます。

$post_type = get_post_type();

if ( $post_type === 'post' ) {
    echo 'これは通常の投稿です。';
} elseif ( $post_type === 'page' ) {
    echo 'これは固定ページです。';
} elseif ( $post_type === 'movie' ) {
    echo 'これはカスタム投稿タイプ「movie」です。';
} else {
    echo 'その他の投稿タイプです。';
}

了解です!実践的な応用例を追加で書きますね。


実践的な応用例:投稿タイプに応じてテンプレートを切り替える

WordPressのテーマ開発でよくあるのが、投稿タイプによって表示テンプレートやスタイルを変えたい場合です。

get_post_type() を使って条件分岐することで簡単に実装できます。

例:投稿タイプごとに呼び出すテンプレートを変える

get_post_type()get_template_part() を組み合わせて投稿タイプによって呼び出すテンプレートを変える方法を紹介します。

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();

        $post_type = get_post_type();

        // 投稿タイプに応じてテンプレートパーツを読み込む
        if ( $post_type ) {
            get_template_part( 'template-parts/content', $post_type );
        } else {
            // 投稿タイプが取得できなかった場合のデフォルトテンプレート
            get_template_part( 'template-parts/content', 'default' );
        }
    }
}
  • get_post_type() で現在の投稿の投稿タイプを取得します。
  • get_template_part( 'template-parts/content', $post_type )template-parts/content-{投稿タイプ}.php のテンプレートファイルを読み込みます。
  • 例えば投稿タイプが post なら template-parts/content-post.php、カスタム投稿タイプ movie なら template-parts/content-movie.php が呼ばれます。
  • 投稿タイプが取得できない場合は content-default.php を読み込むようにしています。

この方法で投稿タイプごとにテンプレートの分岐を簡単に実装可能です。

別ファイルを読み込むget_template_part関数を使いこなそう【WordPress】 – Webool

例:投稿タイプごとに異なる見出しを表示する

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();

        $post_type = get_post_type();

        if ( $post_type === 'post' ) {
            echo '<h2 class="post-title">' . get_the_title() . '</h2>';
        } elseif ( $post_type === 'page' ) {
            echo '<h1 class="page-title">' . get_the_title() . '</h1>';
        } elseif ( $post_type === 'movie' ) {
            echo '<h3 class="movie-title">🎬 ' . get_the_title() . '</h3>';
        } else {
            echo '<h2 class="default-title">' . get_the_title() . '</h2>';
        }

        the_content();
    }
}

この例では投稿タイプに応じてタイトルの見出しタグやクラス名を変えています。movie というカスタム投稿タイプがある場合はアイコン付きの見出しにしています。

例:管理画面で投稿タイプごとにカスタムメッセージを表示する

管理画面の投稿編集画面で投稿タイプごとにメッセージを出したい場合は、add_actionget_post_type() を組み合わせます。

function my_custom_admin_notice() {
    $screen = get_current_screen();
    if ( $screen->post_type ) {
        $post_type = $screen->post_type;
        if ( $post_type === 'movie' ) {
            echo '<div class="notice notice-info is-dismissible"><p>この投稿は「movie」投稿タイプです。</p></div>';
        }
    }
}
add_action( 'admin_notices', 'my_custom_admin_notice' );

投稿タイプの追加方法

投稿タイプはregister_post_type関数で追加することができます。

register_post_typeの使い方は以下の記事を参考にしてください。

【徹底解説】register_post_type()でカスタム投稿タイプを作成しよう – Webool

まとめ

  • get_post_type() は投稿の投稿タイプを文字列で取得できる
  • 引数に投稿IDや投稿オブジェクトを渡すことができる
  • 投稿タイプによって表示や処理を変えたい場合に活用できる

ぜひテーマやプラグイン開発の際に役立ててください。

公式ドキュメント