it-swarm.com.de

Wie platziere ich eine Schleife in einer anderen Schleife?

Ich habe zwei Schleifen mit WP_Query eingerichtet: $latest und $popular, an deren Einrichtung ich in diesem Beispiellayout arbeite:

Neueste Beliebte

enter image description here

Beispiel HTML-Ausgabe

<div class="content">

    <div class="posts latest">
        <post1>    
        <post2>
    </div>

    <div class="posts popular">
        <post10>    
        <post9>
        <post8>    
        <post7>
    </div>

    <div class="ad-block">
        <ad>
    </div>

</div>

<div class="content">

    <div class="posts latest">
        <post3>    
        <post4>
    </div>

    <div class="posts popular">
        <post6>    
        <post5>
        <post4>    
        <post3>
    </div>

    <div class="ad-block">
        <ad>
    </div>

</div>

[...]

Einfach ausgedrückt: Die Latests und Popular Post-Divs werden nebeneinander verschoben und alle paar Posts getrennt, um einen Anzeigenblock mit voller Breite aufzunehmen.

Meine Schleife

<div class="content">

    <div class="posts latest">

        <?php

        $args1 = array (
            'posts_per_page'    => 1000000,
            'order'             => 'DESC',
            'orderby'           => 'date'

        );

        $latest = new WP_Query( $args1 );

        if ( $latest -> have_posts() ) :

            $count = 0;

            while ( $latest -> have_posts() ) : $latest -> the_post();

                $count++;

                if ( $count % 5 == 0 ) :

                        get_template_part( 'template', 'post' ); ?>

                        </div> <!--/posts-latest-->

                        <div class="posts popular">

                            <?php

                            $args2 = array (
                                'posts_per_page'    => 10,
                                'order'             => 'ASC',
                                'orderby'           => 'date',
                            );

                            $popular = new WP_Query( $args2 );

                            if ( $popular -> have_posts() ) :

                                while ( $popular -> have_posts() ) : $popular -> the_post();

                                    get_template_part( 'template', 'post' );

                                endwhile;

                            endif;

                            ?>

                        </div> <!--/posts-popular-->

                        <div class="ad-block">
                            <?php get_template_part( 'template', 'ad' ); ?>
                        </div>

                    </div><!--/content-->    

                    <div class="content">

                        <div class="posts latest">

                <?php

                else :

                    get_template_part( 'template', 'post' );

                endif;

            endwhile;

        endif; wp_reset_postdata();

        ?>

    </div> <!--/posts-latest-->    

</div>

Im Moment ist dies so eingestellt, dass bei jedem fünften Beitrag in der $latest-Schleife die $popular-Schleife und ein Werbeblock hinzugefügt werden.

Ich verstehe, warum das nicht funktioniert ... Weil jeder fünfte Beitrag, wenn die $popular-Schleife aufgerufen wird, erneut gestartet wird, anstatt in der richtigen Reihenfolge fortzufahren.

Irgendwelche Ideen, wie ich diese Arbeit machen kann?

4
Rich

Versuchen Sie Folgendes: Wir deklarieren einen Inkrementierer am oberen Rand unserer Outter-Schleife mit dem Namen $popularLoop, um zu verfolgen, wie viele beliebte Schleifen wir durchlaufen haben. Wir gehen davon aus, dass wir mindestens 1 erreichen werden.

In unserer Inner Loop (populär) müssen wir festlegen, wie viele Posts pro Seite wir laden wollen, multiplizieren mit der Anzahl der populären Loops, die wir durchlaufen haben, und das gibt uns unseren Offset. Am Ende unserer inneren Schleife erhöhen wir $popularLoop, damit unser Offset konsistent bleibt:

<div class="content">

    <div class="posts latest">

        <?php

        $args1 = array (
            'posts_per_page'    => 1000000,
            'order'             => 'DESC',
            'orderby'           => 'date'

        );

        $latest = new WP_Query( $args1 );
        $popularLoop = 0;

        if ( $latest -> have_posts() ) :

            $count = 0;

            while ( $latest -> have_posts() ) : $latest -> the_post();

                $count++;

                if ( $count % 5 == 0 ) :

                        get_template_part( 'template', 'post' ); ?>

                        </div> <!--/posts-latest-->

                        <div class="posts popular">

                            <?php
                            $popular_ppp = 10;
                            $popularOffset = $popular_ppp * $popularLoop;
                            $args2 = array (
                                'posts_per_page'    => $popular_ppp,
                                'offset'            => $popularOffset,
                                'order'             => 'ASC',
                                'orderby'           => 'date',
                            );

                            $popular = new WP_Query( $args2 );

                            if ( $popular -> have_posts() ) :

                                while ( $popular -> have_posts() ) : $popular -> the_post();

                                    get_template_part( 'template', 'post' );

                                endwhile;

                              $popularLoop++;
                            endif;

                            ?>

                        </div> <!--/posts-popular-->

                        <div class="ad-block">
                            <?php get_template_part( 'template', 'ad' ); ?>
                        </div>

                    </div><!--/content-->    

                    <div class="content">

                        <div class="posts latest">

                <?php

                else :

                    get_template_part( 'template', 'post' );

                endif;

            endwhile;

        endif; wp_reset_postdata();

        ?>

    </div> <!--/posts-latest-->    

</div>
3
Howdy_McGee