web-dev-qa-db-fra.com

Comment utiliser the_posts_navigation pour wp_query et get_posts?

WordPress a la fonction the_posts_navigation depuis la version 4.1.0. Mais je ne sais pas comment utiliser avec wp_query ou get_posts. le code suivant est dans un fichier modèle de page.
méthode wp_query:

    <?php
    if ( get_query_var('paged') ) {
    $paged = get_query_var('paged');
    } else if ( get_query_var('page') ) {
    $paged = get_query_var('page');
    } else {
    $paged = 1;
    }

    $get_posts=new wp_query('post_type=case&posts_per_page=2&paged='.$paged);

    while($get_posts->have_posts()):$get_posts->the_post();
    the_title();
    endwhile;

    the_posts_pagination( array(
        'prev_text'          => __( 'Previous page', 'cm' ),
        'next_text'          => __( 'Next page', 'cm' ),
        'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Page', 'cm' ) . ' </span>',
    ) );
    ?>

Méthode get_posts:

    <?
    while(have_posts()):the_post();
    if ( get_query_var('paged') ) {
        $paged = get_query_var('paged');
        } else if ( get_query_var('page') ) {
        $paged = get_query_var('page');
        } else {
        $paged = 1;
    }

    $case_posts=get_posts('post_type=case&posts_per_page=2&paged='.$paged);
    echo '<pre>';
    print_r($case_posts);
    echo '</pre>';
    foreach($case_posts as $case_post){
        echo $case_post->post_title;
    }
    endwhile;
    // Previous/next page navigation.
    the_posts_pagination( array(
        'prev_text'          => __( 'Previous page', 'cm' ),
        'next_text'          => __( 'Next page', 'cm' ),
        'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Page', 'cm' ) . ' </span>',
    ) );
    ?>

Ils ne fonctionnent pas et affichent la pagination, mais entrer http://127.0.0.1/gdboer/?page_id=74&page=2 manuellement dans la barre d’adresse, cela fonctionne. Qui peut m'aider, merci beaucoup!

6
Vincent Wong

the_posts_navigation() est simplement une fonction wrapper pour get_the_posts_navigation() qui est simplement une fonction wrapper pour paginate_links. Les deux premières fonctions utilisent les mêmes paramètres que ceux utilisés par paginate_links et les transmettent également à la dernière fonction.

get_the_posts_navigation() et the_posts_navigation() sont de bonnes nouvelles fonctions car elles éliminent beaucoup de codage personnalisé et sont plus conviviales pour les nouveaux utilisateurs inexpérimentés qui souhaitent des liens de pagination numérotés.

La seule faille dans cette get_the_posts_navigation() est que les développeurs ont encapsulé la fonction paginate_links dans une instruction conditionnelle qui indique que si la requête principale ($wp_query) contient moins d'une page (rappelez-vous, la première page est 0 et la deuxième page est 2 ), ne montre pas les liens. Ceci est problématique pour les requêtes personnalisées sur les modèles de page. Les pages auront toujours une seule page, donc ces fonctions ne fonctionnent pas avec les requêtes personnalisées

La seule solution valable si vous devez utiliser the_posts_navigation(), consiste à utiliser la réponse @ChipBennet dans this post . Je n'aime vraiment pas annuler la requête principale (assez malin, à mon avis, cela revient à utiliser query_posts) mais je ne vois pas d'autre solution permettant à get_the_posts_navigation() de fonctionner avec des requêtes personnalisées.

8
Pieter Goosen

J'ai un modèle personnalisé et j'ai eu du mal à montrer le composant de pagination pendant des heures. voici ce qui a fonctionné pour moi.

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
    'posts_per_page' => 3,
    'orderby' => 'menu_order',
    'order'=> 'ASC',
    'paged'=>$paged,
    'post_type' => 'projects'
    );

$projects = new WP_Query($args);

            <!-- working example of pagination with numbers -->
            ...<?php endwhile;?>
                <?php 
                $GLOBALS['wp_query']->max_num_pages = $projects->max_num_pages;
                the_posts_pagination( array(
                   'mid_size' => 1,
                   'prev_text' => __( 'Back', 'green' ),
                   'next_text' => __( 'Onward', 'green' ),
                   'screen_reader_text' => __( 'Posts navigation' )
                ) ); ?>
             OR
             <!-- working example of pagination without numbers -->
             ...<?php endwhile;?>   
             <?php next_posts_link(  'next', $projects->max_num_pages ); ?>
             <?php previous_posts_link('prev') ?>
5
Eran Or

Cette fonction utilise le get_the_posts_pagination() qui utilise GLOBAL wp_query pour configurer la fonction paginate_links(). Je pense donc que cela ne fonctionne pas pour get_posts.

Essayez d'utiliser la fonction paginate_links() seule ou la fonction posts_nav_link()

PS: Assurez-vous d'utiliser wp_reset_query()

2
Leo Caseiro