web-dev-qa-db-fra.com

Limiter le nombre de pages en pagination

J'ai plus de 500 messages et je veux limiter à 100 messages avec la pagination. Donc, 10 pages avec 10 articles dans chacune. En vous présentant le code:

$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$posts = get_posts( 
    array(
        'numberposts' => 10,
        'paged'       => $paged,
        'meta_key'    => 'property',
        'orderby'     => 'meta_value_num', //or 'meta_value_num'
        'order'       => 'DESC',
    )
);
if( $posts ) {
    $count = 0;
    foreach( $posts as $post ) {
        setup_postdata( $post );
        // post stuff
        $count++; 
    }
    wp_reset_postdata();
}
1
Hussain Ansari

Avant de commencer, n'utilisez pas get_posts pour les requêtes paginées. get_posts interrompt légalement la pagination et ne renvoie pas l'objet de requête. Si vous avez besoin de paginer les requêtes, utilisez WP_Query

En ce qui concerne votre problème, je ne pense vraiment pas qu'il soit possible de limiter le nombre total de messages à 100 uniquement lorsque la pagination est nécessaire. Les seuls scénarios auxquels je peux penser sont:

  • Supprimez les liens de page de la page 10, mais vous pouvez à nouveau entrer manuellement la page 11 et voir les messages de la page 11

  • Exécutez une fonction personnalisée lorsqu’une nouvelle publication est publiée pour changer le statut de publication de la 101ème publication et les publications séquentielles en quelque chose d’autre, tel que draft. Par défaut, WP_Query interroge uniquement les articles published pour tous les utilisateurs et les articles extra private pour les utilisateurs connectés. Donc, si vous changez le statut des publications, ces publications seront exclues

  • Une autre méthode moins intrusive consiste à exécuter deux requêtes. Le premier, qui sera très basique et allégé, renverra l'ID de l'article seulement des 100 premiers articles. Cet identifiant sera transmis à la deuxième requête qui obtiendra 10 messages par page et ne comportera que 10 pages, car nous ne lui transmettons que 100 identifiants. L'avantage ici est que si vous entrez manuellement la page 11, vous obtiendrez une page 404.

EXEMPLE DE POINT 3

Comme je l'ai dit, le point 3 est la meilleure option ici. Nous utiliserons get_posts pour la première requête car elle coupe la pagination, ce qui accélère votre requête, et nous obtiendrons uniquement l'ID de publication qui rend la requête complète 99,9% plus rapide que la normale. Dans l'ensemble, l'impact sur la page est presque nul. Pour notre deuxième requête, nous utiliserons WP_Query et le paramètre post__in pour obtenir notre liste de publications paginée.

( Ce code n'a pas été testé et nécessite PHP 5.4+ )

$args = [
    'posts_per_page' => 100,
    'fields' => 'ids',
    // Add additional args here
];
$post_ids = get_posts( $args );

if ( $post_ids ) {
    $args_2 = [
        'paged' => $paged,
        'post__in' => $post_ids,
        'posts_per_page' => 10,
    ];
    $q = new WP_Query( $args_2 );
    while ( $q->have_posts() ) {
    $q->the_post();
        // YOUR LOOP
    }
    next_posts_link( 'Next Posts', $q->max_num_pages );
    previous_posts_link( 'Previous Posts' ); 
    wp_reset_postdata();
}
3
Pieter Goosen

Peut-être que ça aide

function wpcodex_filter_main_search_post_limits( $limit, $query ) {     
  return 'LIMIT 0, 100'; 
} 
add_filter( 'post_limits', 'wpcodex_filter_main_search_post_limits', 10, 2 );

Plus: post_limits filter

4
Trang

Essayez ce code qui vous aidera à n’afficher que 10 pages.

C'est le code où vous voulez afficher le message:

<?php 
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array( 'post_type' => 'property', 'posts_per_page' => 10,'paged'=> $paged,'orderby'=> 'meta_value_num','order'=> 'DESC');
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
print_r($post); ?>
<h1> <?php the_post_thumbnail(); ?></h1>
<h2><?php the_title(); ?></h2>
<h3><?php the_content(); ?></h3>
<?php endwhile; ?>

C'est le pied de page où vous devez afficher la pagination.

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php if($loop->max_num_pages > 1 && $loop->max_num_pages < 11 ) { ?>
<ul class="pager">
<?php for($i=1;$i<=$loop->max_num_pages; $i++){ ?>
<li><a href="<?php  get_permalink();?>page/<?php echo $i; ?>"> <?php echo $i; ?></a></li>
<?php } ?>
</ul>
<?php } else if($loop->max_num_pages > 1 && $loop->max_num_pages > 10) {  ?>
<ul class="pager">
<?php for($i=1;$i<=10; $i++){ ?>
<li><a href="<?php  get_permalink();?>page/<?php echo $i; ?>"> <?php echo $i; ?></a></li>
<?php } ?>
</ul>
<?php } else{ ?>

<?php } ?>
0
Anand