【コピペOK】特定のカテゴリーに属する記事投稿をトップページで取得する方法【WP_Query】

WordPressのトップページ(front-page.php)はブログ投稿を表示したり、お知らせ投稿を表示したりしたいこと、ってありますよね?

WP_Query クラスを使って、投稿タイプが「投稿(post)」である最新記事を取得する方法を解説します。

目次

まずは一番基本的なコードから

通常の投稿を新着順で6記事取得するコードです。

<?php
// カスタムクエリのパラメータを設定
$args = array(
    'post_type'      => 'post',   // 投稿タイプ(通常の投稿)
    'posts_per_page' => 6         // 取得する件数
);

// クエリを作成
$the_query = new WP_Query($args);

// 投稿があるかどうかを判定
if ($the_query->have_posts()) : ?>
    <ul>
        <?php
        // 投稿がある場合はループ開始
        while ($the_query->have_posts()) : $the_query->the_post(); ?>
            <li>
                <a href="<?php the_permalink(); ?>">
                    <?php the_title(); // 投稿タイトルを表示 ?>
                </a>
            </li>
        <?php endwhile; ?>
    </ul>
<?php
endif;

// メインクエリ(グローバルクエリ)を復元
wp_reset_postdata();
?>

コードの意味・解説

WP_Query用のパラメータを設定

$args = array(
    'post_type'      => 'post',
    'posts_per_page' => 6
);

post_type: 取得したい投稿タイプを指定します。ここでは通常の「投稿(post)」を指定。

posts_per_page: 取得したい件数を指定。ここでは「6件」を指定。

ここでパラメータを追加すれば特定のカテゴリーに属する記事のみを取得したり、並び順をタイトル順やランダムにしたり、タグで絞り込んで表示したりすることができます。

詳しくは後ろで説明します!

WP_Queryのインスタンスを生成し、クエリを作成

$the_query = new WP_Query($args);

$args で設定したパラメータを使って新たにクエリを作成し、$the_query に代入します。

ループ開始(投稿が存在するかどうかを確認)

if ( $the_query->have_posts() ) :

have_posts() は、現在のクエリに該当する投稿があるかどうかをチェックします。もし投稿が存在しない場合には false となります。

投稿データがある間はループを回して表示する

while ( $the_query->have_posts() ) : $the_query->the_post();
    ...
endwhile;

the_post() は、ループ内で使用する「投稿データ」をセットし、テンプレートタグ(the_title(), the_content() など)でその投稿の情報を取得できるようにします。<li></li> の間で、各投稿タイトルやパーマリンクを表示しています。

ループ後、グローバルクエリを復元

wp_reset_postdata();

new WP_Query() を使用した後は、ループが終了した段階で必ず wp_reset_postdata() を呼び出して、$post グローバル変数を初期の状態に戻します。これをしないと、メインクエリや他のクエリに悪影響が出る可能性があります。

特定のカテゴリー(スラッグ: news)だけを取得

'category_name' => 'news'

category_nameというパラメータを使って、スラッグ(例: “news”, “blog”, “event”など)を指定して、そのカテゴリーの記事のみ取得できます。

<?php
$args = array(
    'post_type'      => 'post',
    'posts_per_page' => 6,
    'category_name'  => 'news'
);

$the_query = new WP_Query($args);

if ( $the_query->have_posts() ) : ?>
    <ul>
        <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
            <li>
                <a href="<?php the_permalink(); ?>">
                    <?php the_title(); ?>
                </a>
            </li>
        <?php endwhile; ?>
    </ul>
<?php endif;

wp_reset_postdata();
?>

表示内容は the_title()the_excerpt() を使用してカスタマイズできます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

WordPress開発歴6年。
ベンチャー企業のオウンドメディア開発、中古車検索サイトの開発、WooCommerceを用いたECサイト開発、会員登録機能付きのサイト開発、求人検索サイトの開発など、多くのWordPressサイトを開発してきました。MVPではじめて運用に合わせて拡張保守していくスタイルのアジャイル開発が可能なので、100万円程度のご予算でも新規事業開発を立ち上げることが可能です。

目次