はじめに
実務経験でPHPのバージョンを7.3.3から8.2.1にバージョンアップした時の話です。
バージョンアップ作業をした時に、下記記事で紹介している「Warning: Undefined variable: 変数名 inエラー」が発生しました。
Warning: Undefined variable: 変数名 inエラーの発生原因と対処した方法について記事にしています。
そのエラーが発生している部分のソースコードは、カスタム投稿タイプの「voice」の新着3件をショートコードで表示するものでした。その中で「$post」が使用されていていたのですが、その「$post」が未定義だったためにエラーが発生していました。バージョンアップ前はエラーが表示されていなかったのですが、バージョンアップ後にページにエラーが表示されるようになったためそちらは修正をしたのですが、そのショートコードを表示するためのループが「WP_Query」ではなく「query_posts」が使用されていたため、直接エラーとは関係がなかったのですが、「query_posts」は非推奨になっているので「WP_Query」に変更しました。
なので今回は「query_posts」が非推奨である理由と「WP_Query」に変更する前後のソースコードを当記事で掲載していこうと思います。
「query_posts」が非推奨である理由
「query_posts」を「WP_Query」に変更する前と後のソースコード
カスタム投稿タイプの「voice」の新着3件をショートコードで表示するためのソースコード

query_postsが非推奨である理由
query_postsはメインクエリを置き換えてしまう
query_posts() はメインクエリ(通常のコンテンツのリストを生成するクエリ)を完全に新しいクエリで置き換えます。これは、テーマやプラグインが意図せずに他のカスタムクエリや条件を削除する可能性があるため、問題を引き起こすことがあります。
ウェブ開発の文脈で使われる用語で、データベースから情報を取得または操作するための命令や問い合わせのこと
ウェブ開発の文脈で使われる用語で、通常、ウェブページやアプリケーションがデータベースから情報を取得するために使用するデータベースクエリを指します。WordPressの文脈では、「メインクエリ」は、ウェブサイト上で表示される通常のコンテンツ(投稿、固定ページ、カテゴリー、タグなど)を取得するためのクエリを指します。
WP_Query
クラスを使用すると、メインクエリを変更せずに新しいクエリを生成およびカスタマイズできます。これにより、メインクエリを壊す心配がなく、より安全で予測可能なコードを記述できます。
query_postsはパフォーマンスの低下の原因になる
query_posts()はメインクエリを完全に新しいクエリで置き換え、古いクエリを破棄するため、追加のデータベースクエリの作業が発生する分ページの読み込み時間が増え、パフォーマンスに悪影響を及ぼす可能性があります。
WP_Queryに変更する前(query_posts)を使用している場合のソースコード
PR
function outputVoiceArchive($atts){
$voice = '';
$args = array(
'post_type' => 'voice',
'posts_per_page' => 3
);
query_posts($args);
if(have_posts()):
$voice = '<div class="voice__list">';
while(have_posts()): the_post();
$voice .= '<div class="voice__item"><a href="'.get_the_permalink().'">';
$voice .= '<figure>';
if(has_post_thumbnail()):
$voice .= '<img src="'.get_the_post_thumbnail_url(get_the_ID(), 'custom_thumbnail').'">';
endif;
$voice .= '</figure>';
$voice .= '<h3>'.get_the_title().'</h3>';
$voice .= '<p>'.get_the_excerpt().'</p>';
$voice .= '</a></div>';
endwhile;
$voice .= '</div>';
endif;
wp_reset_query();
return $voice;
}
add_shortcode('voice', 'outputVoiceArchive');
WP_Queryに変更した後のソースコード
PR
function outputVoiceArchive($atts){
$voice = '';
$args = array(
'post_type' => 'voice',
'posts_per_page' => 3
);
$query = new WP_Query($args); //query_posts($args);から変更
if($query->have_posts()): //if(have_posts()):から変更
$voice = '<div class="voice__list">';
while($query->have_posts()): $query->the_post(); //while(have_posts()): the_post();から変更
$voice .= '<div class="voice__item"><a href="'.get_the_permalink().'">';
$voice .= '<figure>';
if(has_post_thumbnail()):
$voice .= '<img src="'.get_the_post_thumbnail_url(get_the_ID(), 'custom_thumbnail').'">';
endif;
$voice .= '</figure>';
$voice .= '<h3>'.get_the_title().'</h3>';
$voice .= '<p>'.get_the_excerpt().'</p>';
$voice .= '</a></div>';
endwhile;
$voice .= '</div>';
endif;
wp_reset_postdata(); //wp_reset_query();から変更
return $voice;
}
add_shortcode('voice', 'outputVoiceArchive');
まとめ
今回はquery_postsが非推奨である理由とquery_postsをWP_queryに変更する前後のソースコードを紹介しました。
query_postsをWP_Queryに変更するのは2つのソースコードを比べてもわかりますが、それほど変更点はないので、もしquery_postsを使用しているのを見つけたらこの記事を参考にして直してみてください。