カスタム投稿タイプで作成した記事を一覧表示させるためのページの作成の仕方は、「CPT ULで作成したスラッグのカテゴリーページを作る方法」で紹介しました。
今度は、そのページのページに、記事一覧を表示させるための方法を紹介します。
前提として今回の内容は弊社のメモ代わりであり、ある程度のカスタム投稿タイプの知識がなければ難しい内容かもしれないことをご了承ください。
したいことと仕様
まず実現したい内容は以下のようなものです。
∟https://abc.com/news/(カテゴリー)
∟https://abc.com/news/post-1/(投稿ページ)
∟https://abc.com/news/post-2/(投稿ページ)
∟https://abc.com/news/post-3/(投稿ページ)
このような階層になっています。
つまり「https://abc.com/news/」はカテゴリーページとなっておりアクセスすると「https://abc.com/news/post-1/」「https://abc.com/news/post-2/」「https://abc.com/news/post-3/」が一覧で表示されるようにするということです。
ただ表示一覧表示されるだけでは味気ないので、3列ボックスにして表示させます。
仕様
- 「お知らせ」(news)というカスタム投稿タイプを作成
- 一覧表示は3列横ボックスで表示させる
- All in One SEOを使用しておりディスクリプションはそこから取得している
カテゴリーページと投稿ページを作成する
今回の場合、カスタム投稿タイプのページを既存のテンプレートとは独立させるものとします。つまり既存のテンプレートとは違ったデザインにするということです。
そのためには専用のカテゴリーテンプレートと投稿ページのテンプレートを作成しなければなりません。
CPTUIの設定
今回はCPTUIの設定は以下のようになっています。
タクソノミースラッグ・・・news
※投稿タイプの設定の「アーカイブあり」は「True」
※タクソノミーの設定では「階層」を「True」
ここまでの状態で管理画面に「お知らせ」という項目が追加されています。
テンプレートを作成
次に「archive-news.php」と「single-news.php」を作成し、サーバーからテンプレートの入っている場所にアップしてください。
ちなみにカスタム投稿タイプを反映させるためには、カテゴリーページを作るなら「archive-news.php」というテンプレートを作成します。投稿ページを作るなら「single-news.php」を作成します。
「archive-news.php」や「single-news.php」は、もしサイトでテンプレートを使っているのなら、既存のテンプレートの内容をコピーし、名前を変更してサーバーにアップしてください。
今回はスラッグを「news」としたから「archive-news.php」と「single-news.php」となっています。
もしスラッグを「aaaabbbbcccc」とするならば「archive-aaaabbbbcccc.php」と「single-aaaabbbbcccc.php」というテンプレートを作成しサーバーにアップすることになります。
そこで使用するのが以下のタグです。
archive-news.phpの中身 タグ
以下のタグがarchive-news.phpで記事を一覧表示させる部分です。
一覧表示をさせたい場所に記述してください。
<?php if ( have_posts() ) : ?>
<div class="posts-grid">
<?php while ( have_posts() ) : the_post(); ?>
<div class="post-item">
<a href="<?php the_permalink(); ?>">
<?php if ( has_post_thumbnail() ) : ?>
<div class="post-thumbnail">
<?php the_post_thumbnail(); ?>
</div>
<?php endif; ?>
<h3 class="post-title"><?php the_title(); ?></h3>
</a>
<p class="post-description">
<?php
// 'All in One SEO' ディスクリプションを取得
$aioseo_description = get_post_meta(get_the_ID(), '_aioseo_description', true);
if ( !empty($aioseo_description) ) {
// ディスクリプションが設定されていれば表示(100文字で切り詰め)
echo esc_html(mb_strimwidth($aioseo_description, 0, 100, '…'));
} else {
// ディスクリプションがなければ抜粋を表示(100文字で切り詰め)
echo esc_html(mb_strimwidth(get_the_excerpt(), 0, 100, '…'));
}
?>
</p>
</div>
<?php endwhile; ?>
</div>
<?php else : ?>
<p>記事が見つかりませんでした。</p>
<?php endif; ?>
記事がループ表示されます。
archive-news.phpの中身 CSS
そしてCSSは以下です。
<style>
/* コンテナとグリッドシステムのスタイル */
.posts-grid {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
margin: -10px;
}
/* 各投稿アイテムのスタイリング */
.posts-grid .post-item {
width: calc(33.333% – 20px);
margin: 10px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
overflow: hidden;
display: flex;
flex-direction: column;
background-color: #fff;
}
/* サムネイルのコンテナ */
.post-thumbnail {
display: flex;
justify-content: center;
align-items: center;
height: 170px;
width: 100%;
}
/* サムネイル画像とデフォルト画像のスタイリング */
.posts-grid .post-item .post-thumbnail img,
.posts-grid .post-item .post-thumbnail .custom-thumbnail {
height: 170px;
width: 100%;
object-fit: cover;
object-position: center;
}
/* 投稿タイトルのスタイリング */
.posts-grid .post-item .post-title {
padding: 0px;
font-size: 15px;
margin: 10px;
font-weight:bold;
color: #333;
}
/* 投稿の概要部分 */
.post-description {
padding: 0 15px 15px; /* 概要のパディング */
font-size: 14px; /* 概要のフォントサイズ */
color: #666; /* 概要の文字色 */
overflow: hidden; /* 内容がはみ出た場合に非表示に */
text-overflow: ellipsis; /* テキストがオーバーフローしたときに省略記号を表示 */
}
@media (max-width: 1000px) {
.posts-grid .post-item {
width: calc(50% – 20px); /* 2列表示にする */
}
}
</style>
ここまでで基本設定は完了です。
管理画面の「お知らせ」から記事を新規投稿すると、「single-news.php」をテンプレートとして記事が反映されます。
そして記事一覧は「archive-news.php」に表示されるようになります。
完全に弊社専用のメモとなっているため、言葉足らずの部分があるとは思います。ご了承ください。需要が高いようであれば記事をリライトしもっと詳しくしたいと思います。