web-dev-qa-db-ja.com

query_postsとページネーション、まだ多くの研究の後に立ち往生

いくつかのカスタム投稿をページ付けする必要があります。理由はわかりませんが、次のページに進むと404が表示されます。これが私のコードです。

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

query_posts( array( 'post_type' => 's_stories', 'posts_per_page' => 4 , 'paged'=>$paged) );

if (have_posts()){ 

while (have_posts()) { the_post(); ?>


<div class="post">
<h2 class="title"><a href="<?php echo get_permalink($post->ID); ?>"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>

</div> <!-- end post -->

<div class="clear"></div>

<?php } }  ?>

<div class="paging">


    <div style="float:left; font-weight:bold"><?php next_posts_link('&laquo; Previous Story') ?></div>
    <div style="float:right; font-weight:bold"><?php previous_posts_link('Next Story &raquo;') ?></div>

</div>

「paged」値と投稿ナビゲーションが表示されました。何か考えていることがあります。

ありがとう:)

1
Dan

query_posts は使用しないでください。これはあなたがしたときに何が起こるかの典型的な例です:)

基本的に、WordPressはURLを受け取ると、これをクエリとして解釈します - 次にデータベースにクエリして結果があればそれを探し、適切なテンプレート(結果がない場合は404.phpなど)を提供します。

テンプレートページにたどり着いた場合 - そのクエリを破棄し、新しいクエリを開始するように指示されます(これは無駄です)。そしてページネーションを壊します。

基本的にページネーションは現在のURLにpagedクエリ変数を追加します - この新しいURLは(例えば2ページ目に連れて行ってくれるでしょう) - 2ページ目を受け取るためのクエリの基礎を形成します結果は破棄され、query_postsで新しいクエリが開始されます。最終的には、不要なクエリが実行され、結果が表示されないため、404テンプレートが提供され、テンプレートはあなたのquery_postsには決して届きません。

上記のリンクされた投稿を見て、query_postに代わるものを見つけてください。ただし、これが 'メインクエリ'(受信したURLに基​​づくクエリ)なので、 pre_get_posts .

2
Stephen Harris

これを試して...

<?php
  global $paged; global $wp_query;
  $temp = $wp_query; $wp_query= null; $wp_query = new WP_Query();
  $wp_query->query('showposts=XX&post_type=POST_TYPE_NAME'.'&paged='.$paged);
  while ($wp_query->have_posts()) : $wp_query->the_post(); 
?>

    // do your content output here...

<?php endwhile; ?>

   // do pagination here...

<?php $wp_query = null; $wp_query = $temp;?>
2
userabuser

query_posts()は一般的に使われるべきではありません、そして特にあなたが改ページをめちゃくちゃにしようとしているならば。

ページ付けと404ロジックの両方がテンプレートファイル(とその中のquery_posts())がロードを開始する前にさえ起こります。

ページのメインクエリを微調整するための最良の選択肢の一つは、 pre_get_posts フックを使うことです。

1
Rarst