CATEGORY

Wordpress

Wordpress】query_posts() → get_posts() / WP_Query() への道

すもも旨い

1,153 PV

このブログを作っていたとき、
query_posts() を検索すると高確率で「もうやめよう」って書いてあったので、じゃーどーするのかを調べたメモ。

【実現したい内容】

  • single.php 内で Latest とか Related な記事一覧を載せたい
  • ソースは可能ならテンプレートを使い回したい
  • パラメータを渡すことで、表示内容を変更したい
  • テンプレートのみで完結したいので、functions.php は使わない

query_posts() の場合

single.php

<?php
$list_args = array('****');
query_posts($list_args);
get_template_part('list');
wp_reset_query();
?> 

list.php

<?php if (have_posts()) : ?>
<ul class="list">
<?php while (have_posts()) : the_post(); ?>
<li></li>//ループさせる部分
<?php endwhile; ?>
</ul>
<?php endif; ?>

query_posts() ~ wp_reset_query() までの間はメインクエリーが書き換えられているので、list.php 側では普通にループさせるだけでOK。
メインクエリーが書き換えられているおかげで、別のテンプレートを呼び出していようがお構いなしな点が使い勝手が良くて楽だったのですが。。。

get_posts() の場合

single.php

<?php
$list_args = array('****');
get_template_part('list');
?> 

list.php

<?php global $list_args; ?>
<?php $list_query = get_posts($list_args); ?>
<?php if ($list_query->have_posts()) : ?>
<ul class="list">
<?php foreach($list_query as $post) : setup_postdata($post); ?>
<li></li>//ループさせる部分
<?php endforeach; ?>
</ul>
<?php endif; ?>
<?php wp_reset_postdata(); ?> 

WP_Query() の場合

single.php

<?php
$list_args = array('****');
get_template_part('list');
?> 

list.php

<?php global $list_args; ?>
<?php $list_query = new WP_Query($list_args); ?>
<?php if ($list_query->have_posts()) : ?>
<ul class="list">
<?php while ($list_query->have_posts()) : $list_query->the_post(); ?>
<li></li>//ループさせる部分
<?php endwhile; ?>
</ul>
<?php endif; ?>
<?php wp_reset_postdata(); ?> 

get_post() での注意点は、ページングが使えないこと。
WP_query() の方が色々と条件分岐も使えて高機能なイメージかな?
本当は細かい差がもっと色々とあるはずなんですがその辺は割愛w
global を使ってパラメータを引きこめばなんとかなるよーってトコが ポイントです。

本来なら pre_get_posts() とか使うべきなのかもしれないですが、function.php でフックに条件分岐かけてっていうのがどーも好きになれなくって。。。

まぁこれで晴れて query_posts() を卒業できましたとさ。

 

2016.10.17 新たに考察を追記しました。

【Wordpress】pre_get_posts のことを誤解していた模様

CATEGORY : Wordpress

TAGS : | | | |

GO TOP