Utilizzo della paginazione con get_posts su tipo pagina
Esiste un modo per utilizzare la paginazione su una query di pagine come si fa con gli articoli?
Ecco il codice che sto utilizzando:
$listingPages = get_posts(
array(
'cild_of' => '7',
'meta_key' => 'Type',
'post_type' => 'page',
'post_status' => 'publish',
'orderby' => 'meta_value',
'order' => 'ASC',
'posts_per_page' => '20',
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
)
);
Posso aggiungere /page/2 /page/3/ ecc. all'URL e vedere il set successivo di 20 elementi, tuttavia quando aggiungo il mio codice di paginazione non viene visualizzato nulla.
<?php wpbeginner_numeric_posts_nav(); ?>
Ecco la parte del functions.php:
function wpbeginner_numeric_posts_nav() {
if( is_singular() )
return;
global $wp_query;
/** Interrompe l'esecuzione se c'è solo 1 pagina */
if( $wp_query->max_num_pages <= 1 )
return;
$paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
$max = intval( $wp_query->max_num_pages );
/** Aggiunge la pagina corrente all'array */
if ( $paged >= 1 )
$links[] = $paged;
/** Aggiunge le pagine intorno alla pagina corrente all'array */
if ( $paged >= 3 ) {
$links[] = $paged - 1;
$links[] = $paged - 2;
}
if ( ( $paged + 2 ) <= $max ) {
$links[] = $paged + 2;
$links[] = $paged + 1;
}
echo '<div class="navigation"><ul>' . "\n";
/** Link Post Precedente */
if ( get_previous_posts_link() )
printf( '<li>%s</li>' . "\n", get_previous_posts_link() );
/** Link alla prima pagina, più puntini di sospensione se necessario */
if ( ! in_array( 1, $links ) ) {
$class = 1 == $paged ? ' class="active"' : '';
printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( 1 ) ), '1' );
if ( ! in_array( 2, $links ) )
echo '<li>…</li>';
}
/** Link alla pagina corrente, più 2 pagine in entrambe le direzioni se necessario */
sort( $links );
foreach ( (array) $links as $link ) {
$class = $paged == $link ? ' class="active"' : '';
printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $link ) ), $link );
}
/** Link all'ultima pagina, più puntini di sospensione se necessario */
if ( ! in_array( $max, $links ) ) {
if ( ! in_array( $max - 1, $links ) )
echo '<li>…</li>' . "\n";
$class = $paged == $max ? ' class="active"' : '';
printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $max ) ), $max );
}
/** Link Post Successivo */
if ( get_next_posts_link() )
printf( '<li>%s</li>' . "\n", get_next_posts_link() );
echo '</ul></div>' . "\n";
}

