WordPressで投稿記事を取得する際に、データの取得条件を独自にカスタマイズしたいケースがあると思います。
上記のような場面において、かつては 「query_posts()」 を利用する方法がよく紹介されていたため、今でも検索するとそういった手法が見つかることがあるかと思います。
ですが、この方法には様々な問題が見つかったため、現在は公式に非推奨となっています。
そこで本記事では、非推奨となった理由や適切な代替手段について、詳しく解説していきたいと思います。
query_postsとは?
query_postsは、WordPressで投稿記事などを表示するのに使用しているメインクエリを書き換えるテンプレートタグです。
メインクエリとは、アクセス先のURLに応じて自動で発行されるクエリのことを指します。
query_postsを使用することで、メインクエリの実行時に読み込む情報を任意の内容に変更することができます。
query_postsが「非推奨」の理由は?代替手段はある?
query_postsは、公式に非推奨とされているテンプレートタグでもあります。
その理由としてもっとも大きいのが、不具合の発生を引き起こしやすくなるという点です。
WordPressには、「$wp_query」 というグローバル変数があり、メインクエリの発行に必要な情報がこの変数に格納されています。
query_postsを使用すると、この $wp_queryに格納されているクエリの情報が上書きされ、その結果として任意のデータが取得できるようになる仕組みになっています。
ですが、$wp_queryは WordPress全体で使用される変数のため、情報を書き換えることで他のページのメインクエリにも影響を及ぼしてしまったり、ページネーションが正しく機能しなくなるといった不具合を引き起こす可能性が高くなります。
その他にも、query_postsを使用することで必要な処理量が増える場合があり、ページの読み込み時間が長くなってしまう原因にもなりかねません。
公式が非推奨とする通りに、よほどの理由がない限りは使用を控える方が安全に運用できます。
query_postsの代替手段として推奨されているものには、以下の3つがあります。
- pre_get_posts
- WP_Query
- get_posts
それぞれ順番に、使い方を解説していきます。
【代替手段1】pre_get_postsフック
pre_get_postsは、Wordpressに用意されているアクションフックの1つです。
アクションフックとは、特定のタイミングで任意の処理が行われるようにする機能のことを指します。
アクションフックを使用する際の構文は、以下の通りです。
【基本構文】
add_action('アクションフック名', '関数名');
pre_get_postsを指定してアクションフックを登録すると、メインクエリを取得する前に関数が実行されるようになります。
以下は、実際に使用する際のサンプルコードです。
アクションフックは functions.php 内に記述します。
【サンプルコード】
function myPosts($query) {
if (is_admin() || !$query->is_main_query()){
return;
}
if ($query->is_home()) {
$query->set('post_type', 'post');
$query->set('posts_per_page', '3');
}
}
add_action('pre_get_posts', 'myPosts');
pre_get_postsの場合、管理画面のクエリやサブクエリの取得前にも関数が実行されるため、メインクエリ以外で情報の書き換えを行わないよう、「is_admin()」と 「is_main_query()」 を使用してチェックを行う必要があります。
この記述が無いと、管理画面やプレビュー画面が正常に表示されなくなったり、サイトの一部の表示が意図しないものになったりと、不具合が出てしまう可能性があるため、必ずセットで記述するようにしましょう。
ブログ投稿ページであれば 「$query->is_home()」、アーカイブページであれば 「$query->is_archive()」 といったように、それぞれの条件で処理を分けることで、メインクエリに関する記述を1箇所にまとめることができます。
【代替手段2】WP_Queryクラス
WP_Queryは、様々なコンテンツをデータベースから取得するために使用するクラスです。
メインループとは別に、サブループで投稿一覧などを表示する際に使います。
【サンプルコード】
<?php
// 条件設定
$args = Array(
'post_type' => 'post',
'posts_per_page' => 3,
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// 表示内容に関する処理を記述
}
} else {
// 投稿が見つからなかった場合の処理
}
// クエリのリセット
wp_reset_postdata();
?>
【代替手段3】get_posts
get_postsは、投稿記事データを取得する際に使用するテンプレートタグです。
WP_Queryクラスと同様に、サブループで投稿一覧などを表示する場合に使います。
get_postsを使用すると、投稿記事に関する情報が格納された配列が返却されます。
【サンプルコード】
<?php
// 条件設定
$args = Array(
'post_type' => 'post',
'posts_per_page' => 3,
);
$my_posts = get_posts( $args );
foreach ( $my_posts as $post ) {
setup_postdata( $post );
// 表示内容に関する処理を記述
}
// クエリのリセット
wp_reset_postdata();
?>
get_postsを使用する場合は、「$query->the_post()」 に相当する文として 「setup_postdata()」 を記述する必要があります。
どの代替手段を使うべき?
ここまで3つの代替手段について解説をしてきましたが、それぞれ使用できる場面や活用できるデータ内容には違いがあります。
まず前提として、メインループで使用する場合は 「pre_get_posts」、サブループの場合は「WP_Query」 もしくは 「get_posts」 と使い分けるといいでしょう。
WP_Queryや get_postsをメインループで使用する場合、処理順の関係により、既にメインクエリでデータを取得した状態から再度データベースにアクセスすることになるため、ページを表示するまでの時間が遅くなってしまう可能性があります。
反対に、pre_get_postsは前述の理由により、サブループでの使用には危険が伴いやすい仕組みとなっています。
また、同じく処理順などの関係から、固定ページで使用することはできませんので、メインループでのみ使用するようにしましょう。
サブループで使用可能なWP_Queryと get_postsの違いについてですが、取得できるデータ内容の多さに差があります。
WP_Queryクラスは、メインクエリの取得にも使用されているオブジェクトクラスです。
投稿記事以外にも固定ページなどのデータ情報が取得できたり、ページの種類やカテゴリ名などの様々なクエリ情報が使用できたりと、扱えるデータの種類に幅があります。
一方、get_posts で取得できるデータは投稿記事に関する情報のみになります。
get_postsの詳しい処理内容を調べると分かるのですが、最終的に以下の形で戻り値が返却されます。
$get_posts = new WP_Query;
return $get_posts->query($r);
このコードが示す通り、get_postsは WP_Queryクラスを使用して取得できるデータの一部のみを返却するテンプレートタグなのです。
コードのシンプルさや処理速度の面では get_postsの方が優位ですが、投稿記事以外のデータを取得したい場合や、より複雑な情報を扱いたい場合には WP_Queryを使用する必要があります。
まとめ
今回は、query_postsが非推奨となっている理由と代替方法について解説しました。
サイトを安全に運用するためにも、query_postsは使用せずに、他の方法でデータの取得を行うようにしましょう。
PHPの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、PHPに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。