Cum să folosești the_posts_navigation pentru wp_query și get_posts?

15 ian. 2015, 04:09:12
Vizualizări: 49.1K
Voturi: 9

WordPress are funcția the_posts_navigation începând cu versiunea 4.1.0. Dar nu știu cum să o folosesc cu wp_query sau get_posts. Următorul cod este într-un fișier template de pagină.
Metoda 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'          => __( 'Pagina anterioară', 'cm' ),
        'next_text'          => __( 'Pagina următoare', 'cm' ),
        'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Pagina', 'cm' ) . ' </span>',
    ) );
    ?>

Metoda 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;
    // Navigarea paginii anterioare/următoare
    the_posts_pagination( array(
        'prev_text'          => __( 'Pagina anterioară', 'cm' ),
        'next_text'          => __( 'Pagina următoare', 'cm' ),
        'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Pagina', 'cm' ) . ' </span>',
    ) );
    ?>

Acestea nu funcționează și nu afișează paginarea, dar introducând manual http://127.0.0.1/gdboer/?page_id=74&page=2 în bara de adrese, funcționează. Cine mă poate ajuta, mulțumesc mult!

1
Comentarii

Întrebarea ta este înșelătoare, deoarece codul tău folosește the_posts_pagination, care este diferit de întrebarea din titlu the_posts_navigation.

Jevuska Jevuska
2 apr. 2016 23:02:12
Toate răspunsurile la întrebare 3
4
10

the_posts_navigation() este pur și simplu o funcție wrapper pentru get_the_posts_navigation(), care la rândul ei este o funcție wrapper pentru paginate_links. Primele două funcții folosesc exact aceiași parametri ca și paginate_links și îi transmit de fapt și funcției respective.

get_the_posts_navigation() și the_posts_navigation() sunt funcții noi și bune, deoarece elimină mult cod personalizat și sunt mai prietenoase pentru utilizatorii noi, neexperimentați, care doresc link-uri de paginare numerotate.

Singura problemă a acestei funcții get_the_posts_navigation() este că dezvoltatorii au încadrat funcția paginate_links într-o instrucțiune condițională care afirmă că dacă interogarea principală ($wp_query) are mai puțin de 1 pagină (rețineți, prima pagină este 0 și a doua pagină este 2), să nu afișeze link-urile. Aceasta este problematică pentru interogările personalizate pe șabloanele de pagină. Paginile vor avea întotdeauna doar o singură pagină, astfel încât aceste funcții nu funcționează cu interogări personalizate.

Singura soluție reală dacă trebuie să utilizați the_posts_navigation() este să folosiți răspunsul lui @ChipBennet în acest post. Nu-mi place să anulez interogarea principală (destul de hacky, în opinia mea este la fel ca utilizarea query_posts), dar nu văd nicio altă soluție pentru a face get_the_posts_navigation() să funcționeze cu interogări personalizate.

15 ian. 2015 12:24:08
Comentarii

Mulțumesc pentru răspuns. Acum știu că funcția nu poate lucra cu interogări personalizate. Apropo, nu-ți place să anulezi interogarea principală. Dar ce metodă ai folosit?

Vincent Wong Vincent Wong
16 ian. 2015 02:31:23

Nu folosesc funcția nativă, am scris propria funcție de paginare pe care o folosesc. O poți verifica aici

Pieter Goosen Pieter Goosen
16 ian. 2015 06:14:04

Dacă folosesc un permalink ca acesta http://127.0.0.1/gdboer/?post_type=case nu funcționează. Folosirea permalink-ului http://127.0.0.1/gdboer/?page_id=74 este OK.

Vincent Wong Vincent Wong
17 ian. 2015 04:14:35

Voi încerca să mă joc cu asta în săptămâna viitoare. Sunt ocupat cu alte lucruri în momentul de față. Mulțumesc mult pentru răspuns. Asta mă ajută foarte mult.

Pieter Goosen Pieter Goosen
17 ian. 2015 08:24:16
2

Am un șablon personalizat și am stat ore întregi să încerc să afișez componenta de paginare. Iată ce a funcționat pentru mine.

$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);

            <!-- exemplu funcțional de paginare cu numere -->
            ...<?php endwhile;?>
                <?php 
                $GLOBALS['wp_query']->max_num_pages = $projects->max_num_pages;
                the_posts_pagination( array(
                   'mid_size' => 1,
                   'prev_text' => __( 'Înapoi', 'green' ),
                   'next_text' => __( 'Înainte', 'green' ),
                   'screen_reader_text' => __( 'Navigare articole' )
                ) ); ?>
             SAU
             <!-- exemplu funcțional de paginare fără numere -->
             ...<?php endwhile;?>   
             <?php next_posts_link(  'următorul', $projects->max_num_pages ); ?>
             <?php previous_posts_link('anterior') ?>
25 apr. 2015 03:56:41
Comentarii

Cu siguranță o idee, singura parte care nu-mi place cu adevărat este modificarea obiectului principal al interogării. Este un pic hacky și un bug care îți va da coșmaruri pentru că nu resetezi interogarea principală odată ce ai terminat. Ține minte asta. De aceea globalizarea este un lucru atât de rău, oricine poate schimba valorile. Amintește-ți, multe plugin-uri se bazează pe globale, în special $wp_query și $post

Pieter Goosen Pieter Goosen
25 apr. 2015 08:33:26

Mulțumesc mult. $GLOBALS['wp_query']->max_num_pages a fost partea care îmi lipsea. Nu sunt sigur că există o metodă mai bună.

Space Space
11 aug. 2017 02:17:42
2

Această funcție folosește get_the_posts_pagination() care utilizează variabila GLOBAL wp_query pentru a configura funcția paginate_links(), așa că cred că nu funcționează pentru get_posts.

Încearcă să folosești funcția paginate_links() direct sau funcția posts_nav_link()

PS: Asigură-te că folosești wp_reset_query()

15 ian. 2015 04:31:57
Comentarii

mulțumesc pentru răspuns. Știu că paginate_links funcționează pentru mine. dar vreau să folosesc noua funcție the_posts_navigation. Am analizat cu atenție codul sursă al get_the_posts_navigation și m-am referit la tema twentyfifteen.

Vincent Wong Vincent Wong
15 ian. 2015 10:16:08

nu am reușit să fac get_the_posts_pagination() să funcționeze în interogarea mea ajax, dar paginate_links() funcționează perfect. mulțumesc pentru asta.

honk31 honk31
14 ian. 2020 15:25:32