web-dev-qa-db-fra.com

Inclure les poteaux collants dans les messages de page

Je voudrais 7 messages montrant sur ma page d'accueil. J'aimerais pouvoir choisir manuellement ces messages en les collant.

Actuellement, mes publications par page sont définies sur '7' dans WP Admin. Toutefois, cela n’inclut pas les messages collants, car j’ai maintenant 7 messages collants + 7 messages publiés les plus récents, pour un total de 14 .

Comment inclure les posts collants dans les posts par nombre de pages?

2
Travis Patron

C'est faisable, et comme je l'ai dit dans un commentaire, vous devez suivre les étapes suivantes

  • Obtenez un compte de la quantité de messages collants. Cela peut être fait en comptant simplement get_option( 'sticky_posts' ) qui contient les identifiants des posts collants sous la forme d'un tableau

  • Vous devez également connaître le nombre de messages par page. Vous ne voulez pas coder en dur ici. La quantité de messages par page est stockée dans get_option( 'posts_per_page' ), vous allez donc utiliser cette

  • L’important est maintenant d’utiliser des décalages pour recalculer le nombre de publications à afficher sur la première page à partir de la requête principale. Comme par exemple dans l'OP, si le nombre de publications par page est de 7 et qu'il y a 4 posts collants, nous ne voulons que trois publications de la requête principale, et non les sept définies par défaut du site. A partir de la page 2, nous aurons toujours besoin des 7 messages normaux à afficher de la requête principale, car nous n'aurons pas de messages collants ici.

  • Toutefois, ce décalage aura une influence sur le calcul de la propriété $max_num_pages dans la requête principale. Dans la plupart des cas, la dernière page sera manquante. Pour corriger cela, nous devons ajuster le nombre de publications trouvées, en ajoutant essentiellement notre décalage au nombre réel de publications trouvées afin de corriger le nombre de pages. Cela se fera à travers le filtre found_posts

( NOTE: Ce code est maintenant testé et fonctionne )

Voici l'idée de base dans le code:

add_action( 'pre_get_posts', function ( $q ) 
{

    if ( $q->is_main_query() && $q->is_home() ) {

        $count_stickies = count( get_option( 'sticky_posts' ) );
        $ppp = get_option( 'posts_per_page' );
        $offset = ( $count_stickies <= $ppp ) ? ( $ppp - ( $ppp - $count_stickies ) ) : $ppp;

        if (!$q->is_paged()) {
          $q->set('posts_per_page', ( $ppp - $offset ));
        } else {
          $offset = ( ($q->query_vars['paged']-1) * $ppp ) - $offset;
          $q->set('posts_per_page',$ppp);
          $q->set('offset',$offset);
        }

    }

});    

add_filter( 'found_posts', function ( $found_posts, $q ) 
{

    if( $q->is_main_query() && $q->is_home() ) {

        $count_stickies = count( get_option( 'sticky_posts' ) );
        $ppp = get_option( 'posts_per_page' );
        $offset = ( $count_stickies <= $ppp ) ? ( $ppp - ( $ppp - $count_stickies ) ) : $ppp;        

        $found_posts = $found_posts + $offset;
    }
    return $found_posts;

}, 10, 2 );     
5
Pieter Goosen