デイトラでプログラミング始めました

カスタム投稿、カスタムタクソノミーの登録

カスタム投稿、カスタムタクソノミーを登録する

手動で登録

// カスタム投稿、カスタムタクソノミーの追加
add_action('init', function () {
  // カスタム投稿タイプの登録
  register_post_type('item', [
    'label' => '商品',
    'public' => true,
    'menu_icon' => 'dashicons-store',
    //supportsはアイキャッチ画像、やタイトルなど投稿画面の右側
    'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments', 'page-attributes'),
    'has_archive' => true,
    'hierarchical' => true,
    //新エディタにするために必ず必要
    'show_in_rest' => true
  ]);

  register_taxonomy('genre', 'item', [
    // カスタムタクソノミーの追加、'genre'→追加するタクソノミー名前、'item'→タクソノミーを追加したいpost_typeの名前
    'label' => '商品ジャンル',
    //カテゴリは階層があるのでtrue,タグはfalse
    'hierarchical' => true,
    //新エディタにするために必ず必要
    'show_in_rest' => true,
  ]);
});

プラグイン「Custom Post Type UI」を使う

term一覧 (termはここではgenre)categoryやtagなど 

WordPressにおけるterm(ターム)とは?

WordPressにおいて、term(ターム)は、分類項目を指す言葉です。より具体的には、カテゴリーやタグ、そしてカスタムタクソノミーで作成された個々の項目のことを指します。

termの例

  • カテゴリー: 「WordPress」「デザイン」「プログラミング」など、記事を大まかに分類する項目
  • タグ: 「HTML」「CSS」「JavaScript」など、記事のキーワードとなる項目
  • カスタムタクソノミー: 「商品カテゴリ」「著者」「地域」など、自由に設定できる分類項目
//呼び出したい位置
$terms = get_terms('genre');
foreach($terms as $term):
  // get_template_partは呼び出し元の変数を使えないのでincludeをつかう
  include 'content-contribution.php';
endforeach;

//content-contribution.php
<li class="common-item">
  <a class="common-link" href="<?php echo get_term_link($term); ?>">
    <div class="common-image">
    <?php 
      $image_id =get_field('event_img', $term->taxonomy. '_'. $term->term_id);
      echo wp_get_attachment_image($image_id, 'contribution');
    ?>
    </div>
    <div class="common-body">
      <p class="name"><?php echo $term->name; ?></p>
      <p class="caption"><?php echo $term->description; ?></p>
      <div class="buttonBox">
        <button type="button" class="seeDetail">MORE</button>
      </div>
    </div>
  </a>
</li>

タクソノミー一覧 termに登録してあるもの taxomy.phpを作成

タクソノミーとterm(ターム)の関係

  • タクソノミー: 分類項目の種類を指します。
  • term: 各タクソノミーに属する具体的な項目を指します。

例えば、「カテゴリー」というタクソノミーの中に、「WordPress」や「デザイン」といったtermが含まれます。

//functions.phpに登録してあるフィルタリング
//投稿ページのフィルタリングを使用する
function get_specific_posts($post_type, $taxonomy = null, $term = null, $number = -1)
{
  if (!$term):
    $terms_obj = get_terms('genre');
    $term = wp_list_pluck($terms_obj, 'slug');
  endif;

  $args = array(
    'post_type' => $post_type,
    'tax_query' => array(
      array(
        'taxonomy' => $taxonomy,
        'field' => 'slug',
        'terms' => $term,
      ),
    ),
    'posts_per_page' => $number,
  );
  $specific_posts = new WP_Query($args);
  return $specific_posts;
}

//taxonomy.php
$term = get_specific_posts('daily_contribution', 'genre', '$term', -1);
if($term->have_posts()):
  while($term->have_posts()):$term->the_post();
  get_template_part('includes/content-tax');
endwhile;
endif;

//content-tax.php
<li class="common-item">
  <a class="common-link" href="<?php the_permalink(); ?>">
    <div class="common-image">
    <?php 
      the_post_thumbnail();
    ?>
    </div>
    <div class="common-body">
      <p class="name"><?php the_title(); ?></p>
      <p class="caption"><?php echo get_the_excerpt(); ?></p>
      <div class="buttonBox">
        <button type="button" class="seeDetail">MORE</button>
      </div>
    </div>
  </a>
</li>
//メインタイトルを修正
function get_main_title() {
	if ( is_singular( 'post' ) ):
		$category_obj = get_the_category();
		return $category_obj[0]->name;
	elseif ( is_page() ):
		return get_the_title();
	elseif ( is_category() || is_tax() ):
		return single_cat_title();
	elseif ( is_search() ):
		return ' サイト内検索結果';
	elseif ( is_404() ):
		return ' ページが見つかりません';
    //カスタム投稿の時にカスタム投稿を表示
	elseif ( is_singular( 'item' ) ):
		global $post;
		$term_obj = get_the_terms( $post->ID, 'genre' );
		return $term_obj[0]->name;
	endif;
}