WP(ワードプレス)構築において、よくカスタム投稿を使用する場面が多いので、自分なりのまとめを作って整理するためにこのエントリーを書きました。不備などがあると思いますので指摘していただけたら嬉しいです。
カスタム投稿とは?
WPには初期設定から「投稿」「固定ページ」という投稿タイプがありますが、これとは別の投稿タイプを追加するときに使用するのがカスタム投稿です。
例えば、「投稿」を新着情報で使用していたとして、「投稿」と同じような仕様で「Eightのラーメン日記」という違った投稿をしたい場合、カスタム投稿を使うことで「投稿」とは違った記事管理ができ、管理画面に新たなボタンも追加されるのでわかりやすい管理画面が実現できます。
カスタム投稿の追加方法
カスタム投稿はfunction.phpに直接記述し追加するか、プラグインを使って管理画面から追加する方法があります。
プラグインで有名なのは「Custom Post Type UI」というプラグインです。このプラグインはカスタム投稿の追加だけではなくカスタムタクソノミーの追加もでき、今も更新されているプラグインなのでカスタム投稿を使用するときはこちらも併せてインストールしておくと便利な場合があります。
今回は、function.phpに直接記述する方法をご紹介します。わざわざ記述しなくてもよい設定もありますが、今回は知っておいてよい設定は記述しているので、実際の作業の場合で要らない記述は削除してください。
//カスタム投稿:Eightのラーメン日記 register_post_type('entry-ramen',//投稿タイプ array( 'label' => 'Eightのラーメン日記投稿', 'menu_position' => 2,//管理画面の表示されるメニューの位置 'labels' => array (//管理画面の表示 'name' => 'Eightのラーメン日記投稿', 'all_items' => 'Eightのラーメン日記投稿一覧', 'add_new' => '新規Eightのラーメン日記投稿', 'add_new_item' => '新規投稿を追加', 'edit_item' => '投稿の編集', 'new_item' => '新規投稿', 'view' => '投稿の表示', 'view_item' => '投稿の表示', 'search_items' => 'Eightのラーメン日記投稿を検索', 'not_found' => '記事が見つかりませんでした', 'not_found_in_trash' => 'ゴミ箱内に記事が見つかりませんでした', 'parent_item_colon' => '親カテゴリー' ), 'description' => '',//投稿の簡単な説明文 'public' => true,//投稿タイプをパブリックにするかどうか 'exclude_from_search' => false,//フロントエンドの検索結果から除外するかどうか 'show_ui' => true,//管理画面に表示するか 'capability_type' => 'post', 'supports' => array(//編集画面に表示するオプション 'title', 'editor', 'thumbnail', 'revisions', //'author', //'excerpt', //'trackbacks', //'custom-fields', //'comments', //'page-attributes', //'post-formats' ), 'has_archive' => true,//アーカイブページで一覧を表示するかどうかデフォではfalse 'rewrite' => array('slug' => ''),//この投稿タイプのパーマリンクのリライト方法を変更する 'query_var' => true //投稿に使用する query_var キーの名前 ) );
ここで注意してもらいたいのが、「has_archive」。このパラメーターをtrueにしないとカスタム投稿タイプのアーカイブページが表示されないという困った挙動を示してしまいます。デフォルトはfalseなので改めここで再設定しましょう。
has_archiveを設定したのにアーカイブが表示されない場合はダッシュボードから、パーマリンク設定の「変更を保存」ボタンを押してください。内部的な変更が更新されます。
続いて、固定ページでカスタム投稿一覧を表示する記述を紹介します。
query_posts関数の場合
<?php $args = array( 'orderby' => 'date', 'order' => 'DESC', 'post_type' => 'entry-ramen', //投稿タイプの指定 'taxonomy' => 'ramen', //タクソノミー 'term' => 'tonkotsu', //ターム 'paged' => get_query_var( 'paged' ) // ページネーションするなら必須 ); query_posts( $args ); ?> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <h1><?php the_title(); ?></h1> <div><?php the_content(); ?></div> <?php endwhile; else: ?> <div>表示できる情報はありません。</div> <?php endif; ?> <?php wp_reset_postdata();//リセット ?> <?php //ページャー ?>
get_posts関数の場合
<?php $args = array( 'numberposts' => 10,//取得件数(省略時は5) 'orderby' => 'date', 'order' => 'DESC', 'post_type' => 'entry-ramen', //投稿タイプの指定 'taxonomy' => 'shurui', //タクソノミー 'term' => 'tonkotsu', //ターム ); $query = get_posts( $args ); ?> <?php if ( $query ) : foreach ( $query as $post ) : setup_postdata( $post ); ?> <h1><?php the_title(); ?></h1> <div><?php the_content(); ?></div> <?php endforeach; else: ?> <div>表示できる情報はありません。</div> <?php endif; ?>
タクソノミーとタームについて
あまり聞きなれないタクソノミーとタームですが、カスタム投稿においてカテゴリー分けのような仕様を実現したい場合に使用します。
タクソノミーですが、単一もしくは複数のタームが属するグループというイメージです。例えば「ラーメン」というタクソノミーに「とんこつ」「味噌」「醤油」などのタームが属しているとうい感じです。
なので、カスタム投稿一覧「ラーメン」というタクソノミーの「とんこつ」というタームに紐付けられている記事を取得しているのが上記の記述です。タームの部分を削除すると、ラーメン」というタクソノミーに紐付けられている記事を取得します。
タクソノミーとタームもfunction.phpに記述して設定できますが、冒頭でも紹介した「Custom Post Type UI」で追加・編集するのがとても簡単です。
カスタム投稿タイプのアーカイブページへのアドレス(リンク)のみ取得
get_post_type_archive_link を使用するとカスタム投稿のアーカイブページのアドレスのみを取得できます。
<?php echo get_post_type_archive_link( '投稿タイプ名' ); ?>
また、現在表示している記事が、カスタム投稿の記事である場合でそのカスタム投稿のアーカイブページへのアドレス取得したい場合は
<?php echo get_post_type_archive_link( get_post_type() ); ?>
https://codex.wordpress.org/Function_Reference/get_post_type_archive_link
カスタム投稿タイプのターム一覧の取得
カスタム投稿タイプのターム一覧
$e_terms_ary = get_terms(get_post_type()); foreach ( $e_terms_ary as $e_term ) { $str_html .= '<li><a href="'.get_term_link( $e_term ).'">' . $e_term->name . '</a></li>'; echo "<ul>".$str_html."</ul>";
おわりに
カスタム投稿は便利な分、多様しがちですが、多くなればなるほど、ごちゃごちゃした管理画面になるので、まずはサイト設計をしっかりしたうえで、導入を検討するのが望ましいと思います。
不備などがあると思いますのでコメントやツイッターで指摘していただけたら嬉しいです。