Vários loops WP_Query com paginação

10

Existem algumas outras perguntas sobre isso (e a paginação WP_Query parece ser uma grande questão para muitas pessoas), então estou tentando restringir exatamente como fazê-lo funcionar.

Eu sou capaz de criar um único loop personalizado com paginação este código:

// 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();

// The Post
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;

... mas, naturalmente, se eu copiar / colar esse loop, ele funcionará como um clone exato, ou seja, quando você clicar em "Página 2", você será levado para a Página 2 para os dois loops.

Existe uma maneira de separá-los um do outro para que cada um pagine separadamente?

Aqui está o código completo, com loop duplicado, se alguém estiver interessado em configurar sua própria versão local e brincar com ela: http://paste.pocoo.org/show/573108/

Cory
fonte
olhe para este post que eu resolvi vários problemas de paginação de loop para mim mesmo wordpress.stackexchange.com/questions/126814/…
ewroman / (

Respostas:

18

Sim, isso pode ser feito. A chave é tornar o formatparâmetro diferente para as duas consultas:

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

            // Custom Loop with Pagination 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>

    <!-- Dogs -->
    <div class="animals">
        <?
            // Custom Loop with Pagination 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>
Boone Gorges
fonte
Muito obrigado por responder Boone. Entendo o que você está dizendo, mas sempre que tento alterar o get_query_var, gera um erro. Aqui está o código atualizado: paste.pocoo.org/show/573208 O erro: Chame uma função de membro get () em um não-objeto em C: \ wamp \ www \ wordpress_wp_query_pagination \ wp-includes \ query.php na linha 27
Cory
Duas coisas: 1) Você está fazendo algumas coisas estranhas com o $wp_queryglobal. (2) Existem algumas peculiaridades de implementação WP_Queryque tornam impossível o uso get_query_var()e outras funções, por isso geralmente $_GETrefiro a superglobal diretamente, certificando-me de higienizar fazendo a conversão para int. Atualizei minha resposta com um exemplo de trabalho completo.
Boone Gorges
Boone impressionante! Muito obrigado, funciona muito bem. Hora de estudá-lo completamente. O material estranho do WP_Query era deste artigo de 2008: weblogtoolscollection.com/archives/2008/04/19/… Imaginei que talvez o get_query_var estivesse buscando o mesmo var, mas não tinha cérebro para obtê-lo diretamente com $ _GET. Mais uma vez, muito obrigado, cara. Estou lutando com isso para sempre.
Cory
Legal. Boa sorte!
Boone Gorges
Ah, merda. Importa-se de continuar lutando comigo? :) Depois de testar sua versão, notei que ela não volta à página 1. Ela fica presa na página 2. Além disso, quando você clica em uma página diferente, ela redefine o outro loop. É possível encadear essas variáveis ​​$ _GET para que ele se lembre de foo.com/?paged_1=2&paged_2=3 ?
Cory