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

wordpress3.5に関して質問です。テンプレートはtwenty-elevenを使用しています。
ページ送りのプラグインでwp-page.naviを使用しています。
該当サイトはhttp://dca-labo.info/demo8です。
トップページのページ送りのリンクがうまく張られていません。
カテゴリーページ、アーカイブページに関しては問題なくページ送りのリンクが張られています。

追加したスクリプトは下記です。

http://dca-labo.info/demo8/testimg/work.html

右クリックで確認お願いします。

●質問者: mkusume
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

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

HTMLのコメントアウトをしている部分で、「get_posts()」で取得した投稿情報を変数「$posts」に代入しているのが原因です。
(※HTMLソースを表示してみると分かりますが、HTMLでコメントアウトしていても、PHPは実行されています。もし必要が無い場合は、PHPコードにはPHPでコメントアウトするようにするといいです。)
(※原因は上記の通りで、WP-PageNaviのリンクは正しく出力されています。WP-PageNaviを使用していないデフォルトの状態でも、2ページ目以降は正しく表示されません。)

・WordPress ループ&クエリーのモヤモヤを解消しよう!
http://wpxtreme.jp/understanding-wordpress-loops-and-queries

グローバル変数の扱いを理解しよう

複数ループは不安定、危険などと言われる原因は、ループ&クエリーでのグローバル変数の扱いが十分に理解されていないことにあります。

以下は、ループ&クエリーに関係のある主なグローバル変数です。

$wp_the_query ..... WP_Query オブジェクト。URL のクエリーバックアップ用。
$wp_query ......... WP_Query オブジェクト。カレントのクエリー。
$posts ............ クエリーを実行して取得した記事オブジェクトの配列。
$post ............. カレントの記事オブジェクト。

そして、これらのグローバル変数を上書きする関数は以下の通り。

query_posts() ........................ $wp_query を上書き。
the_post(), WP_Query::the_post() ..... $post を上書き。

テンプレートファイル内では $wp_query, $posts, $post はグローバル変数として宣言されているので、これらも何らかの値を代入すれば上書きされます。

さらに、上書きされたグローバル変数を復元する関数があります。

wp_reset_query() ........ $wp_query を $wp_the_query, $post を $wp_query->post で復元。
wp_reset_postdata() ..... $post を $wp_query->post で復元。


get_posts()

サンプルコード(略)

$posts = と書かないのは、$posts を復元する関数が用意されていないからです。他で使用されるフシが無く、

$GLOBALS['posts'] = & $wp_query->posts;

で復元すれば良さそうですが、余計なことはしない方が得策です。また、グローバル変数の $post を使用せず $my_post のようにも書けますが、the_title() などのテンプレートタグはグローバル $post 専用のため、echo get_the_title( $my_post ) のように書く必要があります。


※上記に関連部分だけを一部抜粋しましたが、WordPressのループがとても分かりやすく説明されていますので、参考記事をすべて確認してみてください。

今回のコードをPHPでコメントアウトしたり削除しないで使用する場合は、修正する箇所は次の2行になります。(※クエリー発行時に代入する変数とループで使用する変数の変更)
※ここでは「$newposts」としていますが、「$posts」以外でしたら何でも大丈夫です。(「$posts」は上記記事で説明されている通り、メインクエリーで使用するグローバル変数で、復元の為の関数が用意されていないので使用しません。)

 <?php $newposts = get_posts('numberposts=5&order=desc');
 foreach($newposts as $post): ?>



※また、「新着情報」なので、おそらくトップページだけに表示したいのではないですか?
次のようにしてみてください。

<!-- 条件分岐でトップページ(2ページ目以降除く) の場合のみ処理を実行 -->
<?php if( ( is_home() || is_front_page() ) && $paged < 2 ) : ?><!-- この行を追加 -->
<h3 class="post_title">新着情報</h3>
 <dl class="feed">
 
 <?php $newposts = get_posts('numberposts=5&order=desc');
 foreach($newposts as $post): ?>
 <dt>
 <span class="day">
 <?php echo date("Y年m月d日", strtotime($post->post_date)); ?>
 </span></dt>
 <dd>
 <a href="<?php the_permalink(); ?>" id="post-<?php the_ID(); ?>">
 <?php the_title(); ?>
 </a>
 </dd>
 
 <?php endforeach; ?>
 
 </dl>
<?php endif; ?><!-- この行を追加 -->



※もしコメントアウトする場合で、PHPのコメントアウトの方法を忘れた場合は、以前の質問【wordpress3.5に関して質問です。固定ページのコメント欄を非表示にしたいと思っています。】への回答を参考にしてください。


mkusumeさんのコメント
いつも丁寧なご回答ありがとうございます。お察しの通り、PHPのコメントアウトの方法は正直な話混同していたかと思います。
関連質問

●質問をもっと探す●



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