J'essayais de répertorier 20 publications récentes et de mettre une publication de type publication personnalisée sur chaque 5ème élément. Alors c'est comme:
Voici ce que j'ai fait jusqu'à présent. Cela fonctionne, mais les types d'articles personnalisés continuent à être dupliqués, même lorsque l'ordre a été défini sur aléatoire.
<?php $counter = 1;
$loop = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => 20) );
while ( $loop->have_posts() ) : $loop->the_post(); ?>
<li class="group">
Post Content
</li>
<?php
if ($counter % 5 == 0){
$inner_query = new WP_Query(array( 'post_type' => 'custom-type', 'posts_per_page' => 1, 'orderby' => 'Rand'));
while ($inner_query->have_posts()) : $inner_query->the_post(); ?>
<li>Custom Post Type Content</li>
<?php endwhile;
}
$counter++ ;
endwhile; ?>
Comment empêcher les publications en double sur le type de publication personnalisée?
Merci!
Ne lancez pas une nouvelle requête pour votre CPT à chaque itération de la boucle principale. Tirez-le une fois, en dehors de l'apparence avec 'posts_per_page' => 4
, puis incrémentez-le au fur et à mesure.
En d'autres termes:
$counter = 1;
$loop = new WP_Query(
array(
'post_type' => 'post',
'posts_per_page' => 20
)
);
$inner_query = new WP_Query(
array(
'post_type' => 'page',
'posts_per_page' => 4,
'orderby' => 'Rand'
)
);
while ( $loop->have_posts() ) {
$loop->the_post(); ?>
<li class="group"><?php
the_title();
echo '('.$post->post_type.')'; ?>
</li><?php
if ($counter == 5) {
if ($inner_query->have_posts()) {
$inner_query->the_post(); ?>
<li><?php
the_title();
echo '('.$post->post_type.')'; ?>
</li><?php
}
$counter = 0;
}
$counter++ ;
}
Vous devez faire très attention aux compteurs et réfléchir à la logique sinon vous obtiendrez des résultats inattendus.
Deuxièmement, j'ai simplifié votre logique. Le calcul mod
n'est pas nécessaire si vous utilisez un compteur comme vous le faites. Cependant, il existe un moyen de supprimer complètement le compteur, puisque WP_Query
en fournit un pour vous.
while ( $loop->have_posts() ) {
$loop->the_post(); ?>
<li class="group"><?php
the_title();
echo '('.$post->post_type.') ('.$loop->current_post.')'; ?>
</li><?php
if ($loop->current_post != 0 && ($loop->current_post+1) % 5 == 0) {
if ($inner_query->have_posts()) {
$inner_query->the_post(); ?>
<li><?php
the_title();
echo '('.$post->post_type.')'; ?>
</li><?php
}
}
}