WordPressのループを復習:WordPress

Pocket

最近、久しぶりにWordPressを触っています。復習のためにWordPressの基本であるクエリについてまとめます。

メインクエリ

WordPressは投稿に応じてメインクエリを作成します。

メインクエリによって取得した投稿が存在するかを確認するhave_posts()や投稿をセットするthe_post()などの関数が提供されています。
(下記サンプルコードは、アーカイブなどでよく使われるページネーションを表示するthe_posts_pagination()のコードも合わせて掲載しています。)

<?php
    if ( have_posts() ) {
        echo '<ul>';
        while ( have_posts() ) {
            the_post();
            echo sprintf("<li><a href='%s'>%s</a></li>", get_the_permalink(), get_the_title());
        }
        echo '</ul>';
    }

    the_posts_pagination([
        'prev_text'          => __( 'Previous page', 'example-domain' ),
        'next_text'          => __( 'Next page', 'example-domain' ),
        'before_page_number' => '<span class="meta-nav screen-reader-text">' .
            __( 'Page', 'example-domain' ) . ' </span>',
    ]);
?>

$wp_query

グローバル変数$wp_queryは、メインクエリが格納されたおり、下記のコードは前述のコードとほぼ同じ働きをします。

<?php
    global $wp_query;

    if ( $wp_query->have_posts() ) {
        echo '<ul>';
        while ( $wp_query->have_posts() ) {
            $wp_query->the_post();
            echo sprintf("<li><a href='%s'>%s</a></li>", get_the_permalink(), get_the_title());
        }
        echo '</ul>';
    }

    the_posts_pagination([
        'prev_text'          => __( 'Previous page', 'example-domain' ),
        'next_text'          => __( 'Next page', 'example-domain' ),
        'before_page_number' => '<span class="meta-nav screen-reader-text">' .
            __( 'Page', 'example-domain' ) . ' </span>',
    ]);
?>

WP_Query

メインクエリとは異なる条件に一致する投稿を表示したいときなどに使われます。
メインクエリに影響を与えずに、あらたにクエリを作成します。

下記サンプルではexampleカテゴリをメインクエリの前に10件表示する例です。

<?php
    $query = new WP_Query([
        'posts_per_page' => 10,
        'tax_query' => [ 
            [
                'taxonomy' => 'category',
                'field'    => 'slug',
                'terms'    => 'example',
            ],
        ],

    ]);

    if ( $query->have_posts() ) {
        echo '<ul>';
        while ( $query->have_posts() ) {
            $query->the_post();
            echo sprintf("<li><a href='%s'>%s</a></li>", get_the_permalink(), get_the_title());
        }
        echo '</ul>';
    }
    wp_reset_postdata();

    the_posts_pagination([
        'prev_text'          => __( 'Previous page', 'example-domain' ),
        'next_text'          => __( 'Next page', 'example-domain' ),
        'before_page_number' => '<span class="meta-nav screen-reader-text">' .
            __( 'Page', 'example-domain' ) . ' </span>',
    ]);
?>

get_posts()

上記のnew WP_Query()とほぼ同じ動作をします。
get_posts()は引数で指定したクエリ条件に一致する投稿を取得します。

こちらもメインクエリとは異なる投稿を表示したいときなどに使われます。

WP_Queryのサンプル同様に、exampleカテゴリをメインクエリの前に10件表示する例です。

get_posts()はメインクエリを書き換えないため、メインクエリとは異なるクエリ条件の投稿を表示するのに便利です。
wp_reset_postdata()関数を実行することでメインクエリの投稿を復元できます。

<?php
    $posts = get_posts([
        'posts_per_page' => 10,
        'category_name' => 'example'
    ]);        

    foreach ($posts as $post) {
        setup_postdata($post);
        echo sprintf("<li><a href='%s'>%s</a></li>", get_the_permalink(), get_the_title());
    }
    wp_reset_postdata();

   // メインクエリは影響を受けることなく実行できる
   if ( have_posts() ) {
        echo '<ul>';
        while ( have_posts() ) {
            the_post();
            echo sprintf("<li><a href='%s'>%s</a></li>", get_the_permalink(), get_the_title());
        }
        echo '</ul>';
    }

    the_posts_pagination([
        'prev_text'          => __( 'Previous page', 'example-domain' ),
        'next_text'          => __( 'Next page', 'example-domain' ),
        'before_page_number' => '<span class="meta-nav screen-reader-text">' .
            __( 'Page', 'example-domain' ) . ' </span>',
    ]);
 ?>

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。