Come utilizzare the_posts_navigation con wp_query e get_posts?
WordPress ha la funzione the_posts_navigation
dalla versione 4.1.0. Ma non so come usarla con wp_query
o get_posts
. Il seguente codice si trova in un file template di una pagina.
metodo 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 precedente', 'cm' ),
'next_text' => __( 'Pagina successiva', 'cm' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Pagina', 'cm' ) . ' </span>',
) );
?>
metodo 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;
// Navigazione pagina precedente/successiva.
the_posts_pagination( array(
'prev_text' => __( 'Pagina precedente', 'cm' ),
'next_text' => __( 'Pagina successiva', 'cm' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Pagina', 'cm' ) . ' </span>',
) );
?>
Non funzionano e non mostrano la paginazione, ma inserendo manualmente http://127.0.0.1/gdboer/?page_id=74&page=2 nella barra degli indirizzi, funziona. Chi può aiutarmi, grazie mille!

the_posts_navigation()
è semplicemente una funzione wrapper per get_the_posts_navigation()
che a sua volta è una funzione wrapper per paginate_links
. Le prime due funzioni utilizzano esattamente gli stessi parametri usati da paginate_links
e li passano anche a quest'ultima funzione.
get_the_posts_navigation()
e the_posts_navigation()
sono buone nuove funzioni perché eliminano molto codice personalizzato e sono più user-friendly per i nuovi utenti inesperti che desiderano una navigazione paginata numerata.
L'unico difetto in get_the_posts_navigation()
è che gli sviluppatori hanno avvolto la funzione paginate_links
in un'istruzione condizionale che stabilisce che se la query principale ($wp_query
) ha meno di 1 pagina (ricorda, la prima pagina è 0
e la seconda è 2
), non mostrare i link. Questo è problematico per query personalizzate nei template di pagina. Le pagine avranno sempre solo una pagina, quindi queste funzioni non funzionano con query personalizzate.
L'unica vera soluzione alternativa, se devi usare the_posts_navigation()
, è utilizzare la risposta di @ChipBennet in questo post. Non mi piace annullare la query principale (piuttosto hacky, secondo me è come usare query_posts
) ma non vedo altre soluzioni per far funzionare get_the_posts_navigation()
con query personalizzate.

Grazie per la tua risposta. Ora so che la funzione non può funzionare con query personalizzate. A proposito, non ti piace annullare la query principale. Ma quale metodo hai usato?

Non utilizzo la funzione nativa, ho scritto la mia funzione di paginazione che uso. Puoi controllarla qui

Se uso un permalink come questo http://127.0.0.1/gdboer/?post_type=case non funziona. Usare il permalink http://127.0.0.1/gdboer/?page_id=74 va bene.

Ho un template personalizzato e ho faticato per ore per mostrare il componente di paginazione. Ecco cosa ha funzionato per me.
$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);
<!-- esempio funzionante di paginazione con numeri -->
...<?php endwhile;?>
<?php
$GLOBALS['wp_query']->max_num_pages = $projects->max_num_pages;
the_posts_pagination( array(
'mid_size' => 1,
'prev_text' => __( 'Indietro', 'green' ),
'next_text' => __( 'Avanti', 'green' ),
'screen_reader_text' => __( 'Navigazione articoli' )
) ); ?>
OPPURE
<!-- esempio funzionante di paginazione senza numeri -->
...<?php endwhile;?>
<?php next_posts_link( 'successivo', $projects->max_num_pages ); ?>
<?php previous_posts_link('precedente') ?>

Decisamente un'idea, l'unica parte che non mi piace molto è modificare l'oggetto della query principale. È un po' un hack e un bug che ti darà incubi perché non resetti la query principale una volta finito. Tienilo a mente. Questo è il motivo per cui la globalizzazione è una cosa così malvagia, chiunque può cambiare i valori. Ricorda, molti plugin si basano sulle variabili globali, in particolare $wp_query
e $post

Questa funzione utilizza get_the_posts_pagination()
che usa la variabile GLOBALE wp_query
per configurare la funzione paginate_links()
, quindi credo che non funzioni con get_posts
.
Prova a usare direttamente la funzione paginate_links()
oppure la funzione posts_nav_link()
PS: Assicurati di usare wp_reset_query()

grazie per la tua risposta. So che paginate_links funziona per me. ma voglio usare la nuova funzione the_posts_navigation. Ho guardato attentamente il codice sorgente di get_the_posts_navigation e ho fatto riferimento al tema di twentyfifteen.
