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


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

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2014/01/21 14:18:28
  • 終了:2014/01/22 12:12:48

ベストアンサー

id:rouge_2008 No.1

rouge_2008回答回数594ベストアンサー獲得回数3512014/01/21 23:28:54

ポイント100pt

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

id:akakak

rouge_2008 様
いつも大変詳しくありがごうございます。
>これらの「name」(投稿スラッグ)および「category_name」(カテゴリースラッグ) もパラメータに引き継がれているので1件だけの表示になります。
→ 大変勉強になりました。

また、他の記述いただいた内容もワードプレスで比較的データ内容が大きいサイトを運営していなので非常にためになりました。
実効してみます。

それでは、
今後とも、何卒、宜しくお願いします。

2014/01/22 12:12:35

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません