J'ai un personnel appelé CPT. Sur leurs pages single-staff.php, j'ai une liste d'éléments auxquels ils sont liés. Cela est devenu trop long, nous voulons maintenant la pagination. Je peux très bien créer les liens de page, mais il se redirige lui-même vers une URL sans le/page/numéro.
http://wonkhedev.jynk.net/staff/mark-leach/ page principale
http://wonkhedev.jynk.net/staff/mark-leach/page/2/ page 2 lien mais est redirigé vers http://wonkhedev.jynk.net/staff/mark-leach/
//in functions.php
function get_author_articles($id){
// backwards finds CPT 'blogs' this staff member is related to.
$meta_query = array(
'paged' => get_query_var('paged'),
'post_type' => 'blogs',
'meta_query' => array(
array(
'key' => 'blog_author', // name of custom field, ACF
'value' => '"' . $id . '"', // CPT 'staff' id.
'compare' => 'LIKE'
)
),
'posts_per_page' => 20,
);
$author_articles = query_posts($meta_query);
return $author_articles;
}
// dans single-staff.php
$blog_articles = get_author_articles($post->ID);
$blog_articles_total = $wp_query->found_posts;
<?php if ($wp_query->max_num_pages > 1) : ?>
<nav class="post-nav">
<ul class="pager">
<li class="previous"><?php next_posts_link(__('← Older Articles', 'roots')); ?></li>
<li class="next"><?php previous_posts_link(__('Newer Articles →', 'roots')); ?></li>
</ul>
</nav>
<?php endif; ?>
Vous ne devez jamais utiliser query_post
car il casse l'objet de requête principal et le réinitialise à la requête personnalisée actuelle. Cela casse les plugins et les fonctionnalités personnalisées telles que les publications et la pagination. J'ai fait un réponse étendue sur cela, alors assurez-vous de le vérifier, ainsi que la réponse de @Rarst .
Il convient également de noter que les pages simples, tout comme les pages de couverture statiques, utilisent page
et non paged
comme le font les pages d’archives normales et les pages.
Regardons d’abord la fonction de vos messages associés:
Nous voudrions d’abord bien coder la fonction pour la rendre sûre et dynamique. J'accepte que $id
devrait être l'identifiant de publication unique de la publication que vous visualisez. Par conséquent, gardons cela à l'esprit, codons la fonction:
Juste quelques notes avant de faire:
Le code est commenté, il sera donc facile à suivre
Le code nécessite PHP 5.4 +
Modifier le code au besoin
Voici le code
/**
* Function to return realted posts_per_page
*
* @param (array) $args Compatible argumnets to pass to WP_Query
* @return $author_articles
*/
function get_author_articles( $args = [] )
{
// First make sure we are on a single page, else return false
if ( !is_single() )
return false;
// Get the single post object we are on
$current_post = get_queried_object();
// Set our $page variable
$page = get_query_var( 'page' ) ? get_query_var( 'page' ) : 0;
// backwards finds CPT 'blogs' this staff member is related to.
$meta_query_defaults = [
'post__not_in' => $current_post->ID, // Excludes the current post
'paged' => $page,
'post_type' => $current_post->post_type,
'posts_per_page' => 20,
'meta_query' => [
[
'key' => 'blog_author', // name of custom field, ACF
'value' => $current_post->ID, // CPT 'staff' id.
'compare' => 'LIKE'
]
],
];
// Add our custom arguments to the $meta_query_defaults array
if ( $args
&& is_array( $args )
) {
$meta_query_defaults = wp_parse_args( $args, $meta_query_defaults );
}
$author_articles = new WP_Query( $meta_query_defaults );
return $author_articles;
}
Vous pouvez passer, en tant que premier paramètre, un tableau de paramètres valide pour WP_Query
afin d'ajuster et de modifier les paramètres par défaut de la fonction transmise à WP_Query
.
Comme je l'ai dit, les pages à publication unique et les pages de couverture statiques utilisent page
et non paged
. Pour que la pagination fonctionne correctement, vous avez besoin d’une fonction personnalisée complète. J'ai déjà utilisé cette fonction il y a quelque temps, que vous pouvez vérifier ici .
Voici des versions légèrement modifiées
function get_single_pagination_link( $pagenum = 1 ) {
global $wp_rewrite;
if( !is_single()
|| !$wp_rewrite->permalink_structure
)
return false;
$pagenum = (int) $pagenum;
$post_id = get_queried_object_id();
$request = get_permalink( $post_id );
if ( $pagenum > 1 )
$request = trailingslashit( $request ) . user_trailingslashit( $pagenum );
return esc_url( $request );
}
function get_next_single_page_link ( $label = null, $max_page = 0 ) {
global $wp_query;
if( !is_single() )
return false;
if ( !$max_page ) {
$max_page = $wp_query->max_num_pages;
}
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
$next_page = intval($paged) + 1;
if ( null === $label ) {
$label = __( 'Next Page »' );
}
if ( ( $next_page <= $max_page ) ) {
return '<a href="' . get_single_pagination_link( $next_page ) . '">' . $label . '</a>';
} else {
return false;
}
}
function get_previous_single_page_link( $label = null ) {
if( !is_single() )
return false;
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
$prev_page = intval($paged) - 1;
if ( null === $label ) {
$label = __( '« Previous Page' );
}
if ( ( $prev_page > 0 ) ) {
return '<a href="' . get_single_pagination_link( $prev_page ) . '">' . $label . '</a>';
} else {
return false;
}
}
Vous pouvez maintenant l'utiliser comme suit
$q = get_author_articles();
if ( $q->have_posts() ) {
while ( $q->have_posts() ) {
$q->the_post();
// Add your markup, etc.
}
echo get_previous_single_page_link();
echo get_next_single_page_link( null , $q->max_num_pages );
wp_reset_postdata();
}