WordPressでカスタム投稿をターム毎に出力する方法

今回はWordPressでカスタム投稿タイプをターム毎に出力する方法を紹介します。

目標はターム毎に指定した数の記事タイトルと記事の内容(抜粋)が表示され、タームに記事がない場合はあらかじめ指定した文章を表示します。

また、タームに親子階層は無しにします。

 

コード

functions.phpに以下のコードをコピペします。

カスタム投稿タイプは「旅ログ」、スラッグは「trip」としておきます。

また、カスタムタクそのミーのスラッグは「pref」としておきます。

add_action( 'init', 'create_post_type' );
function create_post_type() {
    register_post_type( 'trip', // カスタム投稿のスラッグ
        array(
            'labels'            => array(
                'name'          => __( '旅ログ' ),   // 投稿タイプ名
                'singular_name' => __( '旅ログ' )    // 投稿タイプ名
            ),
            'public' => true,
            'has_archive' => true,
            'menu_position' =>5,
            'supports' => array('title','editor')
        )
    );

    // カテゴリタクソノミー(カテゴリー分け)を使えるように設定する
    register_taxonomy(
        'pref', // タクソノミー(カテゴリー)のスラッグ
        'trip', // 適用するカスタム投稿のスラッグ

        array(
            'hierarchical' => true, // trueだと親子関係が使用可能。falseで使用不可
            'label' => '都道府県',          // タクソノミー名(カテゴリー名)
            'singular_label' => '都道府県', // タクソノミー名(カテゴリー名)
            'public' => true,
            'show_ui' => true
        )
    );
}

 

カスタム投稿タイプを表示するコード

以下のコードをindex.php(もしくはfront-page.php)にコピペしてください。

<?php
$taxonomies = 'pref'; // タクソノミー(カテゴリー)スラッグを指定
$args = array(
    'hide_empty' => false, // 空のタームを出力しない場合はtrue
);
$terms = get_terms( $taxonomies , $args );

// ターム(カテゴリー)別に記事を出力する
foreach ($terms as $term) :

    $args = array(
        'post_type'     => 'trip',
        'taxonomy'      => $taxonomies,
        'term'          => $term->slug,
        'posts_per_page'=> 5 // 最新5記事。数を指定しない場合は-1を指定
    );

    $trip_posts = get_posts( $args );

    if ( $trip_posts ) {
    // 記事がある場合

        // ターム名(カテゴリー名)
        echo '<h1>'.$term->name.'</h1>';

        foreach ( $trip_posts as $post ) :
            setup_postdata( $post ); ?>
<section>
    <h2><?php the_title();      // 記事の見出し ?></h2>
    <div><?php the_content();   // 記事の内容 ?></div>
</section>
<?php
        endforeach;

    } else {
    // 記事がない場合

        // ターム名(カテゴリー名)
        echo '<h1>'.$term->name.'</h1>';
        echo '<p>ここにはまだ旅行していません。</p>';
    }

endforeach;

wp_reset_postdata();
?>

 

基本的にWordPressループを使って出力しています。

タームの順番はプラグインを使って並び替えることが出来ます。