WordPressでカスタム投稿タイプの記事一覧を実際のページに表示させる1番基本のソースコード【2024年版】

今回の記事は、プラグインの「Custom Post Type UI」や「functions.php」に直接記述して作成したカスタム投稿タイプの一覧を実際のページに表示させる一番基本的なソースコードをご紹介します。

はじめに

この記事では、WordPressでカスタム投稿タイプを作成した後に、それを実際のページに記事一覧として表示させる方法について紹介します。カスタム投稿タイプは、「コラム」、「商品」、「制作実績」など、様々な用途に合わせてカスタマイズ可能です。

カスタム投稿タイプとは?

まず、カスタム投稿タイプとは何か、その基本を理解しましょう。カスタム投稿タイプは、WordPressの標準的な投稿やページとは異なり、特定の目的や形式に合わせて作成される投稿タイプです。例えば、「コラム」、「商品」、「制作実績」などを作成して欲しいと言われることが多いです。

カスタム投稿タイプの作成

まだカスタム投稿タイプを作成していないという方は下記記事が参考になります。

カスタム投稿タイプの作成ガイド

WordPressサイトコーディングで頻出のカスタム投稿タイプの作成ガイドです。本記事で紹介しているソースコードをfunctions.phpに追加することでカスタム投稿タイプをご自身のWordPressに追加することができます。

手っ取り早くソースコードだけ教えて欲しいという方は上記で紹介した記事の下記セクションで紹介しているのでジャンプしてください。

https://kk-works.koukoba.net/column/register_post_type#outline_1__8

カスタム投稿タイプの記事一覧を実際のページに表示する

作成したカスタム投稿タイプを実際のページに表示させる方法について解説します。

テンプレートファイルを作成

カスタム投稿タイプ専用のテンプレートファイルを作成します。下記はテンプレートファイルの名前の例です。

「archive.php」か「archive-{カスタム投稿タイプスラッグ}.php」が代表例です。

・archive.php
・archive-column.php
・archive-product.php
・archive-works.php

カスタム投稿タイプを1つしか作らない場合や、カスタム投稿タイプは複数あるが、レイアウトは特に変わらない場合

ファイルは少ない方が管理がしやすくなるため「archive.php」を作成することをおすすめします。

カスタム投稿タイプごとにレイアウトを変えたい場合

archive-{カスタム投稿タイプスラッグ}.phpを作成しましょう。

カスタム投稿タイプの記事一覧を実際のページに表示するためのソースコード例

WP_Queryを使用して実装します。

PR

<?php
    $post_type = get_post_type();
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $args = array(
        'paged' => $paged,
        'post_type' => $post_type,
    );
    $the_query = new WP_Query($args);

    if($the_query->have_posts()): ?>
        <div class="article__list">
            <?php while($the_query->have_posts()) :$the_query->the_post();?>
                <article class="article__item">
                    <a href="<?php the_permalink(); ?>">
                        <div class="article__img">
                            <img src="<?php get_the_post_thumbnail_url(); ?>" alt="<?php the_title(); ?>">
                        </div>
                        <div class="article__content">
                            <time datetime="<?php the_time('Y-m-d'); ?>"><?php the_time('Y.m.d'); ?></time>
                            <p class="article__ttl"><?php the_title(); ?></p>
                            <div class="article-readmore">
                                <span>記事を読む</span>
                                <span class="arrow-right icon-circle"></span>
                            </div>
                        </div>
                    </a>
                </article>
            <?php endwhile; ?>
        </div>
    <?php endif;
    wp_reset_postdata();
?>
<div class="archive-pagination">
    <?php 
        $args = array(
            'mid_size' => 1,
            'prev_text' => '<',
            'next_text' => '>',
        );
        echo paginate_links($args);
    ?>
</div>
.article__list {
    display: flex;
    flex-wrap: wrap;
    column-gap: 4%;
    row-gap: 24px;
}
.article__item {
    width: 48%;
    border-radius: 10px;
    box-shadow: 0 0 3px rgba(0, 0, 0, 0.12);
    transition: all 0.3s ease-in-out;
    cursor: pointer;
}
.article__item:hover {
    box-shadow: 0 0 15px rgba(0, 0, 0, 0.24);
    transform: translateY(-3px);
}
.article__img {
    position: relative;
}
.article__img::before {
    content: "";
    display: block;
    padding-top: 75%;
}
.article__img img {
    width: 100%;
    height: auto;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}
.article__content {
    position: relative;
    font-size: 14px;
    padding: 15px;
    background-color: #fff;
}
.article-readmore {
    position: relative;
    color: #fff;
    background-color: #333;
    font-size: 14px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 20px;
    line-height: 40px;
}
.icon-circle {
    display: inline-block;
    width: 25px;
    height: 25px;
    position: absolute;
    top: 50%;
    right: 0;
    transform: translate(-50%, -50%);
    border-radius: 50%;
    background-color: #fff;
}
.arrow-right::before {
    content: "";
    width: 10px;
    height: 10px;
    position: absolute;
    top: 50%;
    right: 6px;
    border-top: 2px solid #191919;
    border-right: 2px solid #191919;
    transform: translate(0, -50%) rotate(45deg);
}
.arrow-right::after {
    content: "";
    width: 15px;
    height: 2px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    background-color: #191919;
}

ソースコードの解説

$post_type = get_post_type();

現在表示されているページの「投稿タイプを取得」します。

関数を使用して動的に投稿タイプを取得することが可能です。なのでカスタム投稿タイプが複数あったとしても1つのファイル(archive.php)でそれぞれのカスタム投稿タイプの一覧を表示することが可能です。

archive-{カスタム投稿タイプスラッグ}.phpをカスタム投稿タイプの数だけ作るなら、わざわざ関数は使用せずとも、それぞれのファイルに下記のように指定すれば大丈夫です。

post_type => 'column'
post_type => 'product'
post_type = 'works'

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

ページネーションを実装するために追加しています。

WP_Queryの部分で条件を指定する

記事一覧を表示するときはWP_Queryで条件を指定します。今回タイトルにもある通り、一番基本のソースコードの紹介なので、最低限の条件にしています。

記事数が12を超えたときにページネーションが表示されます。

$args = array(
    'paged' => $paged,
    'post_type' => $post_type,
    'posts_per_page' => 12,
);
$the_query = new WP_Query($args);

ページネーション

今回は「paginate_links」関数で実装しましたが、「the_posts_pagination」関数を使用しても良いです。

その2つの関数の違いについて、下記記事で書いているので詳しく知りたい方は見てください。

その2つの関数は違うようで似ています。「違うのここだけか!」ってきっとなると思います^^

WPページネーション

WordPressのページネーションを出力する関数の「paginate_links()」と「the_posts_pagination()」の違いについて解説しています。

実装後の表示

あらかじめ管理画面から記事を更新しておいてください。

その後アクセスしてください。カスタム投稿タイプのスラッグに合わせてリンクは適宜変更をお願いします。

https://yourdomain.com/column
https://yourdomain.com/product
https://yourdomain.com/works
1 2

ソースコードを反映させたが表示されない場合

WordPressの管理画面「設定」=>「パーマリンク」に移動したら何も変更せずに「設定を保存」のボタンを押してください。

まとめ

この記事では、WordPressでカスタム投稿タイプを作成し、それをウェブサイト上に表示させる方法を紹介しました。今回の記事を参考にしてもらって、カスタム投稿タイプを効率よくご自身やクライアント様のサイトに実装してもらえれば幸いです。

>お問い合わせはこちら

お問い合わせはこちら