web-dev-qa-db-fra.com

La condition WP_Query affecte le nombre de posts_per_page

J'essaie de créer un nouveau WP_Query qui affiche les 5 derniers messages de la catégorie 1 sans vignette. Cela fonctionne réellement:

<?php
$the_query = new WP_Query( 'cat=1&posts_per_page=5' );
while ( $the_query->have_posts() ) :
    $the_query->the_post(); if ( ! has_post_thumbnail() ) { ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php } endwhile; 
wp_reset_query();
wp_reset_postdata(); 
?>

Mais disons des 5 derniers articles, 3 ont la vignette; dans ce cas, seuls 2 articles sont affichés. J'aimerais avoir 5 comme nombre fixe de posts_per_page et si dans la boucle finissent les publications avec vignette, les publications plus anciennes sont affichées (pour atteindre le nombre de 5), au lieu d'afficher uniquement les 2 sans vignette.

J'ai essayé de mettre la if avant $the_query mais cela n'a pas fonctionné.

1
MultiformeIngegno

Vous pouvez essayer de récupérer des publications qui n’ont pas d’image sélectionnée avec:

$ppp = 5; // posts per page

/**
 * Fetch $ppp posts, without thumbnails, in a given category:
 */
$args = array(
    'cat'            => 1,
    'posts_per_page' => $ppp,
    'meta_query' => array(
        array(
            'key'     => '_thumbnail_id',
            'compare' => 'NOT EXISTS',
        ),
    ),
);
$myposts = get_posts( $args );

Mais que se passe-t-il s'il n'y a pas assez de messages, sans image sélectionnée, dans cette catégorie? Eh bien, alors nous pouvons simplement remplir le reste avec des messages avec une image sélectionnée:

/**
 * Fetch $ppp-x posts in a given category, with thumbnails, if x > 0:
 */
if( $count = count( $posts ) < $ppp ) 
{  
    $args = array(
        'cat'            => 1,
        'posts_per_page' => $ppp - $count,
        'meta_query' => array(
            array(
                'key'     => '_thumbnail_id',
                'compare' => 'EXISTS',
            ),
        ),
    );
    $myposts = array_merge( $posts, get_posts( $args ) );
}

Ensuite, vous pouvez configurer votre boucle avec:

global $post;
foreach( $myposts as $post ) 
{
    setup_postdata( $post );
    ?><li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li><?php
}
wp_reset_postdata();

Vous pouvez également vouloir vérifier si vous avez suffisamment de messages dans la catégorie correspondante.

Notez que ceci n’a pas été testé, mais j’espère que vous pourrez le modifier selon vos besoins.

ps: Si je me souviens bien, @kaiser a déjà résolu un problème similaire dans le cas général, avec quelques variantes supplémentaires ;-)

Je vais ajouter un lien si je le trouve.

Mise à jour: Je l'ai trouvé ici . Il y a des réponses intéressantes là-bas.

1
birgire