web-dev-qa-db-fra.com

Les archives de types de messages personnalisés ne concernent pas 'posts_per_page' => -1

J'ai une archive de type de publication personnalisée où WP_Query est utilisé pour récupérer les publications. Je souhaite désactiver la pagination et afficher tous les articles de cette archive, mais la requête suivante ne fonctionne pas:

$args = array(
    'post_type' => array(
        'cpt_sports',
    ),
    'posts_per_page' => -1,
    'orderby' => 'menu_order',
    'order' => 'desc',
    'max_num_pages' => 1
);

$all_sports = new WP_Query($args);

Qu'est-ce que je fais mal ici?

1

WP_Query est pour les boucles secondaires . C'est-à-dire qu'il est complètement indépendant du $wp_query par défaut de la page. Je soupçonne que cela ne fonctionne pas car vous ne faites pas référence à votre nouvel objet WP_Query dans la boucle. Pour ce faire, vous feriez ceci:

if( $all_sports->have_posts() ) : while( $all_sports->have_posts() ) : $all_sports->the_post();
    // do stuff
endwhile; endif;

CEPENDANT, vous ne devriez pas faire ça!

Au lieu de cela, il s’agit d’une utilisation parfaite de l’action pre_get_posts . Cette action peut être utilisée pour modifier la requête par défaut sur n'importe quelle page sans aucune modification du modèle de page. Voyant que vous souhaitez simplement modifier la requête d'archive de type publication personnalisée par défaut, vous le souhaitez. Voici un code non testé qui devrait probablement faire l'affaire:

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

    if( is_post_type_archive( 'cpt_sports' ) && !is_admin() && $query->is_main_query() ) {
        $query->set( 'posts_per_page', -1 );
        $query->set( 'orderby', 'menu_order' );
    }

}

Tous les autres arguments que vous donnez à WP_Query sont les valeurs par défaut d'une requête de page d'archive de type publication personnalisée; vous n'avez donc pas besoin de les modifier.

6
mrwweb