Paginare interogare personalizată

12 iul. 2014, 19:37:34
Vizualizări: 25.3K
Voturi: 3

Î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.

5
Comentarii

Se pare că faci o interogare locală, unde paginarea folosește variabila globală a interogării. Înlocuiește această linie - $loop = new WP_Query( $args ); cu query_posts( $args ). De asemenea, înlocuiește - $loop->have_posts() ) : $loop->the_post() cu have_posts() ) : the_post(). Și nu mai este nevoie să folosești wp_reset_postdata().

Shazzad Shazzad
12 iul. 2014 20:35:27

Am auzit că nu ar trebui să folosești query_posts pentru a afișa o buclă personalizată.

justinw justinw
12 iul. 2014 20:39:29

Aceasta este cea mai bună practică. Folosirea paginării globale (get_query_var('paged')) într-o interogare personalizată nu este de asemenea o practică recomandată. Totuși, voi scrie un răspuns în câteva secunde.

Shazzad Shazzad
12 iul. 2014 20:45:14

Am găsit un articol despre asta. Folosind acea metodă funcționează destul de bine.

justinw justinw
12 iul. 2014 20:46:35

Am găsit soluția: Paginare articole WordPress

Fefar Ravi Fefar Ravi
5 oct. 2021 19:37:36
Toate răspunsurile la întrebare 3
1

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();
12 iul. 2014 20:49:22
Comentarii

Mulțumiri din suflet

Muhammad Mehran Khan Attari Muhammad Mehran Khan Attari
11 sept. 2020 14:26:41
1

Î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();.

12 iul. 2014 19:58:07
Comentarii

Din păcate, nu a fost paginat.

justinw justinw
12 iul. 2014 20:21:25
0

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();
3 mar. 2022 22:18:27