web-dev-qa-db-fra.com

Pagination dans un plugin avec type de message personnalisé

J'ai plusieurs types de publication personnalisés (créés via le plugin CPT UI). Je souhaite afficher les publications de ces types de publication sur ma page, par exemple "Actualités". J'ai créé une page et y ai inséré un shortcode [show_posts post_type="novyny"]. J'ai un plugin qui traite ce shortcode

function foo($args){
    $post_type = $args['post_type'];
    $custom_post_type = new WP_Query(
        array(
            'post_type' => $post_type,
            'orderby' => 'date',
            'order' => 'DESC',
            'posts_per_page' => 4
        )
    );

    if( $custom_post_type->have_posts() ) :
        while( $custom_post_type->have_posts() ): $custom_post_type->the_post(); ?>
            <h1><a href="<?php the_permalink(); ?>"><?php the_title() ?></a></h1>
            <p> <?php the_modified_date(); echo ", "; the_modified_time() ?></p>
            <p> <?php the_excerpt() ?></p>
        <?php endwhile;
        the_posts_pagination();
    endif;
    wp_reset_postdata();
}

add_shortcode('show_posts', 'foo');

Les publications sont affichées, mais le blog de pagination n'apparaît pas sur la page, même s'il y a plus de 4 publications à afficher. Qu'est-ce qui ne va pas?

1
Vlad

the_posts_pagination utilise la requête global et la requête globale n'a pas de pagination. C'est donc le comportement correct de WordPress.

Pour résoudre ce problème, attribuez une requête personnalisée à une requête globale puis, après avoir bouclé à nouveau, restaurez la requête globale.

function foo($args){
    $post_type = $args['post_type'];
    global $wp_query;
    $original_query = $wp_query;
    $custom_post_type = new WP_Query(
        array(
            'post_type' => $post_type,
            'orderby' => 'date',
            'order' => 'DESC',
            'posts_per_page' => 4
        )
    );

    $wp_query = $custom_post_type;

    if( $custom_post_type->have_posts() ) :
        while( $custom_post_type->have_posts() ): $custom_post_type->the_post(); ?>
            <h1><a href="<?php the_permalink(); ?>"><?php the_title() ?></a></h1>
            <p> <?php the_modified_date(); echo ", "; the_modified_time() ?></p>
            <p> <?php the_excerpt() ?></p>
        <?php endwhile;
        the_posts_pagination();
    endif;
    wp_reset_postdata();

    $wp_query = $original_query;
}
2
Sumit

Merci à vous tous. Je l'ai résolu de cette façon:

  • ajouté $paged variable: $paged = ( get_query_var('page') ) ? get_query_var('page') : 1; (pour page principale vous devez utiliser get_query_var('page'), pour autres pages - $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;)
  • Et ajouté un nouvel argument pour WP_Query: 'paged' => $paged

Mon code maintenant:

function foo($args){
    $post_type = $args['post_type'];

    /* Added $paged variable */
    $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;

    global $wp_query;
    $original_query = $wp_query;

    $query_args = array(
        'post_type' => $post_type,
        'posts_per_page' => 3,

        /* And added a new argument for WP_Query */
        'paged' => $paged
    );

    $custom_post_type = new WP_Query( $query_args );
    $wp_query = $custom_post_type;

    if ( $custom_post_type->have_posts() ) :
        while ( $custom_post_type->have_posts() ) :
            $custom_post_type->the_post(); ?>
                <h1><a href="<?php the_permalink(); ?>"><?php the_title() ?></a></h1>
                <p> <?php the_modified_date(); echo ", "; the_modified_time() ?></p>
                <p> <?php the_excerpt() ?></p>
        <?php endwhile;
        the_posts_pagination();
    endif;

    wp_reset_postdata();
    $wp_query = $original_query;
}
2
Vlad