web-dev-qa-db-fra.com

Inclure les posts collants dans le nombre de posts de page pour une requête personnalisée

Ce lien résout le problème mais il ne concerne que la requête principale. Et si vous utilisez une requête personnalisée? Comment pouvez-vous modifier la réponse ci-dessous:

add_action('pre_get_posts', 'ad_custom_query');
function ad_custom_query($query) {

    if ($query->is_main_query() && is_home()) { //how can we for specific custom query?

        // set the number of posts per page
        $posts_per_page = 12;
        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );

        // if we have any sticky posts and we are at the first page
        if (is_array($sticky_posts) && !$query->is_paged()) {

            // counnt the number of sticky posts
            $sticky_count = count($sticky_posts);

            // and if the number of sticky posts is less than
            // the number we want to set:
            if ($sticky_count < $posts_per_page) {
                $query->set('posts_per_page', $posts_per_page - $sticky_count);

            // if the number of sticky posts is greater than or equal
            // the number of pages we want to set:
            } else {
                $query->set('posts_per_page', 1);
            }

        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set('posts_per_page', $posts_per_page);
        }
    }
}
2
jkcoding

Je pense que nous pouvons essayer ce qui suit: (NOTE:Ceci n’a pas été testé mais devrait en théorie fonctionner, mais rappelez-vous qu’il n’a pas été testé et peut être buggy)

add_action('pre_get_posts', 'ad_custom_query');
function ad_custom_query($query) {
    // No other checks should be necessary
    if ( $query->get( 'custom_query' ) === 1 ) ) {
        // set the number of posts per page
        $posts_per_page = 12;
        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );

        // if we have any sticky posts and we are at the first page
        if (is_array($sticky_posts) && !$query->is_paged()) {

            // counnt the number of sticky posts
            $sticky_count = count($sticky_posts);

            // and if the number of sticky posts is less than
            // the number we want to set:
            if ($sticky_count < $posts_per_page) {
            $query->set('posts_per_page', $posts_per_page - $sticky_count);

            // if the number of sticky posts is greater than or equal
            // the number of pages we want to set:
            } else {
                $query->set('posts_per_page', 1);
            }

        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set('posts_per_page', $posts_per_page);
        }
    }
}

Vous pouvez maintenant simplement lancer la requête personnalisée suivante

$args = [
    'custom_query' => 1, // Note, this has to be an integer, '1' will not work
    'paged' = > $paged
// I would just add all the other parameters in the pre_get_posts action
];
$q = new WP_Query( $args );

QUELQUES NOTES:

  • Etant donné que nous ne ciblerons que les requêtes pour lesquelles le nouveau paramètre custom_query est défini sur 1, nous ne devrions pas avoir besoin de vérifications telles que !is_admin() ou is_main_query().

  • Étant donné que nous exécutons une action pre_get_posts sur notre requête personnalisée, je voudrais simplement définir le paramètre custom_query et paged dans les arguments de la requête. Tout autre paramètre que je voudrais simplement ajouter dans l'action pre_get_posts.

  • Si vous devez exécuter une seconde requête avec des paramètres et/ou des valeurs différents, vous pouvez simplement définir custom_query sur 2 et simplement vérifier si la fonction $query->get( 'custom_query' ) a la valeur 2, comme if ( $query->get( 'custom_query' ) === 2 ) {.

  • Je viens de copier votre code et d'ajouter le nouveau contrôle de paramètre, je n'ai pas travaillé sur votre code ni changé quoi que ce soit

1
Pieter Goosen

Au lieu de créer une fonction, je viens de modifier la boucle avec la requête personnalisée. Mon exemple est pour un seul post à afficher.

Je viens d'utiliser si déclaration si un ou plusieurs collants montrent simplement le premier collant.

<?php
$sticky_posts = get_option( 'sticky_posts' );
$sticky_count = count($sticky_posts);

if($sticky_count >= 1) {
    $loop = new WP_Query('p=' . $sticky_posts[0]); //show only first sticky
} else {
    $loop = new WP_Query( array( 'post_type' => 'post', 'category__not_in' => 'featured', 'posts_per_page' => 1 ) ); //if none show just the first non-sticky post
}

while ( $loop->have_posts() ) : $loop->the_post();
?>
1
jkcoding