top pageに 更新履歴を表示しています。(index.php)
そこは問題なく表示されているのですが、
single.php (投稿記事)
で同様に以下のタグを使うとその表示されている投稿記事の履歴(1件だけということ)しか表示されません。
どのようにすれば、投稿記事上に、全記事の更新記事が表示できますでしょうか。
以下タグ。
<ul>
<?php query_posts($query_string .'&orderby=modified&posts_per_page=5'); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<li><?php echo get_the_modified_date(); ?> 更新履歴<br /><a href="<?php the_permalink(); ?>"><?php the_title();?></a></li>
<?php endwhile; endif; ?>
<?php wp_reset_query(); ?>
</ul>
<?php include('navigation.php'); ?>
*get_posts()を使って$numberposts -1にすれば全件取得し、後はwhile文で出力されるのかと思いきやダメでした。 参考記事・http://100-art-toe.sakura.ne.jp/zukai-wp/27
*後、別件でquery_postsはDBを何回も呼び出すからページ速度が遅くなる原因!なのでget_posts()をなんて見かけたのですが本当でしょうか?
「$query_string」をつけているのが原因です。
「<?php echo $query_string ;?>」で出力して確認してみてください。
これらの「name」(投稿スラッグ)および「category_name」(カテゴリースラッグ) もパラメータに引き継がれているので1件だけの表示になります。
以下のように外して記述するとすべての投稿を対象に編集日時の最新5件分が取得・表示されます。
<ul> <?php query_posts('&orderby=modified&posts_per_page=5'); ?> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <li><?php echo get_the_modified_date(); ?> 更新履歴<br /><a href="<?php the_permalink(); ?>"><?php the_title();?></a></li> <?php endwhile; endif; ?> <?php wp_reset_query(); ?> </ul>
※「get_posts()」を使う場合は次のようにします。
<ul> <?php $newposts = get_posts('&orderby=modified&posts_per_page=5'); ?> <?php foreach ( $newposts as $post ) : setup_postdata( $post ); ?> <li><?php echo get_the_modified_date(); ?> 更新履歴<br /><a href="<?php the_permalink(); ?>"><?php the_title();?></a></li> <?php endforeach; ?> <?php wp_reset_postdata();?> </ul>
※結果は配列で返されるので、「foreach」でループを処理する必要があります。(メインクエリと違って「have_posts()」では判定できませんので、「if ( have_posts() )」や「while ( have_posts() )」は利用できません。)
・get_posts
http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_posts
> *後、別件でquery_postsはDBを何回も呼び出すからページ速度が遅くなる原因!なのでget_posts()をなんて見かけたのですが本当でしょうか?
「何回も」は大げさですが、使い方(呼び出す順番)によっては数回余分にアクセスする事になります。
ドキュメントに以下のような解説がありますので確認してみてください。(※以下の項目だけでなく「説明」の項目でも詳しい解説がありますので、ページ全体を確認してください。)
・http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts#SQL.E3.82.AF.E3.82.A8.E3.83.AA.E3.83.BC.E3.81.8C.E8.BF.BD.E5.8A.A0.E7.99.BA.E8.A1.8C.E3.81.95.E3.82.8C.E3.82.8B
SQLクエリーが追加発行される
query_postsをテンプレートで使用する場合、WordPressはすでにデータベースへの問い合わせを実行し、テンプレートを読み込む頃にはデータの取り出しを終えています (なぜなら、どのテンプレートが読み込まれるかが決まったということは、すでに処理が終わっているということですから!)。そのため、query_posts()を使ってデフォルトのクエリーを上書きして結果を得るには、どうしても再度データベースに問い合わせし再計算する必要があります。
このことは、小規模なブログベースのウェブサイトを扱っているのであれば、必ずしも問題であるとは言えません。データベースが大きい大規模でトラフィックの多いウェブサイトの開発者であれば、デフォルトのクエリーが呼び出される前に直接変更するなどの代替案を検討するほうがいいかもしれません。requestフィルターでまさにこれを実現できるでしょう。
'parse_query' と 'pre_get_posts' フィルターも内部的に $query オブジェクトを改変しデータベースへ問い合わせるSQLを生成するのに使われます。
※上記ドキュメントではメインクエリの変更は「pre_get_posts」フィルターの使用が推奨されていますが、今回の質問のようにメインクエリである個別投稿とは別に更新履歴を表示する等、通常のクエリとは別のクエリが必要な場合は、「get_posts()」または「WP_Query」の利用が推奨されています。