2021/04/21
Wordpress /
カスタム投稿タイプについて

functions.phpに下記を記述で実装できる。下記をデフォルトとする。
// カスタム投稿タイプ item
function item_custom_post_type(){
$labels = array(//管理画面での表示
'name' => _x('アイテム', 'post type general name'),
'singular_name' => _x('アイテム', 'post type singular name'),
'add_new' => _x('新規追加', 'item'),
'add_new_item' => __('アイテム'),
'edit_item' => __('編集'),
'new_item' => __('新規アイテム'),
'view_item' => __('表示'),
'search_items' => __('項目検索'),
'not_found' => __('記事が見つかりません'),
'not_found_in_trash' => __('ゴミ箱に記事はありません'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,//falseで個別ページを事実上なくす。管理画面にURLが出なくなり、検索エンジンからもヒットしない。ただURLは存在する。[1]
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'capability_type' => 'post',
'hierarchical' => false,//階層構造の有無
'menu_position' => 4,//管理画面メニューの位置
'has_archive' => true,//アーカイブがあるかどうか
'rewrite' => array( 'slug' => 'item'),
'supports' => array('title','editor','thumbnail')//編集ページの順番
);
register_post_type('item',$args);//itemはカスタム投稿のスラッグ名
$args = array(//タクソノミー追加
'label' => 'カテゴリー',//管理画面で表示される文字
'public' => true,
'show_ui' => true,
'show_in_menu' => true,//管理画面のメニューで一覧を表示するか
'show_in_nav_menus' => true,
'show_admin_column' => true,
'hierarchical' => false,//ページ階層の指定
'query_var' => true
);
register_taxonomy('item_category','item',$args);//タクソノミー追加(item_categoryはタクソノミーのslug)
}
add_action('init', 'item_custom_post_type');
個別ページを404にしたい時に下記を記述する。上記コードの「'public' => false」と併用を推奨。
add_filter( '[slug]_rewrite_rules', '__return_empty_array' );//[slug]はカスタム投稿タイプのスラッグに書き換える
出力方法
メインループとサブループの2パターンを載せておきます。
メインループ
<div>
<?php
if ( have_posts() ):
while ( have_posts() ):the_post();
$category = get_the_terms($post->ID, 'item_category');//記事のitem_categoryのタームを取得
?>
<h2><?php the_title(); ?></h2>
<p><?php echo $category[0]->name ?></p>//ターム名表示 複数ある場合はループすれば良い
<?php endwhile; endif; ?>
</div>
サブループ
<div>
<?php
$args = array(
'post_type' => 'item',//カスタム投稿タイプ名
'posts_per_page' => -1//表示投稿数(-1は全て)
);
$the_query = get_posts( $args );
if ( $the_query ):
foreach ( $the_query as $post ): setup_postdata( $post );
$item_category = get_the_terms($post->ID, 'item_category');//記事のitem_memberのタームを取得
?>
<h2><?php the_title() ?></h2>
<p><?php echo $item_category[0]->name; ?></p>//ターム名を表示
<?php
endforeach;
wp_reset_postdata();
endif;
?>
</div>
サブループは$argsで色々制限できるので、自由度が高い。