web-dev-qa-db-ja.com

壊れたページネーション

3週間前の この記事の と同じ問題を抱えていますが、それ以降に何が起こったのか説明しましょう。

私はもともとフロントページの一番上に最新のスティッキーポストを表示するために1つのループを使用していました。これが現状のコードです。

// first loop to display only my single, MOST RECENT sticky post
$sticky = get_option('sticky_posts');
$wp_query = new WP_Query(array('post__in' => $sticky, 'caller_get_posts' => 1, 'orderby' => ID, 'showposts' => 1)); ?>
<?php while (have_posts()) : the_post(); ?>
    <!-- loop code -->
<?php endwhile; wp_reset_query(); ?>

// second loop to display every other post, excluding sticky posts
<?php query_posts(array('post__not_in' => get_option('sticky_posts'))); // exclude all sticky posts ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <!-- loop code -->
<?php endif; wp_reset_query(); ?>

ここで起こっていることは完璧です...フロントページだけのために。私は一番上に私のニースの単一/最新の付箋投稿を受け取り、その後にさらに5つの投稿が続きます。残念ながら、2、3、4などのページにページオーバーしても、フロントページのスティッキーポストの下にあるのと同じ5つの投稿しか表示されません。

私は多重ループの概念を持っているのでまったく新しいので、ここで本当に手を使うことができました!

前もって感謝します :)

2
user6674

私はあなたの問題におそらく寄与しているいくつかの問題を見ます:

  1. プライマリループを変更するためにquery_posts()を使用することだけです。
  2. caller_get_postsパラメータは推奨されなくなりましたignore_sticky_postsのために
  3. $wp_query変数は定義済みグローバルです。本来の用途以外で使用すると、意図しない状況を引き起こす可能性があります。

それで、最初に、どちらがあなたの主要なループであるかを決定する必要があります。これを2番目のループと見なします。

次に、$most_recent_sticky_postのように、あなたの二次ループのためのユニークでわかりやすい名前(つまりあなたの最初ループ)を思いついてください。

それはあなたに任せるべきです:

<?php
// Get IDs of sticky posts
$sticky = get_option('sticky_posts');
// first loop to display only my single, 
// MOST RECENT sticky post
$most_recent_sticky_post = new WP_Query( array( 
    // Only sticky posts
    'post__in' => $sticky, 
    // Treat them as sticky posts
    'ignore_sticky_posts' => 0, 
    // Order by ID
    'orderby' => ID, 
    // Get only the one most recent
    'showposts' => 1
) );
while ( $most_recent_sticky_post->have_posts() ) : $most_recent_sticky_post->the_post(); ?>
    <!-- loop code -->
<?php endwhile; wp_reset_query(); ?>

// second loop to display every other post, 
// excluding sticky posts
<?php 
query_posts( array( 
    // exclude all sticky posts
    'post__not_in' => get_option( 'sticky_posts' ) 
) );  
if (have_posts()) : while (have_posts()) : the_post(); ?>
    <!-- loop code -->
<?php endif; wp_reset_query(); ?>

さて、あなたはもはや$wp_queryに踏み込んでいないので、あなたのページ付け正しく動くはずです。

編集する

さて、他のもの:

  1. showpostsパラメータはでも推奨されていません。代わりにpost_per_pageを使用してください。
  2. 一次ループに対して、 クエリ変数マージしてみましょう。

例えば。:

// Define custom query args
$custom_query_args = array( 
    // exclude all sticky posts
    'post__not_in' => get_option( 'sticky_posts' ) 
);  
// globalize $wp_query
global $wp_query;
// Merge custom args with default query args
$merged_query_args = array_merge( $wp_query->query, $custom_query_args );
// process the query
query_posts( $merged_query_args );

これによって違いが生じることはわかりませんが、この方法でデフォルトのクエリを変更することをお勧めします。

  1. それでもうまくいかない場合は、ページングを使用することになっていることをquery_posts()に強制的に記憶させてください。 'paged' => get_query_var('paged')$custom_query_args配列に追加します。

例えば.

  // Define custom query args
  $custom_query_args = array( 
      // exclude all sticky posts
      'post__not_in' => get_option( 'sticky_posts' ),
      // don't forget to paginate!
      'paged' => get_query_var('paged')
  );  

それは私たちをどこに導きますか?

2
Chip Bennett

WP_Queryでページングパラメータを使用してはいけません

 $posts = new WP_Query( array( /*your args here*/, 'paged' => get_query_var( 'page' ) ) );

WPバージョンによってはget_query_var( 'paged')になると思います。

WP_Queryページ付けパラメータはこちら

0
Shane