”この投稿を先頭に固定表示”とquery_posts()

WordPressサイト上でスライダーを表示させたくて以下のような引数のquery_posts()を叩いてみた。

$args = array(
    "post_type"         => "any",
    "nopaging"          => 0,
    "posts_per_page"    => 10,
    "post_status"       => 'publish',
    "meta_key"          => '_featured',
    "orderby"           => 'meta_value_num',
    "order"             => 'DESC',
);
query_posts($args);

post_meta(カスタムフィールド)に”_featured”のキーをもつ投稿を、_featuredの値順に表示してねって感じ。

実際には以下のようなUIを投稿画面に追加して、投稿時に選択できるようにしています。

基本的にはこれで問題なく動作するんですが、テーマユニットテストをしていたところ、チェックが入ってない項目も表示されていることに気がつきました。

もしかしたらテーマユニットテスト用のデータに不具合があるんでないの?とか疑ってしまって、原因を調べるのに無駄に時間がかかってしまったのですが、原因はこれでした。

どうやら、”この投稿を先頭に固定表示”にチェックを入れるとquery_posts()の引数に関係なく優先的に表示されてしまうことがあるようです。

(カテゴリーなどでフィルターをかけるとそうではないみたい。)

対策

query_posts() の引数に以下の値を追加してあげると表示されなくなります。

"ignore_sticky_posts" => 1

ちなみに以下のような引数を与えても固定表示された投稿が表示されなくなりますが、この方法だと他の条件でマッチしても表示されなくなりますので、ケースバイケースで。

'post__not_in' => get_option( 'sticky_posts' )

あと、以下の方法は現在のバージョンのWordPressでは非推奨です。

デバッグモードで使用すると盛大に警告が出ますので使用しないように注意しましょう。

caller_get_posts => 1, // 現在は非推奨

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