Loop-uri WP_Query multiple cu Paginare

29 mar. 2012, 17:14:37
Vizualizări: 19.7K
Voturi: 12

Există câteva întrebări despre acest subiect (iar paginarea WP_Query pare să fie o întrebare majoră pentru mulți dezvoltatori), așa că încerc să clarific exact cum să o fac să funcționeze.

Pot să creez un singur loop personalizat cu paginare folosind acest cod:

// http://weblogtoolscollection.com/archives/2008/04/19/paging-and-custom-wordpress-loops/
$temp = $wp_query;
$wp_query= null;
$wp_query = new WP_Query();
$args = array(
    'showposts' => 2,
    'paged' => $paged
);
$wp_query->query($args);
while ($wp_query->have_posts()) : $wp_query->the_post();

// Articolul
the_title();
echo '<br>';
the_category(' ');
the_excerpt();
echo '<hr>';

endwhile;
// http://codex.wordpress.org/Function_Reference/paginate_links#Examples
$big = 999999999;
$pag_args = array(
    'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
    'format' => '?paged=%#%',
    'current' => max( 1, get_query_var('paged') ),
    'total' => $wp_query->max_num_pages
);
echo paginate_links($pag_args);
$wp_query = null;
$wp_query = $temp;

...dar în mod natural, dacă copiez/lipesc acest loop, funcționează ca o clonă exactă, ceea ce înseamnă că atunci când dai click pe "Pagina 2" te duce la Pagina 2 pentru AMBELE loop-uri.

Există vreo modalitate de a separa aceste loop-uri astfel încât fiecare să aibă propria sa paginare?

Aici este codul complet împreună cu loop-ul duplicat dacă cineva este interesat să-l testeze local: http://paste.pocoo.org/show/573108/

1
Comentarii

uită-te la acest post în care am rezolvat problema de paginare pentru mai multe bucle pentru mine http://wordpress.stackexchange.com/questions/126814/wordpress-static-page-pagination/139594#139594

ewroman ewroman
29 mar. 2014 12:29:28
Toate răspunsurile la întrebare 1
12
20

Da, se poate realiza. Cheia este să faci parametrul format diferit pentru cele două interogări:

    <!-- Pisici -->
    <div class="animals">
        <?
            $paged1 = isset( $_GET['paged1'] ) ? (int) $_GET['paged1'] : 1;
            $paged2 = isset( $_GET['paged2'] ) ? (int) $_GET['paged2'] : 1;

            // Buclă Personalizată cu Paginare 1
            // http://codex.wordpress.org/Class_Reference/WP_Query#Usage
            $args1 = array(
                'paged'          => $paged1,
                'posts_per_page' => 2,
            );
            $query1 = new WP_Query( $args1 );

            while ( $query1->have_posts() ) : $query1->the_post();
                the_title();
                echo '<br>';
                the_category(' ');
                the_excerpt();
                echo '<hr>';
            endwhile;

            // http://codex.wordpress.org/Class_Reference/WP_Query#Pagination_Parameters
            $pag_args1 = array(
                'format'  => '?paged1=%#%',
                'current' => $paged1,
                'total'   => $query1->max_num_pages,
                'add_args' => array( 'paged2' => $paged2 )
            );
            echo paginate_links( $pag_args1 );
        ?>
    </div>

    <!-- Câini -->
    <div class="animals">
        <?
            // Buclă Personalizată cu Paginare 2
            $args2 = array(
                'paged'          => $paged2,
                'posts_per_page' => 2,
            );
            $query2 = new WP_Query( $args2 );

            while ( $query2->have_posts() ) : $query2->the_post();
                the_title();
                echo '<br>';
                the_category(' ');
                the_excerpt();
                echo '<hr>';
            endwhile;

            $pag_args2 = array(
                'format'  => '?paged2=%#%',
                'current' => $paged2,
                'total'   => $query2->max_num_pages,
                'add_args' => array( 'paged1' => $paged1 )
            );
            echo paginate_links( $pag_args2 );
        ?>
    </div>
