Cum să folosești the_posts_navigation pentru wp_query și get_posts?
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!
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.

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?

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

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.

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') ?>

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

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

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.
