いいなもっと.com > Webデザイン > query_posts を WP_Query で書き換える(WordPress)
2014
07/ 10

query_posts を WP_Query で書き換える(WordPress)

Webデザイン

WordPressで記事の一覧を取得するのに query_posts を使うことをおぼえていたのですが、これは使わない方が良い構文のようです。なぜかというと、WordPress Codex にはこんな記述があります。

注 1: この関数はプラグインまたはテーマの中で使われることを想定されていません。後ほど出てくる説明にあるように、メインクエリーを変更するにはパフォーマンス面でも優れたより良いオプションが存在します。

注 2: query_posts() はページ内のメインクエリーを書き換え、新しいクエリーのインスタンスと置き換えるために使う関数としては過度に単純化され、問題が発生しやすい方法です。非効率的で(SQL クエリを再実行します)、一部の状況では適切に実行することもできません(特にページング処理)。モダンな WordPress コードではもっと安定したメソッドを使うべきです。例えばpre_get_posts フックを使った方法などです。ひとことで言うと、query_posts() は決して使うべきではありません。

以上のことをしっかり理解し、この関数を賢く活用してください。

動作が遅くなることもいやですが、実際にページ送り(過去の記事とか新しい記事を表示させる機能)が上手く動作しないことが頻発します。

これからは query_posts ではなく、WP_Query を使うことにします。ほんの少し書き換えるだけですからそんなに大変じゃありません。

今までの書き方

query_posts(‘posts_per_page=5&category_name=’tennis’&tag=’entry’);

if(have_posts()):
while(have_posts()):
the_post();
get_template_part(‘content’,’excerpt’);
endwhile;
endif;

get_template_part(‘pagenation’);

wp_reset_query();

カテゴリー名【tennis】、タグ【entry】の記事を5つ、記事の抜粋を表示する・・・という設定なのですが、これがWP_Query を使うとこうなります。

$paged = (get_query_var(‘paged’)) ? get_query_var(‘paged’) : 1;

$args = array(
‘paged’ => $paged,
‘posts_per_page’ => 5,
‘category_name’ => ‘tennis’,
‘tag’ => ‘entry’
);

$wp_query = new WP_Query($args);

if(have_posts()):
while(have_posts()):
the_post();
get_template_part(‘content’,’excerpt’);
endwhile;
endif;

get_template_part(‘pagenation’);

ちょっと面倒な書き方になりますが、なんだかこっちの方がわかりやすいです。
1行目の $paged = ・・・は、現在表示中のページ番号を取得しています。

タグ: ,

« »

-->