サポート » テーマ » query_posts:2ページ目の表示は正しいが、個別記事のリンクが1ページ目と同

  • 解決済 gurokazu

    (@gurokazu)


    初めて質問させて頂きます。

    現在query_postsを使用して1ページに4件の最新記事を表示させているのですが、2ページ目の「表示」自体はうまく行っています。(サムネイルやタイトルは5件〜8件目が表示されています。)

    しかし、サムネイルやタイトルをクリックすると1ページ目のリンクと同じ所へ飛んでしまいます。
    つまり、5件目の記事をクリック(2ページ目)すると1件目の記事(1ページ目)、6件目の記事をクリックすると2件目の記事。といった具合になってしまいます。

    フォーラムやgoogleで調べて色々と試してみたのですが、解決策が見つかりません。
    以下のコードを使用しております。

    <?php 
       $paged = get_query_var('paged') ? get_query_var('paged') : 1;
       query_posts('posts_per_page=4&paged='.$paged);
       
       $posts = get_posts('numberposts=n');
       foreach($posts as $post):
    ?>
       <?php the_post(); ?>
       <?php the_title('<h2>','</h2>'); ?>
       <?php endforeach; ?>
      <?php posts_nav_link('|', '< next', 'previous >'); ?>
    <?php wp_reset_query(); ?>

    wordpress 3.5.2
    日本語

    宜しくお願い致します。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • どんなテーマのどのテンプレートファイルのどの部分に書かれたのでしょうか?
    このコードの部分だけみても答えが導き出せません。

    モデレーター gatespace

    (@gatespace)

    コードがいろいろと間違ってます。
    query_posts 使うならget_postsはいらないです。

    現在query_postsを使用して1ページに4件の最新記事を表示させているのですが、

    メインクエリーを4件の表示にしたいだけなら管理画面から1ページに表示する件数を設定できます。
    そうではなくて、例えばフロントページ(トップページ)のみメインクエリーを4件の表示にしてページ送りもするのであれば、(query_postsでも可能ですが) functions.php で pre_get_posts フィルターを使う方法があります。

    もちろん、nekomimiTaichoさんが書かれている

    どんなテーマのどのテンプレートファイルのどの部分に書かれたのでしょうか?

    もです。

    gurokazuさんがどのページでどういう風に表示したいかは最初の投稿とコードからのみでは判断できないので、回答もしづらいです。

    こんにちは、

    サンプルコードを試してみてください

    以下の例は、固定ページテンプレート Query Post Test を選択した場合のものですが、
    他のテンプレートファイルの中でも、動作すると思います。

    ただ、設定・フロントページの表示やカスタマイザーで、フロントページに設定した場合は、動作しません。

    もし、gurokazuさんがフロントページで、このページングをする場合は、home.phpというテンプレートを作成して、以下のコードを記述する事で動作すると思います。

    同様にトップページとして表示される front-page.phpというテンプレートもあり、一応こちらでも、動作するようでしたが、home.phpを使用する事をおすすめします。

    <?php
    /**
     * Template Name: Query Post Test
     */
    	$paged = get_query_var('paged');
    
    	if( empty( $paged ) ) {
    		$paged = 1;
    	}
    
    	query_posts( 'posts_per_page=4&paged='.$paged );
    
    	while ( have_posts() ) {
    
    		the_post();
    
    	?>
    	<li>
    	<a href="<?php the_permalink();?>"><?php the_title( );?></a>
    	</li>
    	<?php
    
    	}
    
    	posts_nav_link('|', '<span class="next">< next</span>', '<span class="prev">previous ></span>');
    
    	wp_reset_query();
    ?>
    トピック投稿者 gurokazu

    (@gurokazu)

    nekomimiTaicho様、
    gatespace様、
    nobita様、

    ご回答ありがとう御座いました。
    また、私の質問の内容が不足していた為混乱をお招きしてしまい大変ご迷惑をおかけ致しました。

    上記のコードは固定ページ(blog.php)を使用し、テンプレートは自作テンプレートを使用しております。

    先ほどnobita様のくださったコードを試した所、無事にうまく表示され問題無く使用する事が出来ました。

    皆様大変有り難う御座いました。

    トピック投稿者 gurokazu

    (@gurokazu)

    今後の勉強の為にお聞きしたいのですが、

    get_query_var('paged') : 1;

    の代わりに

    if( empty( $paged ) ) {
    		$paged = 1;
    	}

    を使用して何ページ目かを取得しているという解釈で宜しいでしょうか?
    お手数おかけ致しますが、ご指導の程を宜しくお願い致します。

    $paged = get_query_var('paged') ? get_query_var('paged') : 1;

    ここの部分は三項演算子という書き方をしていて、「get_query_var(‘paged’)の値があればその値を、なければ1を代入」と言う意味です。

    if文を使うより文は短くなりますが、nobitaさんのようにif文を使って書く方がわかりやすくなります。

    モデレーター gatespace

    (@gatespace)

    $paged = get_query_var('paged') ? get_query_var('paged') : 1;

    も nobitaさんの

    $paged = get_query_var('paged');
    
    if( empty( $paged ) ) {
    	$paged = 1;
    }

    も「$pagedにはget_query_var(‘paged’)の値を入れるが無ければ1にする」という意味は同じです。
    前者は三項演算子、後者は if文 です
    http://php.net/manual/ja/language.operators.comparison.php

    モデレーター gatespace

    (@gatespace)

    (おう、かぶった)

    トピック投稿者 gurokazu

    (@gurokazu)

    お二方、
    ご丁寧に有り難う御座いました。

    2つとも同じ意味を持つ物でしたか。それでは問題がそこでは無いとすると、私の最初の記述ではなぜうまく行かなかったのでしょうか?

    モデレーター gatespace

    (@gatespace)

    2つとも同じ意味を持つ物でしたか。それでは問題がそこでは無いとすると、私の最初の記述ではなぜうまく行かなかったのでしょうか?

    間違っていたのはそこではなくて、query_posts と get_postsの使い方です。

    ご自分の投稿されたコードとnobitaさんのコード のquery_posts 以降を見比べてみてください

    あと、ループ処理の部分は、一般的なPHPだと連想配列なのでforearch文を使いたくなると思いますがwhile文で行ったほうがいいです。

    while ( have_posts() )

    で記事の件数だけ繰り返し、

    the_post();

    で、1件分のデータを取得しています。
    gurokazuさんのコードだと、forearchで1件、the_postで1件という風に記事の取得を2回行う形になっています。

    WordPressのPHPは独自の関数を使い、ちょっと変わった書き方になっていることも多いので、デフォルトのテーマの中でどのように処理をしているか読んでみてから、ご自分のコードに応用したほうが無駄がないコードがかけると思いますよ。

    それと、query_postsでせっかく読み込んでいるのに、get_postsでまた別に記事を読み込む形になっていますから、クエリは1回、ループ1回、reset1回のセットで使いましょう。

    これはWordPressというよりも、データベースからデータを取得するプログラムでは基本的なアルゴリズムだと思います。

    独自でテーマを作るのは試行錯誤で面白いと思いますが、まずはうまく動いているサンプルコードを読み込んでしっかり理解し、プログラムの流れがわかってから応用するのがプログラミングの近道だと思いますので、人のコードなんて読んでられないなんていわずに読んでみてください。

    トピック投稿者 gurokazu

    (@gurokazu)

    gatespaceさん、
    nekomimiTaichoさん、
    大変参考にさせて頂きました。

    自分で最初からテーマ作りがしたくて、参考書&codexを観ながら試行錯誤→「ここをこう使えたらいいのに」→ググる→一部のコードをコピペ→バグ→別の一部のコードをコピペを繰り返す。というようにした結果複雑で自分でも把握出来ないコードが増えて行ってしまいました。

    まずは基本に忠実にやって行く事の大切さを今回学ばせて頂きました。
    本当に有り難うございます。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • トピック「query_posts:2ページ目の表示は正しいが、個別記事のリンクが1ページ目と同」には新たに返信することはできません。