Dovresti controllare il tuo codice perché hai alcune istruzioni che faranno sì che la tua funzione di paginazione restituisca un valore vuoto. Ad esempio, il seguente frammento di codice ti porterà fuori perché sei in un template di pagina, quindi is_singular() restituisce true
:
if( is_singular() )
return;
Inoltre, stai utilizzando l'oggetto globale $wp_query
all'interno della tua funzione di paginazione ma stai usando get_posts()
per ottenere la lista delle pagine, non la query principale. Quindi $wp_query->max_num_pages
è zero perché la query principale era per una singola pagina. Anche questo frammento di codice ti porterà fuori:
global $wp_query;
/** Interrompi l'esecuzione se c'è solo 1 pagina */
if( $wp_query->max_num_pages <= 1 )
return;
Rimuovere entrambi i blocchi di codice non sarà sufficiente perché utilizzi nuovamente l'oggetto globale $wp_query
per ottenere il numero massimo di pagine:
$max = intval( $wp_query->max_num_pages );
Inoltre, se imposti il template di pagina come pagina iniziale del tuo blog, la variabile paged
non funzionerà nella query, dovresti usare la variabile di query page
.
Ti consiglio di ripensare a quello che stai cercando di fare. Guardando il tuo codice, stai cercando di elencare le pagine figlie della pagina con ID 7 e paginare i risultati. Sembra più semplice convertire quelle pagine figlie in normali post sotto una categoria e visualizzarli in un template di categoria standard.
Se hai davvero bisogno che gli elementi siano pagine figlie, nel tuo caso sarebbe meglio usare un oggetto new WP_Query()
, non la funzione get_posts()
e ottenere il numero massimo di pagine per la tua funzione di paginazione:
$args = array(
'cild_of' => '7',
'meta_key' => 'Type',
'post_type' => 'page',
'post_status' => 'publish',
'orderby' => 'meta_value',
'order' => 'ASC',
'posts_per_page' => '20',
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
);
$query = new WP_Query($args);
$max_num_pages = $query->max_num_pages;
wpbeginner_numeric_posts_nav($max_num_pages);
E la funzione di paginazione:
function wpbeginner_numeric_posts_nav($max_num_pages = 0) {
/** Interrompi l'esecuzione se c'è solo 1 pagina */
if( $max_num_pages <= 1 )
return;
$paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
/** Aggiungi la pagina corrente all'array */
if ( $paged >= 1 )
$links[] = $paged;
/** Aggiungi le pagine attorno alla pagina corrente all'array */
if ( $paged >= 3 ) {
$links[] = $paged - 1;
$links[] = $paged - 2;
}
if ( ( $paged + 2 ) <= $max_num_pages ) {
$links[] = $paged + 2;
$links[] = $paged + 1;
}
echo '<div class="navigation"><ul>' . "\n";
/** Link al Post Precedente */
if ( get_previous_posts_link() )
printf( '<li>%s</li>' . "\n", get_previous_posts_link() );
/** Link alla prima pagina, più puntini di sospensione se necessario */
if ( ! in_array( 1, $links ) ) {
$class = 1 == $paged ? ' class="active"' : '';
printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( 1 ) ), '1' );
if ( ! in_array( 2, $links ) )
echo '<li>…</li>';
}
/** Link alla pagina corrente, più 2 pagine in entrambe le direzioni se necessario */
sort( $links );
foreach ( (array) $links as $link ) {
$class = $paged == $link ? ' class="active"' : '';
printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $link ) ), $link );
}
/** Link all'ultima pagina, più puntini di sospensione se necessario */
if ( ! in_array( $max_num_pages, $links ) ) {
if ( ! in_array( $max_num_pages - 1, $links ) )
echo '<li>…</li>' . "\n";
$class = $paged == $max_num_pages ? ' class="active"' : '';
printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $max_num_pages ) ), $max_num_pages );
}
/** Link al Post Successivo */
if ( get_next_posts_link() )
printf( '<li>%s</li>' . "\n", get_next_posts_link() );
echo '</ul></div>' . "\n";
}

Grazie per quanto sopra, sto usando questo su un sito in sviluppo, sfortunatamente uno dei tipi di post ha 5 pagine e nella pagina 1 viene mostrato come "1 2 3 5 ...", inoltre il pulsante successivo manca, nella pagina 2 per esempio mostra "precedente 1 2 3 4 5" e ancora nessun successivo. Qualsiasi aiuto è apprezzato, grazie.

Sembra che si tratti di una query secondaria. paged
è una variabile di query del Core, ovvero viene utilizzata dal Core di WordPress. Questa variabile verrà manipolata dal Core durante un normale caricamento di pagina dalla query principale all'inizio del caricamento della pagina. La query principale non sa cosa fa la tua query più avanti nel caricamento della pagina. Quello che sta succedendo, sono abbastanza sicuro, è che stai tentando di utilizzare una variabile di query "riservata" e stai vedendo interferenze/conflitti tra la query principale e il funzionamento delle funzioni del Core.
La soluzione, se ho ragione, è utilizzare una variabile diversa da quelle usate dal Core, come ad esempio my_paged
.
