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?
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;
}
Merci à vous tous. Je l'ai résolu de cette façon:
$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;
)'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;
}