説明
query_posts() は、メインクエリを、上書きする関数です。公式でも、可能な限り避けるべきとされています。メインクエリを変えるときは、pre_get_posts フックを使います。
基本構文
query_posts( array|string $query ): WP_Post[]|int[]
引数
$query:クエリの条件(配列または文字列)
戻り値
投稿の配列。
使い方(サンプル)
query_posts( 'posts_per_page=3' );
while ( have_posts() ) {
the_post();
}
wp_reset_query();
注意点
- メインクエリを上書きするため、二重にクエリが実行され、ページ送りが、壊れやすくなります。
- 使ったあとは、
wp_reset_query()で、元に戻す必要があります。 - 新しく書くコードでは、使いません。
実務での使いどころ
- 古いテーマの、コードを理解・修正するとき。
よくあるミスと対処
- 新しいコードで、使っている。メインクエリの変更は、
pre_get_postsフックを使う。 wp_reset_query()を、呼んでいない。- サブの一覧を作りたいだけなのに、使っている。サブの一覧は、
WP_Queryを使う。
NG例
query_posts( 'posts_per_page=3' ); // 元に戻していない。二重にクエリが実行される
OK例
add_action( 'pre_get_posts', function ( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
$query->set( 'posts_per_page', 3 );
}
} );
使い分け早見表
| やりたいこと | 使うもの |
|---|---|
| メインクエリの条件を変える | pre_get_posts フック |
| 別枠の一覧を作る | WP_Query |
query_posts() のあとに、元に戻す |
wp_reset_query() |

コメント