ショウジンブログ on Hatena

“お芝居をしないと、この社会では異邦人として扱われるほかない”

ループにget_postsを使う@WordPress

WordPressのループで表示の条件を指定する際には「query_posts()」を使うことが多いですが、これは非推奨とされていることを最近知ったので、代わりに「get_posts()」を使うようにします。

query_posts を使うことによって、ページ上のメインクエリーが置き換えられ、ページの読み込み速度に影響を与えることに留意してください。最悪の場合、倍かそれ以上の処理が発生します。簡単に使える代わりに、この関数は混乱と問題を引き起こす傾向があります。下記の注意をご覧ください。

一般的な投稿の取得には、WP_Query または get_posts を使ってください。

テンプレートタグ/query posts - WordPress Codex 日本語版

基本のループ

基本のループは以下のような記述になりますが、これだけだと表示件数やカテゴリの指定等、表示条件を細かく指定できません。

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
<div class="post"><?php the_content(); ?></div>
<?php endwhile; ?>
<?php else: ?>
<h2>記事がありません</h2>
<?php endif; ?>

query_posts()を使った場合

query_posts()を使うと、以下のような記述を加えることで表示件数等、表示条件を複数指定することができます。そして、これまでは多くの場合これを使っていました。(同一テンプレート内で複数ループを設置する場合、サブループを使用する場合を除いて)

実際、検索するとヒットするWordPressのループの制御に関してはquery_posts()で解説されているものがずっと多い気がします。

<?php query_posts('cat=1&posts_per_page=10'); / * カテゴリIDに1を指定し、表示件数は10件と指定 */ ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
<div class="post"><?php the_content(); ?></div>
<?php endwhile; ?>
<?php else: ?>
<h2>記事がありません</h2>
<?php endif; ?>

get_posts()を使って書き換える

get_posts()を使うとこのようになります。配列にパラメータを記述することでループの表示条件を細かくコントロールできます。

<?php
$args = array(
    'posts_per_page' => 6,
    'order'=> 'DESC', // ソート(降順:新しいものから古いものへ)
    'category' => 2, // カテゴリーの指定(カテゴリIDを指定、除外の場合にはカテゴリIDに「-」をつける、複数の場合にはカンマでつなげる
);
$myposts = get_posts( $args );
foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
    <div class="post">
        <h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
        <ul class="optional">
            <li class="date">Published: <?php echo get_post_time('M jS, Y'); ?></li>
            <li class="category">Category: <?php the_category(', '); ?></li>
            <?php if(has_tag() == true) : ?>
                <li class="tags">Tags: <?php the_tags('', ', ', ''); ?></li>
            <?php else : ?>
            <?php endif; ?>
        </ul>
    <!-- / .post --></div>
<?php endforeach; 
wp_reset_postdata();?>

この記述例では表示件数、ソートの順序、カテゴリーの指定(または除外)がされていますが、その他にも以下のようなパラメータがあります。

デフォルトの使い方(Codex日本語版より)

<?php $args = array(
    'posts_per_page'   => 5,
    'offset'           => 0,
    'category'         => '',
    'category_name'    => '',
    'orderby'          => 'date',
    'order'            => 'DESC',
    'include'          => '',
    'exclude'          => '',
    'meta_key'         => '',
    'meta_value'       => '',
    'post_type'        => 'post',
    'post_mime_type'   => '',
    'post_parent'      => '',
    'author'      => '',
    'post_status'      => 'publish',
    'suppress_filters' => true 
);
$posts_array = get_posts( $args ); ?>

パラメータの詳しい解説はパラメータ - 関数リファレンス/WP Queryにありますので、必要なときに確認するといいでしょう。

本格ビジネスサイトを作りながら学ぶ WordPressの教科書 Ver.4.x対応版

本格ビジネスサイトを作りながら学ぶ WordPressの教科書 Ver.4.x対応版