Utilizarea paginării cu get_posts pentru tipul page
Există vreo modalitate de a utiliza paginarea pentru o interogare de pagini, similar cu cea pentru articole?
Iată codul pe care îl folosesc:
$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 ),
)
);
Pot adăuga /page/2 /page/3/ etc. în URL și pot vedea următorul set de 20 de rezultate, dar când adaug codul meu de paginare, nu apare nimic.
<?php wpbeginner_numeric_posts_nav(); ?>
Iată partea din function.php:
function wpbeginner_numeric_posts_nav() {
if( is_singular() )
return;
global $wp_query;
/** Oprește execuția dacă există doar o pagină */
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 );
/** Adaugă pagina curentă în array */
if ( $paged >= 1 )
$links[] = $paged;
/** Adaugă paginile din jurul paginii curente în 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 către postarea anterioară */
if ( get_previous_posts_link() )
printf( '<li>%s</li>' . "\n", get_previous_posts_link() );
/** Link către prima pagină, plus puncte de suspensie dacă este necesar */
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 către pagina curentă, plus 2 pagini în ambele direcții dacă este necesar */
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 către ultima pagină, plus puncte de suspensie dacă este necesar */
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 către postarea următoare */
if ( get_next_posts_link() )
printf( '<li>%s</li>' . "\n", get_next_posts_link() );
echo '</ul></div>' . "\n";
}

Ar trebui să verifici codul tău deoarece ai câteva propoziții care vor face ca funcția ta de paginare să returneze o valoare goală. De exemplu, următoarea bucată de cod te va scoate din funcție pentru că te afli într-un șablon de pagină, așadar is_singular()
returnează true
:
if( is_singular() )
return;
De asemenea, folosești obiectul global $wp_query
în interiorul funcției tale de paginare, dar folosești get_posts()
pentru a obține lista de pagini, nu interogarea principală. Așadar, $wp_query->max_num_pages
este zero deoarece interogarea principală a fost pentru o singură pagină. Deci această bucată de cod te va scoate și ea din funcție:
global $wp_query;
/** Oprește execuția dacă există doar 1 pagină */
if( $wp_query->max_num_pages <= 1 )
return;
Eliminarea ambelor blocuri de cod nu va fi suficientă deoarece folosești din nou obiectul global $wp_query
pentru a obține numărul maxim de pagini:
$max = intval( $wp_query->max_num_pages );
De asemenea, dacă setezi șablonul de pagină ca pagina principală a blogului tău, variabila paged
nu va funcționa în interogare, ar trebui să folosești variabila de interogare page
.
Îți recomand să te gândești din nou la ceea ce încerci să faci. Privind codul tău, încerci să listezi paginile copil ale paginii cu ID-ul 7 și să paginezi rezultatele. Pare mai ușor să convertești acele pagini copil în postări normale într-o categorie și să le afișezi într-un șablon standard de categorie.
Dacă chiar ai nevoie ca elementele să fie pagini copil, în cazul tău ar fi mai bine să folosești un obiect new WP_Query()
, nu funcția get_posts()
și să obții numărul maxim de pagini pentru funcția ta de paginare:
$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);
Și funcția de paginare:
function wpbeginner_numeric_posts_nav($max_num_pages = 0) {
/** Oprește execuția dacă există doar 1 pagină */
if( $max_num_pages <= 1 )
return;
$paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
/** Adaugă pagina curentă la array */
if ( $paged >= 1 )
$links[] = $paged;
/** Adaugă paginile din jurul paginii curente la 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 către postarea anterioară */
if ( get_previous_posts_link() )
printf( '<li>%s</li>' . "\n", get_previous_posts_link() );
/** Link către prima pagină, plus puncte de suspensie dacă este necesar */
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 către pagina curentă, plus 2 pagini în ambele direcții dacă este necesar */
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 către ultima pagină, plus puncte de suspensie dacă este necesar */
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 către postarea următoare */
if ( get_next_posts_link() )
printf( '<li>%s</li>' . "\n", get_next_posts_link() );
echo '</ul></div>' . "\n";
}

Mulțumesc pentru informațiile de mai sus, folosesc acest lucru pe un site în dezvoltare, dar din păcate unul dintre tipurile de postări are 5 pagini și pe pagina 1 se afișează ca "1 2 3 5 ...", de asemenea butonul "next" lipsește. Pe pagina 2, de exemplu, se afișează "previous 1 2 3 4 5" și tot nu apare butonul "next". Apreciez orice ajutor, mulțumesc.

Aceasta pare a fi o interogare secundară. paged
este un Core query var – adică, este folosit de WordPress Core. Acea variabilă va fi manipulată de Core în timpul unei încărcări obișnuite de pagină de către interogarea principală la începutul încărcării paginii. Interogarea principală nu știe ce face interogarea ta mai târziu în procesul de încărcare a paginii. Ceea ce se întâmplă, sunt destul de sigur, este că încerci să folosești o variabilă de interogare „rezervată” și vezi interferențe/conflicte între interogarea principală și funcționarea funcțiilor Core.
Soluția, dacă am dreptate, este să folosești o altă variabilă decât cele utilizate de Core – ceva de genul my_paged
.