29 mar. 2012 17:32:02
Comentarii

Mulțumesc mult pentru răspuns, Boone. Înțeleg ce spui, dar de fiecare dată când încerc să modific get_query_var, primesc o eroare.

Iată codul actualizat: http://paste.pocoo.org/show/573208/

Eroarea:

Call to a member function get() on a non-object in C:\wamp\www\wordpress_wp_query_pagination\wp-includes\query.php on line 27
Cory Cory
29 mar. 2012 19:21:52

Două lucruri: 1) Faci niște lucruri ciudate cu globalul $wp_query. (2) Există câteva ciudățenii de implementare în WP_Query însuși care fac imposibilă utilizarea get_query_var() și a altor funcții cu el, așa că de obicei mă refer direct la superglobalul $_GET, asigurându-mă că sănătățesc prin conversie la int. Am actualizat răspunsul meu cu un exemplu funcțional complet.

Boone Gorges Boone Gorges
29 mar. 2012 20:55:14

Super, Boone! Mulțumesc mult, funcționează perfect. E timpul să-l studiez în detaliu.

Lucrurile ciudate cu WP_Query erau din acest articol din 2008: http://weblogtoolscollection.com/archives/2008/04/19/paging-and-custom-wordpress-loops/

M-am gândit că poate get_query_var preia aceeași variabilă, dar nu mi-a venit ideea să o iau direct cu $_GET.

Din nou, mulțumesc mult, omule. M-am luptat cu asta de o veșnicie.

Cory Cory
30 mar. 2012 00:10:37

Super. Mult succes!

Boone Gorges Boone Gorges
30 mar. 2012 00:17:52

Ah, la naiba. Vrei să continuăm să luptăm împreună cu asta? :)

După ce am testat versiunea ta, am observat că nu revine la pagina 1. Se blochează pe pagina 2.

De asemenea, când dai click pe o pagină diferită, resetează celălalt loop. Este posibil să înlănțuim aceste variabile $_GET împreună astfel încât să-și amintească http://foo.com/?paged_1=2&paged_2=3 ?

Cory Cory
30 mar. 2012 00:31:18

Nu sunt sigur ce înțelegi prin "se blochează". În ceea ce privește celălalt punct - da, la asta m-am referit cu ultima propoziție din răspunsul meu. Va trebui să concatenezi parametrii 'base' sau 'format' astfel încât să fie conștienți de celălalt argument de paginare.

Boone Gorges Boone Gorges
30 mar. 2012 00:35:40

Iată bug-ul pe care îl întâlnesc: http://www.screenr.com/tmS8 Iată codul meu (același bug apare și în codul tău copiat exact): http://paste.pocoo.org/show/573351/

Cory Cory
30 mar. 2012 00:48:53

OK, am modificat din nou răspunsul.

Boone Gorges Boone Gorges
30 mar. 2012 01:50:41

Pare să funcționeze perfect. Mulțumesc mult, Boone! Ești un geniu de la Ivy League. :D

Din curiozitate, cum funcționează exact parametrul 'add_args'? Am verificat în Codex dar nu e foarte specific.

Cory Cory
30 mar. 2012 02:46:57

add_args vă permite să adăugați un array de argumente în URL. Este mai clar în documentația inline și în funcția în sine: https://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/general-template.php#L1876 https://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/general-template.php#L1985

Boone Gorges Boone Gorges
30 mar. 2012 02:52:17

poți arunca o privire la această întrebare http://stackoverflow.com/questions/23841520/pagination-error-wordpress

Nisham Mahsin Nisham Mahsin
24 mai 2014 09:12:52

Știu că aceasta este veche, dar funcționează pentru mine. Întrebare, cum aș putea face reguli de re-scriere pentru asta?

Digitalchild Digitalchild
27 sept. 2015 13:21:37
Arată celelalte 7 comentarii