web-dev-qa-db-fra.com

Suspension et reprise des résultats de WP_Query

J'ai un WP_Query personnalisé qui ressemble à ceci:

$query_args = array(
    'post_type'         => 'post',
    'cat'               => 12,
    'posts_per_page'    => 5
);

$custom_query = new WP_Query($query_args);

Maintenant, je dois diviser les résultats de cette requête en 3 séries, la première série aura uniquement le premier poste, la deuxième série aura les 2e et 3e postes, puis la troisième série aura les 4e et 5e postes.

La raison de cette division est que les entrées de chaque ensemble auront un balisage externe et interne différent. Le balisage externe ressemble à ceci:

<div class="column" data-span="6">1st Post Here</div>   

<div class="column" data-span="3">2nd + 3rd Posts Here</div>

<div class="column" data-span="3">4th + 5th Posts Here</div>

Existe-t-il un moyen d’imprimer le premier message de la première div, de mettre la requête en pause, puis de reprendre la requête dans la deuxième div, de mettre en pause et de reprendre la requête dans la troisième?

1
Faisal Khurshid

Je pense que la meilleure façon de procéder consiste à exécuter votre WP_Query une seule fois, mais à accéder ensuite aux résultats de la requête stockés trois fois pour générer chaque ensemble de données souhaité. Cela vous évitera d'utiliser plusieurs requêtes dans la base de données. En utilisant trois boucles distinctes, vous pouvez toujours ajouter un div parent à chaque ensemble de publications selon vos besoins. Voici le concept que je suis venu avec:

<div id="main-content">

    <?php 
        $q = new WP_Query([
            'post_type' => 'post',
            'posts_per_page' => 6
        ]);

        $posts = $q->posts;
    ?>

    <div id="set_1" class="column" data-span="6">
    <?php
        $c = 0;
        foreach ($posts as $a_post) {
            $c++;
            if( $c==1 ) {
                echo $a_post->post_title . " - Post #$c<br>";
                break;
            }
        }
    ?>
    </div>

    <div id="set_2" class="column" data-span="3">
    <?php
        $c = 0;
        foreach ($posts as $a_post) {
            $c++;
            if( $c==2 || $c==3 ) {
                echo $a_post->post_title . " - Post #$c<br>";
            }
        }
    ?>
    </div>

    <div id="set_3" class="column" data-span="3">
    <?php
        $c = 0;
        foreach ($posts as $a_post) {
            $c++;
            if( $c==4 || $c==5 ) {
                echo $a_post->post_title . " - Post #$c<br>";
            }
        }
    ?>
    </div>

</div><!-- end #main-content -->
2
Ben HartLenn

Vous pouvez écrire du code HTML conditionnel, en utilisant l'instruction if pour vérifier l'index et en imprimant du code HTML basé sur celui-ci.

Quelque chose comme:

$custom_query = new WP_Query($query_args);
$i = 1;
while($custom_query->have_posts()): the_post();
    if($i == 1){?> 
        <div class="column" data-span="6">1st Post Here</div>   <?php }
    elseif($i == 2 || $i == 3){?> 
        <div class="column" data-span="6">1st Post Here</div>   
    <?php }
    else{?> 
        <div class="column" data-span="6">1st Post Here</div>   
    <?php }
endwhile;

Si seule la différence est data-span dans votre code HTML, vous pouvez ignorer la deuxième condition et utiliser

<div class="column" data-span="<?php echo ($i==1)?6:3;?>">your Post Here</div>
0
Aniruddha Gawade

Essaye ça:

Vous utiliserez la variable $ gottenposts pour enregistrer les identifications d'articles. Ensuite, vous ferez une nouvelle requête lorsque vous souhaitez afficher les autres publications, à l'exception des publications déjà imprimées.

Votre première requête

<?php $gottenposts = array(); //here you will save the posts ids
$args = array('post_type' => 'post', 'posts_per_page' => 6); 
$query = new WP_Query($args); 
if($query->have_posts()) : 
 while($query->have_posts()) : 
   $query->the_post();?>
 //your HTML code here
<?php endwhile; endif; ?>

Votre seconde requête

<?php $args = array('post_type' => 'post', 'posts_per_page' => -1, 'post__not_in' => $gottenposts ?>
//ETC...

J'espère que cela t'aides!

0
Patrick Oliveira