人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

ワードプレスでアドバイス頂きたいです。

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()をなんて見かけたのですが本当でしょうか?

●質問者: ak
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● rouge_2008
●100ポイント ベストアンサー

「$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」の利用が推奨されています。


akさんのコメント
rouge_2008 様 いつも大変詳しくありがごうございます。 >これらの「name」(投稿スラッグ)および「category_name」(カテゴリースラッグ) もパラメータに引き継がれているので1件だけの表示になります。 → 大変勉強になりました。 また、他の記述いただいた内容もワードプレスで比較的データ内容が大きいサイトを運営していなので非常にためになりました。 実効してみます。 それでは、 今後とも、何卒、宜しくお願いします。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