web-dev-qa-db-ja.com

WP_Queryと複数のループによるページ付け/無限スクロール

私は私のサイトのメインページが3つのコラムを持っている必要があります。 - 5つの最も見られた投稿を持っている最初の。 - 次の5最も見られた記事で2番目。 - 最新の投稿の3番目。

同じ列や別の列で投稿が繰り返されないようにするため、wp_queryを使用して、必要な数の投稿を取得します。これは、単純なページ区切りまたは無限スクロールを使用して2ページ目を読み込んだときに起こることです。

  • 最初のループは、5番目から10番目に閲覧数の多い投稿をロ​​ードします。これは、2番目のループの最初の実行ですでに表示されています。
  • 2番目のループは次に閲覧された5つの投稿をロードします。それらは最初の実行時に3番目のループに既にロードされています。
  • 3番目のループは最新の投稿をロードしますが、最初のループまたは2番目のループではロードされていません。

まだ次のページを読み込んでいる間に、3番目のループに投稿があるまで2番目のループに投稿がなくなり、最初のループにすべての投稿が読み込まれるまで、ループはそれぞれの投稿を読み込みます。

これが私が使っているコードです:

<div id="content">

<div class="recentColumn">
<div class="columnContent">

<?

$hotArgs =  array(
    'post__not_in' => $loaded,
    'meta_key' => 'wpb_post_views_count', // Pega o número de visitas do post.
    'orderby' => 'meta_value_num', // Ordena do mais visitado para o menos visitado.
    'posts_per_page' => '2',
    'paged' => $paged
    );
$hot = new WP_Query( $hotArgs );


if ($hot->have_posts()) : while ($hot->have_posts()) : $hot->the_post();
$loaded[] = $post->ID;
?>

<div class="articleContent">
<article class="recent" role="article">

    <a href="<?php the_permalink();?>" title="<?php the_title();?>"><?php the_category();?>

    <header>
    <h1><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h1>
    <?php the_excerpt(); ?>
    </header>

</article>
</div>

<?php endwhile; endif; ?>

</div>
</div>




<div class="popularColumn">
<div class="columnContent">

<?
$nextArgs =  array(
    'post__not_in' => $loaded,
    'meta_key' => 'wpb_post_views_count', // Pega o número de visitas do post.
    'orderby' => 'meta_value_num', // Ordena do mais visitado para o menos visitado.
    'posts_per_page' => '3',
    'paged' => $paged
    );
 $next = new WP_Query( $nextArgs );

if ($next->have_posts()) : while ($next->have_posts()) : $next->the_post();
$loaded[] = $post->ID; 
?>

<div class="articleContent">
<article class="popular" role="article">
        <a href="<?php the_permalink();?>" title="<?php the_title();?>"><?php the_category();?>

        <header>
        <h1><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h1>
        </header>

</article>
</div>

<?php endwhile; endif; ?>

</div>
</div> 



<div class="randomColumn">
<div class="columnContent">

<?  
$recentsArgs =  array(
    'post__not_in' => $loaded,
    'posts_per_page' => '3',
    'paged' => $paged
    );
 $recents = new WP_Query( $recentsArgs );

if ($recents->have_posts()) : while ($recents->have_posts()) : $recents->the_post();
$loaded[] = $post->ID;
?>


<div class="articleContent">
<article class="random" role="article">
        <header>
        <h1><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h1>
        </header>

</article>
</div>

<?php endwhile; endif; ?>

</div>
</div>

解決策は、すでにロードされている投稿のIDを格納するphpセッションまたは変数を使用し、ループ内で投稿が続行される前にロードされているかどうかを確認することであると思います。私はこれを作ろうとしましたが、うまくいきませんでした。私はphpに関するスキルが少なすぎるので、どうやってそれを機能させるかについて誰かがもっと良い考えを持っているかもしれません。

私はどんな助けにも感謝します。ありがとう。

3

これはあなたの問題を解決しないかもしれませんが、それはカスタムクエリを作成するために将来あなたを助けるでしょう。複数のクエリをページ区切りにすると、非常にトリッキーになります。デフォルトでは、Wordpressのページネーション機能には、複数のクエリをページ分割するためのロジックはありません。あなたは複数のクエリを実行し、何らかの方法でそれらをマージする必要があります。

それでは、今指摘したいことがあります。カスタムクエリを正しく作成する方法については、 コーデックスのWP_Query をご覧ください。ここでの問題は、3つのカスタムクエリをリセットせずに実行していることです。これにより、前のクエリに続く他のクエリはすべて無効になります。

作成したすべてのカスタムクエリをリセットすることが最も重要です。HAVE TOしてください。各クエリの後に wp_reset_postdata(); を呼び出すだけで$post変数を復元できます。提供されているリンクの例を見てください。

1
Pieter Goosen

データベースから$loaded配列を再作成できます。

$hot_ppp = 3;
$next_ppp = 3;
$recents_ppp = 3;

if ( $paged > 1 ) {
    $prev_hot_next_loaded = $wpdb->get_col( $wpdb->prepare(
        'SELECT ID FROM ' . $wpdb->posts . ' p JOIN ' . $wpdb->postmeta . ' pm ON pm.post_id = p.ID AND pm.meta_key = %s'
        . ' WHERE p.post_type = %s AND p.post_status = %s ORDER BY pm.meta_value+0 DESC LIMIT %d',
        'wpb_post_views_count', 'post', 'publish', ( $hot_ppp + $next_ppp ) * ( $paged - 1 )
    ) );
    $prev_recents_loaded = $wpdb->get_col( $wpdb->prepare(
        'SELECT ID FROM ' . $wpdb->posts . ' WHERE ID NOT IN (' . implode(',', $prev_hot_next_loaded ) . ')'
        . ' AND post_type = %s AND post_status = %s ORDER BY post_date DESC LIMIT %d',
        'post', 'publish', $recents_ppp * ( $paged - 1 )
    ) );

    $loaded = $prev_hot_next_loaded + $prev_recents_loaded;
}
0
bonger