wordpress3.5に関して質問です。テンプレートはtwenty-elevenを使用しています。

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

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

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

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/03/27 14:37:35
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

ポイント190pt

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に関して質問です。固定ページのコメント欄を非表示にしたいと思っています。】への回答を参考にしてください。

id:mkusume

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

2013/03/27 14:37:14

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

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

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

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

回答リクエストを送信したユーザーはいません