web-dev-qa-db-fra.com

Empêcher la publication en double de boucles multiples dynamiques

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:

  • Poster
  • Poster
  • Poster
  • Poster
  • Poster
  • Type de message personnalisé
  • Poster
  • Poster
  • Poster
  • Poster
  • Poster
  • Type de message personnalisé .. et ainsi de suite.

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!

1
helmiaditya14

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
    }
  }
}
3
s_ha_dum