概要と目標
オリジナルの投稿タイプと、
オリジナルの分類を作ろう。
ブログとは別に、オリジナルの投稿タイプを作れる、カスタム投稿タイプや、
オリジナルの分類を作るカスタムタクソノミーの作成方法を学習しよう。
ブログとは別に、オリジナルの投稿タイプを作れる、カスタム投稿タイプや、
オリジナルの分類を作るカスタムタクソノミーの作成方法を学習しよう。
カスタム投稿とは、投稿とは別にオリジナルの投稿タイプを作れる仕組み。
プラグインを使って作る方法もあるが、今回は「functions.php」を使って、
「works」という制作実績を投稿する、カスタム投稿タイプを作成しよう。
カスタム投稿タイプを作成するには、プラグインを使う方法もあるが、
functions.phpで、register_post_type()という関数を使って作成し、「init」というアクションでフックさせる。
register_post_type関数 ・・・ 投稿タイプを作成または変更する関数register_post_type(投稿タイプ名, 投稿タイプの設定の配列)
省略可
引数の詳細はWordPress Codex 日本語版を参照
| 設定名 | 説明 | 初期値 |
|---|---|---|
label |
投稿タイプを翻訳するための複数形の名前 | 投稿タイプ名 |
labels |
管理画面などに表示されるラベルの配列
|
'label' の値が 'name' へセットされる |
description |
投稿タイプの簡単な説明 | 空 |
public |
投稿タイプを公開するかどうか ( true:公開 / false:公開しない)
|
false |
exclude_from_search |
検索結果から除外するか ( true:除外 / false:除外しない)
|
public の反対 |
publicly_queryable |
post_type クエリが実行可能(投稿の一覧表示など) かどうか ( true:可能 / false:不可能)
|
public の値 |
show_ui |
投稿を管理する画面にデフォルトのUIを利用するかどうか ( true:使う / false:使わない)
|
public の値 |
show_in_nav_menus |
ナビゲーションメニューでこの投稿タイプが選択可能かどうか ( true:可能 / false:不可能)
|
public の値 |
show_in_menu |
管理画面にこの投稿タイプを表示するかどうか 表示する場合 show_ui が true でなければならない( true:表示 / false:表示しない)
|
show_ui の値 |
show_in_admin_bar |
この投稿タイプを WordPress の管理バーから使えるようにするかどうか ( true:使える / false:使えない)
|
show_in_menu の値 |
menu_position |
この投稿タイプが表示されるメニューの位置 表示するには show_in_menu が true でなければならない。
|
コメントの下 |
menu_icon |
このメニューで使用するアイコンの URL、または Dashicons のアイコンの名前。 | 投稿アイコン |
capability_type |
投稿の権限
|
post |
hierarchical |
この投稿タイプが階層を持つ(固定ページのようにする) かどうかtrue にする場合は、次の 'supports' で、'page-attributes' を含めなければ、親を選択できない。( true:階層を持つ / false:階層を持たない)
|
false |
supports |
投稿タイプでサポートされる機能の配列
|
'title'と'editor' |
taxonomies |
この投稿タイプで使用する、登録されたタクソノミー(category や post_tag など)の配列タクソノミー(カスタム分類)は register_taxonomy() で登録する必要がある
|
なし |
has_archive |
この投稿タイプのアーカイブを有効にするかどうか (デフォルトのスラッグ名は ポストタイプ名) ( true:有効 / false無効
|
false |
rewrite |
この投稿タイプのパーマリンクのリライト方法を変更する配列
|
投稿タイプ名 |
show_in_rest |
Gutenbergを有効化するかどうかtrue にする場合は、次の 'supports' で、'editor' を含めなければ表示されない( true:有効 / false:無効)
|
false |
register_post_type()のサンプルfunction my_theme_post_type_init() {
$labels = [
'name' => 'ニュース', // 投稿タイプの名前 (初期値: 投稿タイプ名)
'singular_name' => 'ニュース', // この投稿タイプの1投稿の名前 (初期値: 'name' の値)
'menu_name' => 'ニュース', // メニューのテキスト (初期値: 'name' の値)
'name_admin_bar' => 'ニュース', // 管理バーの「新規追加」の名前 初期値: 'singular_name' なければ 'name'の値
'all_items' => 'ニュース一覧', // 一覧表示のメニューに使うテキスト (初期値: 'name' の値)
'add_new' => 'ニュースを追加', // 「新規追加」のテキスト (日本語時の初期値: '新規追加')
'add_new_item' => '新規ニュースを追加', // 「新規○○を追加」のテキスト (日本語時の初期値: '新規投稿を追加' または '新規ページを追加')
'edit_item' => 'ニュースを編集', // 「〜を編集」のテキスト(日本語時の初期値: '投稿の編集' または 'ページの編集')
'new_item' => '新規ニュース', // 「新規〜」のテキスト (日本語時の初期値: '新規投稿' または '新規ページ')
'view_item' => 'ニュースを表示', // 管理バーの「〜を表示」のテキスト (日本語時の初期値: '投稿を表示' または 'ページを表示')
'search_items' => 'ニュースを検索', // 「〜を検索」のテキスト (日本語時の初期値: '投稿を検索' または 'ページを検索')
'not_found' => 'ニュースが見つかりませんでした', // 「〜が見つかりませんでした」のテキスト (日本語時の初期値: '投稿が見つかりませんでした' または 'ページが見つかりませんでした')
'not_found_in_trash' => 'ゴミ箱内にニュースが見つかりませんでした', // 「ゴミ箱内に〜が見つかりませんでした」のテキスト (日本語時の初期値: 'ゴミ箱内に投稿が見つかりませんでした' または 'ゴミ箱内にページが見つかりませんでした')
'parent_item_colon' => '親のニュース', // 「親〜:」のテキスト (日本語時の初期値: '親ページ')
];
$args = [
'labels' => $labels,
'discription' => 'ニュースの投稿', // 投稿タイプの簡単な説明 (初期値: 空)
'public' => true, // 投稿タイプを公開するかどうか (初期値: false)
'exclude_from_search' => false, // 検索結果から除外するか (初期値: public の反対)
'publicly_queryable' => true, // post_type クエリが実行可能(投稿の一覧表示など) かどうか (初期値: public の値)
'show_ui' => true, // 投稿を管理する画面にデフォルトのUIを利用するかどうか (初期値: public の値)
'show_in_nav_menus' => true, // ナビゲーションメニューでこの投稿タイプが選択可能かどうか (初期値: public の値)
'show_in_menu' => true, // 管理画面にこの投稿タイプを表示するかどうか (初期値: public の値)
'show_in_admin_bar' => true, // この投稿タイプを WordPress の管理バーから使えるようにするかどうか (初期値: public の値)
'menu_position' => 5,// この投稿タイプが表示されるメニューの位置 (初期値: コメントの下)
'menu_icon' => 'dashicons-admin-customizer',// このメニューで使用するアイコンの URL、または Dashicons のアイコンの名前 (初期値: 投稿アイコン)
'capability_type' => 'post',// 投稿の権限 (初期値: post)
'hierarchical' => false, // この投稿タイプが階層を持つ(固定ページのようにする) かどうか (初期値: false)
'supports' => [ // 投稿タイプでサポートされる機能の配列 (初期値: 'title'と'editor')
'title', // タイトル
'editor', // 内容の編集
'author', // 作成者
'thumbnail', // アイキャッチ画像
'excerpt', // 抜粋
'trackbacks', // トラックバック送信
'custom-fields', // カスタムフィールド
'comments', // コメント
'revisions', // リビジョン
'page-attributes', // メニューの順序
'post-formats', // 投稿フォーマット
],
'taxonomies' => [ // 投稿タイプで使用する、登録されたタクソノミー (初期値: なし)
'category', // カテゴリー
'post_tag', // タグ
],
'has_archive' => true, // アーカイブを有効にするかどうか (初期値: false)
'rewrite' => [ // パーマリンク設定 (初期値: true(ポストタイプ名をスラッグに使う))
'slug' => 'information', // スラッグ名の変更
'with_front' => false, // パーマリンク構造を手前につけるかどうか
],
'show_in_rest' => true, // Gutenbergを有効化するかどうか (初期値: false)
];
register_post_type('news',$args);
}
add_action('init', 'my_theme_post_type_init');
/*======================================
カスタム投稿タイプ
======================================*/
function dummy_post_type_init() {
$labels = [
'name' => '制作実績',
'all_items' => '制作実績一覧',
];
$args = [
'labels' => $labels,
'discription' => '制作実績の紹介',
'public' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-desktop',
'supports' => [
'title',
'editor',
'thumbnail',
'custom-fields',
],
'has_archive' => true,
'query_var' => true,
'show_in_rest' => true,
];
register_post_type('works',$args);
}
add_action('init', 'dummy_post_type_init');
| 項目 | 内容 |
|---|---|
| タイトル | Dummy Coding Factory |
| 内容 |
架空のWebサイト制作の会社、Dummy Coding Factory様のWebサイトを制作させて頂きました サイトのコンセプト ちょっと昔のホームページをイメージして作りました。 でも、ここにはHTML + CSSで間違えやすそうなポイントがいくつも隠れています。 ターゲットユーザー このサイトのターゲットユーザーは、HTMLとCSSを習得したばかりの方をターゲットにしました。 |
| アイキャッチ画像 | 「material」フォルダ内の「dummy-coding-factory.png」 |
| パーマリンク | 「dummy-coding-factory」 |
カスタム投稿タイプの個別ページは、現在「single.php」で出力している。
もし、カスタム投稿タイプ用の個別ページテンプレートを作りたい場合は、
「single-投稿タイプ名.php」というファイルを作ればよい。
<?php get_header(); ?>
<main class="l-main -single">
<div class="l-contents -themeWhite">
<div class="p-article">
</div>
<!-- /.l-contents -->
</main>
<?php get_footer(); ?>
<?php get_header(); ?>
<?php while ( have_posts() ) : the_post(); ?>
<main class="l-main -single">
<div class="l-contents -themeWhite">
<div class="p-article">
</div>
<!-- /.l-contents -->
</main>
<?php endwhile; ?>
<?php get_footer(); ?>
<div class="l-container -slim">
<header class="p-article__header">
<h1 class="p-article__title -detail -center"><?php the_title(); ?></h1>
<?php if ( has_post_thumbnail()) : ?>
<figure class="p-article__eyecatch">
<?php the_post_thumbnail(); ?>
</figure>
<?php endif; ?>
<dl class="p-article__metaList">
<dt>作成日</dt>
<dd>
<time datetime="<?php the_time( DATE_W3C ); ?>" class="p-article__time">
<?php the_time( get_option( 'date_format' ) ); ?>
</time>
</dd>
<dt>作品のタイプ</dt>
<dd>
<ul class="post-categories -inList">
<li><a href="#">作品タイプ名</a></li>
<li><a href="#">作品タイプ名</a></li>
</ul>
</dd>
<dt>作業内容</dt>
<dd>
<ul class="post-categories -inList">
<li><a href="#">作業名</a></li>
<li><a href="#">作業名</a></li>
</ul>
</dd>
</dl>
</header>
<section class="p-article__body">
<?php the_content(); ?>
</section>
</div>
<!-- /.l-container -->
カスタム投稿タイプのアーカイブページは、とくにスラッグ名をしていない場合は、
サイトURLの後ろにスラッグ名を指定すると表示される。
その際のテンプレートは、「archive.php」が使われる。
もし、投稿タイプ専用のアーカイブページテンプレートを作成する場合は、
「archive-投稿タイプ名.php」というファイルを作る。
基本的には「archive.php」と同じテンプレートタグで作成できるが、
カスタム投稿タイプ名は、「post_type_archive_title()」という関数を使うと表示できる。
post_type_archive_title関数 ・・・ 検索クエリを表示する関数post_type_archive_title(タイトルの前に表示する文字, 表示するかどうか)
省略可
引数の詳細はWordPress Codex 日本語版を参照
<?php get_header(); ?>
<main class="l-main -single">
<header class="p-hero">
<h1 class="p-hero__title">投稿タイプのタイトル</h1>
</header>
</section>
<!-- /.l-contents -->
</main>
<?php get_footer(); ?>
<section class="l-contents">
<div class="l-container">
<?php if ( have_posts() ) :?>
<div class="c-grid -gutter">
<?php while( have_posts() ) : the_post(); ?>
<article class="c-grid__item -tab4Of12 -lap3Of12">
<a href="" class="c-card p-project">
<div class="c-card__body">
<h2 class="p-project__title">制作実績のタイトル</h2>
<p class="p-project__text">
制作実績の抜粋文
</p>
<!-- /.p-project__text -->
</div>
<!-- /.c-card__body -->
<figure class="c-card__thumbnail">
<img src="assets/images/no-picture_single.png" alt="">
</figure>
<!-- /.c-card__thumbnail -->
</a>
</article>
<?php endwhile; ?>
</div>
<!-- /.c-grid -->
<nav class="navigation pagination" role="navigation">
<h2 class="screen-reader-text">投稿ナビゲーション</h2>
<div class="nav-links">
<a class="prev page-numbers" href="#"><span class="screen-reader-text">前へ</span></a>
<span aria-current="page" class="page-numbers current">1</span>
<a class="page-numbers" href="#">2</a>
<a class="next page-numbers" href="#"><span class="screen-reader-text">次へ</span></a>
</div>
</nav>
<?php else : ?>
<p>投稿がありません。</p>
<?php endif; ?>
</div>
<!-- /.l-container -->
</section>
<!-- /.l-contents -->
post_type_archive_title()」に置き換える<header class="p-hero">
<h1 class="p-hero__title"><?php post_type_archive_title(); ?></h1>
</header>
<article class="c-grid__item -tab4Of12 -lap3Of12">
<a href="<?php the_permalink(); ?>" class="c-card p-project">
<div class="c-card__body">
<h2 class="p-project__title"><?php the_title(); ?></h2>
<p class="p-project__text">
<?php the_excerpt(); ?>
</p>
<!-- /.p-project__text -->
</div>
<!-- /.c-card__body -->
<figure class="c-card__thumbnail">
<?php if ( has_post_thumbnail() ) : ?>
<?php the_post_thumbnail() ?>
<?php else : ?>
<img src="<?php echo esc_url(get_theme_file_uri()); ?>/assets/images/no-picture_single.png" srcset="<?php echo esc_url(get_theme_file_uri()); ?>/assets/images/no-picture_single.png, <?php echo esc_url(get_theme_file_uri()); ?>/assets/images/no-picture_single@2x.png 2x" alt="アイキャッチ画像はありません">
<?php endif; ?>
</figure>
<!-- /.c-card__thumbnail -->
</a>
</article>
</div>
<!-- /.c-grid -->
<?php
// ページネーション
$args = [
'prev_text' => '<span class="screen-reader-text">前へ</span>',
'next_text' => '<span class="screen-reader-text">次へ</span>'
];
the_posts_pagination( $args );
?>
<?php else : ?>
<p>投稿がありません。</p>
<?php endif; ?>
「the_excerpt()」は、デフォルトでは、110文字表示される。
(WP Multibyte Patchを有効化した場合)
また、その文字数以上ある場合は、「[...]」として省略される。
これらを変更する場合は、「functions.php」で、「excerpt_length」フィルターや、「excerpt_more」を使用することで変更できる。
excerpt_lengthや、excerpt_moreを使って、抜粋文を調整する
/*======================================
抜粋文を調整
======================================*/
/*
文字数の変更
----------------------------------- */
function dummy_excerpt_length( $length ) {
return 32;
}
add_filter( 'excerpt_length', 'dummy_excerpt_length', 999 );
/*
省略時の文字変更
----------------------------------- */
function dummy_excerpt_more($more) {
return '...';
}
add_filter('excerpt_more', 'dummy_excerpt_more');
タクソノミーとは、「カテゴリ」や「タグ」のような投稿を分類する仕組みのこと。
カスタムタクソノミーを作る場合は、「functions.php」にregister_taxonomy()という関数で作成し、register_post_type()と同様で、init のアクションでフックさせる。
なお、作ったタクソノミーをカスタム投稿タイプに使う際は、register_post_type() の設定の 'taxonomies' に 登録したタクソノミー名を追加しておくこと。
ちなみに、タクソノミーに登録される、各カテゴリー名や各タグ名のことを「ターム」という。
register_taxonomy関数 ・・・ 検索クエリを表示する関数register_taxonomy(タクソノミー名, 関連付ける投稿タイプ名, タクソノミーの設定の配列)
省略可
引数の詳細はWordPress Codex 日本語版を参照
| 設定名 | 説明 | 初期値 |
|---|---|---|
label |
タクソノミーを翻訳するための複数形の名前 | タクソノミー名 |
labels |
管理画面などに表示されるラベルの配列
|
'label' の値が 'name' へセットされる |
description |
タクソノミーの簡単な説明 | 空 |
public |
タクソノミーを公開するかどうか ( true:公開 / false:公開しない)
|
true |
show_ui |
タクソノミーを管理する画面にデフォルトのUIを利用するかどうか ( true:使う / false:使わない)
|
public の値 |
show_in_nav_menus |
ナビゲーションメニューでこのタクソノミーが選択可能かどうか ( true:可能 / false:不可能)
|
public の値 |
show_tagcloud |
タグクラウドのウィジェットがこのタクソノミーを使うかどうか ( true:使う / false:使わない)
|
show_ui の値 |
show_in_quick_edit |
直接編集画面で、カスタム分類を表示するかどうか ( true:表示 / false:表示しない)
|
show_ui の値 |
meta_box_cb |
メタボックスを表示するためのコールバック関数 (投稿画面でのターム追加のメタボックス) |
null |
show_admin_column |
関連付けられた投稿タイプのテーブルにタクソノミーのカラムを自動生成するかどうか ( true:する / false:しない)
|
false |
hierarchical |
このタクソノミーが階層を持つ(カテゴリーのようにする) かどうか ( true:階層を持つ / false:階層を持たない)
|
false |
capabilities |
タクソノミーの権限
|
なし |
rewrite |
パーマリンクのリライト方法を変更する配列
|
true |
sort |
タクソノミーのタームがオブジェクトへ付けられた順序を記憶するかどうか ( true:する / false:しない)
|
なし |
show_in_rest |
Gutenbergを有効化するかどうか ( true:有効 / false:無効)
|
なし |
register_taxonomy()のサンプルfunction my_taxonomies_init() {
$labels = [
'name' => 'ジャンル', // タクソノミーの名前 (初期値: タクソノミー名)
'singular_name' => 'ジャンル', // このタクソノミーの1投稿の名前 (初期値: 'name' の値)
'menu_name' => 'ジャンル', // メニューのテキスト (初期値: 'name' の値)
'all_items' => '全てのジャンル', // 「すべての〜」のテキスト
'edit_item' => 'ジャンルを編集', // 「〜を編集」のテキスト
'view_item' => 'ジャンルを表示', // 「〜を表示」のテキスト
'update_item' => 'ジャンルを更新', // 「〜を更新」のテキスト
'add_new_item' => '新しいジャンルを追加', // 「新しい〜を追加」のテキスト
'new_item_name' => '新しいジャンルの名前', // 「新しい〜の名前」のテキスト
'parent_item' => '親のジャンル', // 「親〜」のテキスト
'parent_item_colon' => '親のジャンル:', // 「親〜:」のテキスト
'search_items' => 'ジャンルを検索', // 「〜を検索」のテキスト
'popular_items' => '人気のジャンル', // 「人気の〜」のテキスト
'separate_items_with_commas' => 'ジャンルをコンマで区切ってください', // 「〜をコンマで区切ってください」のテキスト
'not_found' => 'ジャンルが見つかりませんでした', // 「〜が見つかりませんでした」のテキスト
];
$args = [
'labels' => $labels,
'discription' => 'ジャンルの分類', // タクソノミーの簡単な説明 (初期値: 空)
'public' => true, // タクソノミーを公開するかどうか (初期値: true)
'show_ui' => true, // タクソノミーを管理する画面にデフォルトのUIを利用するかどうか (初期値: public の値)
'show_in_nav_menus' => true, // ナタクソノミーを管理する画面にデフォルトのUIを利用するかどうか(初期値: public の値)
'show_tagcloud' => true, // タグクラウドのウィジェットがこのタクソノミーを使うかどうか (初期値: show_ui の値)
'show_in_quick_edit' => true, // 直接編集画面で、カスタム分類を表示するかどうか (初期値: show_ui の値)
'meta_box_cb' => null,// メタボックスを表示するためのコールバック関数 (初期値: null)
'show_admin_column' => true,// 関連付けられた投稿タイプのテーブルにタクソノミーのカラムを自動生成するかどうか (初期値: false)
'hierarchical' => false, // このタクソノミーが階層を持つ(カテゴリーのようにする) かどうか (初期値: false)
'capabilities' => [ // タクソノミーの権限(初期値: なし)
'manage_terms',
],
'rewrite' => [ // パーマリンク設定 (初期値: true)
'slug' => 'genre', // スラッグ名の変更
'with_front' => false, // パーマリンク構造を手前につけるかどうか
],
'sort' => false, // タクソノミーのタームがオブジェクトへ付けられた順序を記憶するかどうか (初期値: false)
'show_in_rest' => true // Gutenbergを有効化するかどうか (初期値: false)
];
register_taxonomy('genre', 'works', $args);
}
add_action('init', 'my_taxonomies_init');
/*======================================
カスタム投稿タイプ & カスタムタクソノミー
======================================*/
function dummy_post_type_init() {
/*
カスタム投稿タイプ(制作実績)
----------------------------------- */
$labels = [
'name' => '制作実績',
'all_items' => '制作実績一覧',
];
$args = [
'labels' => $labels,
'discription' => '制作実績の紹介',
'public' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-desktop',
'supports' => [
'title',
'editor',
'thumbnail',
'custom-fields',
],
'has_archive' => true,
'query_var' => true,
'show_in_rest' => true,
];
register_post_type('works',$args);
/*
カスタムタクソノミー(作品のタイプ)
----------------------------------- */
$labels = [
'name' => '作品のタイプ',
'add_new_item' => '新しい作品のタイプを追加',
];
$args = [
'labels' => $labels,
'discription' => '作品の種類を分類するタクソノミー',
'show_admin_column' => true,
'hierarchical' => true,
'show_in_rest' => true
];
register_taxonomy('work_type', 'works', $args);
}
add_action('init', 'dummy_post_type_init');
register_post_type() の taxonomies に、/*======================================
カスタム投稿タイプ & カスタムタクソノミー
======================================*/
function dummy_post_type_init() {
/*
カスタム投稿タイプ(制作実績)
----------------------------------- */
$labels = [
'name' => '制作実績',
'all_items' => '制作実績一覧',
];
$args = [
'labels' => $labels,
'discription' => '制作実績の紹介',
'public' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-desktop',
'supports' => [
'title',
'editor',
'thumbnail',
'custom-fields',
],
'has_archive' => true,
'query_var' => true,
'show_in_rest' => true,
'taxonomies' => [
'work_type',
],
];
register_post_type('works',$args);
/*
カスタムタクソノミー(作品のタイプ)
----------------------------------- */
$labels = [
'name' => '作品のタイプ',
'add_new_item' => '新しい作品のタイプを追加',
];
$args = [
'labels' => $labels,
'discription' => '作品の種類を分類するタクソノミー',
'show_admin_column' => true,
'hierarchical' => true,
'show_in_rest' => true
];
register_taxonomy('work_type', 'works', $args);
}
add_action('init', 'dummy_post_type_init');
| 名前 | スラッグ | Webサイト | web-site |
|---|
作成したカスタムタクソノミーは、the_category() や the_tags() などでは表示できない。
投稿に紐づくタームを取得するには、get_the_terms()を使って、
タクソノミーの情報を配列 (オブジェクト)で取得してループで表示する。
get_the_terms関数 ・・・ 投稿に割り当てられたタクソノミーのターム(カスタム分類の項目)を取得する関数get_the_terms(投稿ID, タクソノミー名)
戻り値: 成功するとタームのオブジェクトの配列を返す
投稿にタームが付いていなければ false
無効なタクソノミーが指定されると WP_Error オブジェクトを返す
引数の詳細はWordPress Codex 日本語版を参照
<dt>作品のタイプ</dt>
<dd>
<?php
$terms = get_the_terms($post->ID, 'work_type');
echo '<pre>';
print_r($terms);
echo '</pre>';
?>
<ul class="post-categories -inList">
<li><a href="#">作品タイプ名</a></li>
<li><a href="#">作品タイプ名</a></li>
</ul>
</dd>
タームが取得できいることが確認できたら、その配列を foreach文を使ってループすればよい。
タームのアーカイブページへのURLは、get_term_link()で取得できる。
get_term_link関数 ・・・ 投稿に割り当てられたタクソノミーのターム(カスタム分類の項目)を取得する関数get_term_link(タームのオブジェクト, タクソノミー名)
戻り値: 成功するとタームのアーカイブページへのパーマリンク
タームが存在しなければ WP_Error オブジェクトを返す
引数の詳細はWordPress Codex 日本語版を参照
print_r()の部分をコメントまたは、削除する
if文で、タームが存在しているかと、is_wp_error()(true:エラーあり / false:エラーなし)を使ってWP_Error が出ていないかを確認
<dt>作品のタイプ</dt>
<dd>
<?php
$terms = get_the_terms($post->ID, 'work_type');
// echo '<pre>';
// print_r($terms);
// echo '</pre>';
?>
<?php if( $terms && !is_wp_error($terms) ) : ?>
<ul class="post-categories -inList">
<li><a href="#">作品タイプ名</a></li>
<li><a href="#">作品タイプ名</a></li>
</ul>
<?php endif; ?>
</dd>
foreach文で、タームがある限り、リストを生成する
<dt>作品のタイプ</dt>
<dd>
<?php
$terms = get_the_terms($post->ID, 'work_type');
// echo '<pre>';
// print_r($terms);
// echo '</pre>';
?>
<?php if( $terms && !is_wp_error($terms) ) : ?>
<ul class="post-categories -inList">
<?php foreach($terms as $term) : ?>
<li><a href="#">作品タイプ名</a></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</dd>
<dt>作品のタイプ</dt>
<dd>
<?php
$terms = get_the_terms($post->ID, 'work_type');
// echo '<pre>';
// print_r($terms);
// echo '</pre>';
?>
<?php if( $terms && !is_wp_error($terms) ) : ?>
<ul class="post-categories -inList">
<?php foreach($terms as $term) : ?>
<li><a href="<?php echo esc_url( get_term_link($term, $term->taxonomy) ); ?>"><?php echo esc_html($term->name); ?></a></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</dd>
single_term_title()というテンプレートタグで表示できる。
したがって、今回の場合だと「arhive-works.php」をコピーし、名前を「taxonomy.php」に変更、h1要素を、single_term_title()に変更すればいい感じになる。
完成例を参考にコンテンツのテンプレート化をしたり、
カスタムタクソノミーを作成して下さい。
| 項目 | 内容 |
|---|---|
| テンプレートパーツの範囲 | 「archive-works.php」の article要素 |
| テンプレートパーツのファイル名 | 「content-works」 |
| テンプレートパーツのファイルの保存場所 | 「template-parts」フォルダ内 |
| 項目 | 設定値 |
|---|---|
| タクソノミー名 | work_contents |
| 管理画面に表示するタクソノミーの名前 | 作業内容 |
| ターム登録画面の見出し | 新しい作業内容を追加 |
| タクソノミーの説明 | 作業内容を分類するタクソノミー |
| ターム一覧画面のテーブルに表示するかどうか | する |
| Gutenbergで有効化するかどうか | する |
| 項目 | 設定値 |
|---|---|
| 該当ファイル | 「single-works.php」 |
| 表示場所 | 文字列「作業内容」の下にある、リストを置き換える |
<article class="c-grid__item -tab4Of12 -lap3Of12">
<a href="<?php the_permalink(); ?>" class="c-card p-project">
<div class="c-card__body">
<h2 class="p-project__title"><?php the_title(); ?></h2>
<p class="p-project__text">
<?php the_excerpt(); ?>
</p>
<!-- /.p-project__text -->
</div>
<!-- /.c-card__body -->
<figure class="c-card__thumbnail">
<?php if ( has_post_thumbnail() ) : ?>
<?php the_post_thumbnail() ?>
<?php else : ?>
<img src="<?php echo esc_url(get_theme_file_uri()); ?>/assets/images/no-picture_single.png" srcset="<?php echo esc_url(get_theme_file_uri()); ?>/assets/images/no-picture_single.png, <?php echo esc_url(get_theme_file_uri()); ?>/assets/images/no-picture_single@2x.png 2x" alt="アイキャッチ画像はありません">
<?php endif; ?>
</figure>
<!-- /.c-card__thumbnail -->
</a>
</article>
<div class="c-grid -gutter">
<?php while( have_posts() ) : the_post(); ?>
<?php get_template_part('template-parts/content', 'works'); ?>
<?php endwhile; ?>
</div>
<!-- /.c-grid -->
/*======================================
カスタム投稿タイプ & カスタムタクソノミー
======================================*/
function dummy_post_type_init() {
/*
カスタム投稿タイプ(制作実績)
----------------------------------- */
$labels = [
'name' => '制作実績',
'all_items' => '制作実績一覧',
];
$args = [
'labels' => $labels,
'discription' => '制作実績の紹介',
'public' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-desktop',
'supports' => [
'title',
'editor',
'thumbnail',
'custom-fields',
],
'has_archive' => true,
'query_var' => true,
'show_in_rest' => true,
'taxonomies' => [
'work_type',
'work_contents',
],
];
register_post_type('works',$args);
/*
カスタムタクソノミー(作品のタイプ)
----------------------------------- */
$labels = [
'name' => '作品のタイプ',
'add_new_item' => '新しい作品のタイプを追加',
];
$args = [
'labels' => $labels,
'discription' => '作品の種類を分類するタクソノミー',
'show_admin_column' => true,
'hierarchical' => true,
'show_in_rest' => true
];
register_taxonomy('work_type', 'works', $args);
/*
カスタムタクソノミー(作業)
----------------------------------- */
$labels = [
'name' => '作業内容',
'add_new_item' => '新しい作業内容を追加',
];
$args = [
'labels' => $labels,
'discription' => '作業内容を分類するタクソノミー',
'show_admin_column' => true,
'show_in_rest' => true
];
register_taxonomy('work_contents', 'works', $args);
}
add_action('init', 'dummy_post_type_init');
<dt>作業内容</dt>
<dd>
<?php $terms = get_the_terms($post->ID, 'work_contents'); ?>
<?php if( $terms && !is_wp_error($terms)) : ?>
<ul class="post-categories -inList">
<?php foreach($terms as $term) : ?>
<li><a href="<?php echo esc_url( get_term_link($term, $term->taxonomy) ); ?>"><?php echo esc_html($term->name); ?></a></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</dd>
解答例は全問題のチェックボックスが on になるとご覧いただけます。
カスタム投稿タイプを使えば、更新頻度が高いものを管理画面から投稿できるようにできる。
また、カスタムタクソノミーを使って、投稿を自由に分類できる。
register_post_type()で作成するregister_taxonomy()で作成する