前回デフォルトの投稿タイプを解説したので今回はカスタム投稿タイプの解説となります。
今回疑似で作成するサイトのサイトマップはこちら
ページ名 | URL | テンプレートファイル |
---|---|---|
トップページ | / | front-page.php |
ブログ (デフォルトの投稿タイプ) | /blog/ /blog/カテゴリー名/ /blog/カテゴリー名/ブログのスラッグ/ | archive.php category.php single.php |
新着情報 (カスタム投稿タイプ) | /news/ /news/タクソノミー名/ /news/タクソノミー名/新着のスラッグ/ | archive-news.php taxonomy.php single-news.php |
会社情報 | /company/ | page-company.php |
お問い合わせ | /contact/ | page-contact.php |
プライバシーポリシー | /privacy-poricy | page.php |
新着情報をカスタム投稿タイプで作成していきます。
アーカイブページ(/news/)
archive-news.php
<h2><?php post_type_archive_title(); ?>一覧</h2>
<ul class="news-contents-list">
<?php
if (have_posts()) :
while (have_posts()) : the_post();
?>
<li>
<dl>
<dt><span class=""><?php the_time('Y-m-d'); ?></span></dt>
<?php taxonomies_label() ?>
<dd class="news-title">
<p><a href="<?php the_permalink(); ?>"><?php title_excerpt(37); ?></a></p>
</dd>
</dl>
</li>
<?php
endwhile;
endif;
?>
</ul>
<div id="pager">
<ul class="pager-contents">
<?php
page_navi();
?>
</ul>
</div>
作りはほぼ通常の投稿タイプと変わりません。見せ方が違うためHTMLはやや異なりますが今回の話の対象外なのでそれ以外の異なる点を見て行きましょう。
<?php taxonomies_label() ?>
こちらはfunction.phpに作成した自作の関数を呼び出して、カスタム投稿タイプで作ったタクソノミーのターム名をddタグにclass付きで表示させています。
詳しくはこちらの記事を参照して下さい。
<?php title_excerpt(37); ?>
こちら通常の投稿タイプでも使用した自作の関数を呼び出していて引数を37に指定することでタイトルの文字数を37文字に指定しています。
詳しくはこちらの解説を参照して下さい。
タクソノミーのアーカイブ(/news/タクソノミー名/)
taxonomy.php
<h2><?php single_term_title(); ?>一覧</h2>
<ul class="news-contents-list">
<?php
if (have_posts()) :
while (have_posts()) : the_post();
?>
<li>
<dl>
<dt><span class=""><?php the_time('Y-m-d'); ?></span></dt>
<?php taxonomies_label() ?>
<dd class="news-title">
<p><a href="<?php the_permalink(); ?>"><?php title_excerpt(37); ?></a></p>
</dd>
</dl>
</li>
<?php
endwhile;
endif;
?>
</ul>
<div id="pager">
<ul class="pager-contents">
<?php
page_navi();
?>
</ul>
</div>
タクソノミーのターム名を呼び出す
<?php single_term_title(); ?>
以外は上記アーカイブページと変わりません。
カスタム投稿ページ(/news/タクソノミー名/投稿のスラッグ/)
single-news.php
<?php
if (have_posts()) :
while (have_posts()) : the_post();
?>
<span>
<?php
$terms = get_the_terms($post->ID, 'news_cate');
$term = $terms[0];
if ($terms) {
echo '<a href="' . esc_url(get_term_link($term->term_id)) . '">' . $term->name . '</a>';
}
?>
</span>
<h1><?php the_title(); ?></h1>
<p class="date"><?php the_time('Y-m-d'); ?></p>
<div id="contents-area">
<?php the_content(); ?>
</div>
<?php
endwhile;
endif;
?>
特に難しいところはありませんが一点タクソノミーのターム名を取得してラベルとして表示している以下の箇所がややこしいですね。
<?php
$terms = get_the_terms($post->ID, 'news_cate');
$term = $terms[0];
if ($terms) {
echo '<a href="' . esc_url(get_term_link($term->term_id)) . '">' . $term->name . '</a>';
}
?>
複数のタームに属している場合を考慮して配列の一番目[0]のタームを取り出しています。
コメント