非推奨になっていたquery_postsをget_posts形式に書き換える

harada 4,727views 更新:2014年10月10日

いつの間にかquery_postsが非推奨になっていたんですね。。

公式のリファレンス:テンプレートタグ/query postsでもいつの間にか下記のような注意文がかいてありました。。

注 2: query_posts() はページ内のメインクエリーを書き換え、新しいクエリーのインスタンスと置き換えるために使う関数としては過度に単純化され、問題が発生しやすい方法です。非効率的で(SQL クエリを再実行します)、一部の状況では適切に実行することもできません(特にページング処理)。モダンな WordPress コードではもっと安定したメソッドを使うべきです。例えばpre_get_posts フックを使った方法などです。ひとことで言うと、query_posts() は決して使うべきではありません。

なぜ使うべきではないかというのと、ではどうしたらいいのかは、こちらの記事がわかりやすかったです。
参考:WordPressでページ送りが動かないのはどう考えてもquery_postsが悪い!【pre_get_posts、WordPressループまとめ】

では実際にquery_postsをサブクエリーでの利用に推奨されているget_postsを使って置き換えてみます。

query_postsでのソースコード

直接テンプレートに記述していました。

<ul>
<?php
query_posts("author=".get_the_author_meta( 'id' )."&showposts=3"); ?>
<?php if(have_posts()):while(have_posts()):the_post();?>
<li><a href="<?php the_permalink();?>"><?php the_title();?></a></li>
<?php endwhile; endif; wp_reset_query();
 ?>
</ul>

get_postsに変更したソースコード

条件や指定をfunctions.phpにまとめる方法で書き換えてみます。

<?php 
function single_author_posts( $author = null, $num = 3 ) {
    $args = array(
        'numberposts' => $num,
        'order' => 'DESC',
        );
    if ( $author !== null ) {
        $args['author'] = $author;
    }
    $rand_posts = get_posts( $args ); ?>
  <ul>
  <?php 
    foreach( $rand_posts as $post ) : ?>
<li><a href="<?php echo get_permalink($post->ID); ?>"><?php echo $post->post_title; ?></a></li>
<?php endforeach; ?>
</ul>
<?php } ?>

テンプレートではこれを呼び出すだけです。

<?php single_author_posts(); ?>

呼び出す際に引数を指定することでこの場合はユーザーIDでの絞り込みと、表示件数を変更することができます。

<?php single_author_posts('12','20'); ?>

テンプレートに直接記述する方法も次に試してみたいですね。

ログイン / 新規登録してコメントする

このソースコードをストックして後で利用したり、作業に利用したソースコードをまとめることができます。

こちらもお役に立つかもしれません