by shigemk2

当面は技術的なことしか書かない

query_postsの罠

スゴク便利な万能タグ「query_posts」ただし…【WPCMS.jp】
テンプレートタグ/query posts - WordPress Codex 日本語版

もともとquery_posts()とは、

<?php

// クエリ
query_posts( $args );

// ループ
if ( have_posts() ) : 
  while ( have_posts() ) : 
    the_post();
      ..
  endwhile; 
else:
  ..
endif;

// クエリをリセット
wp_reset_query();

?>

上記のようにコードを書くことで、指定した記事を表示することの出来る大変すばらしい関数です。
なお、引数$argsには、

$args = array(
	'cat' => 3,
	'ignore_sticky_posts' => 1,
	'post__not_in' => $sticky,
	'paged' => $paged
);
query_posts( $args );

このような感じで指定することができる。cakephpのfindと少し似ている。

ただし、この関数には罠がある。codexと上記のリンクによると、

WordPress は(ページ番号やカテゴリーのような)URL から得られた引数を無視します。もしその情報が必要なら、query_posts() の引数としてグローバル変数の $query_string を与えます。

と書いてある。

つまりどういうことかというと、「次へ」「前へ」とページを送っても現在のページ数を取得できず、同じ記事(たとえば最初の10件)しか表示されない。

これを避けるためには、こういう風に書きなさい、と。

<?php query_posts($query_string . “&cat=2&order=ASC”); ?>

$argsの部分を文字列にして、各要素の最初に&をつければいいんですね。
上の例を書きかえてみると…

<?php
query_posts($query_string .&cat=3&ignore_sticky_posts=1&post__not_in=" . $sticky . "&paged=" . $paged); 
?>

こんな感じになります。