web-dev-qa-db-fra.com

Nombre de pages - plusieurs types de publication (personnalisés)

Ma requête d'archive contient une publication personnalisée posts_per_page, order, orderby, post_type et paginée (via wp-pageNavi).

array (
    'order' => 'DESC',
    'orderby' => 'title',
    'paged' => 1,
    'post_type' => Array (
        'post',
        'cust_article',
    ),
    'posts_per_page' => 15,
);

Mon post_type contient 'post' et 'cust_article'.
J'ai 1 'post' et 65 'cust_article'. posts_per_page est actuellement défini sur 5 dans admin.

Mon problème est que le nombre maximum de pages est limité par le nombre de pages que contient 'post'. Comme je n’ai qu’un "post", les pages sont limitées à 1, même si toutes les pages sont affichées (5 pages, posts_per_page définies sur 15), les pages autres que la page 1 renverront 404.
La création d'un second 'post' et le réglage de posts_per_page sur 1 permettent d'accéder à la deuxième page. Les pages suivantes renvoient également 404.

J'utilise la même requête pour mes archives post_type personnalisées, avec un seul post_type. Ajouter une seconde à la requête crée la même erreur.

Je sais que la pagination est limitée par le nombre de publications et par l'option définie posts_per_page. 5 ppp et 21 posts => maximum de 5 pages
Selon la théorie, les posts de 2 post_types devraient prolonger le nombre de posts. 5 ppp et 21 posts + 12 posts => 7 pages maximum

4
AlexG

Milo a raison, vous devriez utiliser pre_get_posts au lieu d'appeler une seconde requête à la charge. Cela facilitera beaucoup la pagination. Quelle que soit la commande que vous utilisez, la session doit toujours être accessible. Le code pour le faire est assez simple aussi, cela ressemblerait à ceci:

/**
 * Modify the query before it gets loaded
 *
 * @param WP_Query Object $query
 *
 * @return void
 */
function wpse_228230( $query ) {

    if( $query->is_admin ) {
        return;
    }

    // Your archive conditional here
    if( is_post_type_archive() ) {
        $query->set( 'post_type', array( 'post', 'cust_article' ) );
        $query->set( 'posts_per_page', 15 );
        $query->set( 'orderby', array( 'title' => 'DESC' ) );
    }

}
add_action( 'pre_get_posts', 'wpse_228230' );

Cela modifiera la requête principale avant qu'elle ne frappe la base de données. Sinon, WordPress obtiendra la requête naturelle, frappez votre WP_Query personnalisé et envoyez à nouveau un ping à la base de données, ce qui est une surcharge inutile.

3
Howdy_McGee