Paginare interogare personalizată
Încerc să creez un șablon personalizat de pagină care să afișeze cele mai vizualizate articole. Pot returna articolele, dar am probleme cu implementarea paginării. Iată ce am până acum:
$args = array('orderby' => 'meta_value_num', 'meta_key' => 'post_views_count', 'posts_per_page' => 36 );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
Am încercat:
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array('paged' => $paged, 'orderby' => 'meta_value_num', 'meta_key' => 'post_views_count', 'posts_per_page' => 36 );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
dar paginarea mea tot nu apare. Mă întreb dacă are legătură cu funcția mea de paginare sau cu modul în care îmi configurez interogarea.
Pur și simplu apelez funcția mea de paginare sub interogare, totul arată așa:
<?php
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array('paged' => $paged, 'orderby' => 'meta_value_num', 'meta_key' => 'post_views_count', 'posts_per_page' => 36 );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php pagination(); ?>
Aceasta este funcția mea de paginare:
if ( ! function_exists( 'pagination' ) ) :
function pagination() {
global $wp_query;
$big = 999999999; // avem nevoie de un număr întreg improbabil
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages,
'mid_size' => 1,
'prev_text' => __('«'),
'next_text' => __('»'),
'type' => 'list'
) );
}
endif;
Orice ajutor ar fi foarte apreciat.
Aceasta este o problemă de variabilă locală/globală. Poate fi rezolvată fie prin modificarea funcției de paginare pentru a lucra cu variabile locale, fie prin promovarea variabilei locale în domeniul global. Deoarece utilizați wp_reset_postdata()
, presupun că doriți să păstrați interogarea originală.
Modificarea funcției de paginare pentru a accepta argumente -
if ( ! function_exists( 'pagination' ) ) :
function pagination( $paged = '', $max_page = '' ) {
$big = 999999999; // un număr improbabil
if( ! $paged ) {
$paged = get_query_var('paged');
}
if( ! $max_page ) {
global $wp_query;
$max_page = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1;
}
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, $paged ),
'total' => $max_page,
'mid_size' => 1,
'prev_text' => __( '«' ),
'next_text' => __( '»' ),
'type' => 'list'
) );
}
endif;
Și șablonul buclei va arăta astfel -
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$args = array(
'paged' => $paged,
'orderby' => 'meta_value_num',
'meta_key' => 'post_views_count',
'posts_per_page' => 36
);
$loop = new WP_Query( $args );
if ( $loop->have_posts() ) :
while ( $loop->have_posts() ) :
$loop->the_post();
get_template_part( 'content', get_post_format() );
endwhile;
pagination( $paged, $loop->max_num_pages); // Funcția de paginare
endif;
wp_reset_postdata();

Încearcă asta..
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$args = array(
'orderby' => 'meta_value_num', // Sortează după valoare numerică a meta-câmpului
'meta_key' => 'post_views_count', // Meta-câmpul care stochează numărul de vizualizări
'posts_per_page' => 36, // Numărul de articole pe pagină
'paged' => $paged // Pagina curentă
);
$loop = new WP_Query( $args );
if ( $loop->have_posts() ) :
while ( $loop->have_posts() ) : $loop->the_post();
get_template_part( 'content', get_post_format() ); // Încarcă template-ul de conținut
endwhile;
pagination(); // Funcția de paginare
endif;
wp_reset_postdata(); // Resetează datele postului
Paginarea ar trebui adăugată înainte de wp_reset_postdata();
.

Am întâmpinat și eu această problemă și am rezolvat-o astfel
Funcția de paginare
function post_pagination($paged = '', $max_page = '') {
if (!$paged) {
$paged = (get_query_var('paged')) ? get_query_var('paged') : ((get_query_var('page')) ? get_query_var('page') : 1);
}
if (!$max_page) {
global $wp_query;
$max_page = isset($wp_query->max_num_pages) ? $wp_query->max_num_pages : 1;
}
$big = 999999999; // un număr improbabil de mare
$html = paginate_links(array(
'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
'format' => '?paged=%#%',
'current' => max(1, $paged),
'total' => $max_page,
'mid_size' => 1,
'prev_text' => __('« Înapoi'),
'next_text' => __('Înainte »'),
));
$html = "<div class='navigation pagination'>" . $html . "</div>";
echo $html;
}
Interogarea în șablonul personalizat
$paged = (get_query_var('paged')) ? get_query_var('paged') : ((get_query_var('page')) ? get_query_var('page') : 1);
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => get_option('posts_per_page'),
'order' => 'DESC',
'orderby' => 'date',
'paged' => $paged
);
$loop = new WP_Query($args);
if ($loop->have_posts()) :
while ($loop->have_posts()) :
$loop->the_post();
get_template_part('content', get_post_format());
endwhile;
post_pagination($paged, $loop->max_num_pages);
endif;
wp_reset_postdata();
