Paginazione non funzionante
Ho utilizzato la stessa query di paginazione per la maggior parte dei siti web che ho creato. Questa volta non funziona per qualche motivo. Ho utilizzato i link per la risoluzione dei problemi di paginazione Qui ma niente sembra funzionare. Ho allegato il mio codice qui sotto.
Questa volta sto interrogando i post in una tabella quindi penso che questo possa avere qualcosa a che fare con il problema, ma ho fatto la query anche senza tabella e continua a non funzionare. Si prega di vedere il mio codice qui sotto.
Nuova query
<?php
$args = array(
'post_type' => 'custom_post_type',
'posts_per_page' => 5,
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1),
);
query_posts($args);
?>
La tabella con i dati dei miei campi meta personalizzati.
<table>
<thead >
<tr>
<th>intestazione</th>
<th>intestazione</th>
<th>intestazione</th>
<th>intestazione</th>
</tr>
</thead>
<tbody>
<?php while (have_posts()) : the_post();?>
<tr>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
</tr>
<?php
endwhile;
?>
</tbody>
</table>
I miei link di paginazione
<?php
global $wp_query;
$big = 999999999; // serve un numero intero improbabile
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'prev_text' => __(' Precedente'),
'next_text' => __('Successivo '),
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages
) );
?>
Quando dico che non funziona, intendo che i link di paginazione vengono visualizzati con il numero appropriato di pagine, ma quando premo sulla pagina due non cambia pagina. I permalink sono corretti e mostrano dominio/page/2
ma la pagina è la stessa della pagina uno. Questo è su un modello di pagina che ho creato per home-page.php
. Apprezzo i suggerimenti.

Come ho già affermato nei commenti, non dovresti mai usare query_posts
, usa query_posts
solo se intendi interrompere le funzionalità della tua pagina. Aggiungi query_posts
in cima alla tua LISTA DEL MALE.
query_posts
interrompe l'oggetto della query principale, lo stesso oggetto su cui si basa la tua funzione di paginazione. La tua funzione di paginazione si basa sulla proprietà $max_num_pages
della query principale. Questo è solo uno dei tanti elementi che query_posts
interrompe.
Per risolvere il tuo problema, utilizza WP_Query
poiché sembra che tu stia usando un template di pagina personalizzato qui. Solo una nota: se home-page.php
è una pagina frontale statica, come sospetto dal nome del template, allora
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1),
dovrebbe essere
'paged' => ( get_query_var('page') ? get_query_var('page') : 1),
poiché le pagine frontali statiche usano page
e non paged
.
Puoi provare qualcosa del genere: (Molto importante, questo non è testato e copiato e incollato dall'OP, e ricorda sempre di resettare i postdata una volta che hai finito con la tua query personalizzata)
<?php
$args = array(
'post_type' => 'custom_post_type',
'posts_per_page' => 5,
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1),
);
$query = new WP_Query($args);
?>
<table>
<thead >
<tr>
<th>intestazione</th>
<th>intestazione</th>
<th>intestazione</th>
<th>intestazione</th>
</tr>
</thead>
<tbody>
<?php while ($query->have_posts()) : $query->the_post();?>
<tr>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
</tr>
<?php
endwhile;
wp_reset_postdata();
?>
</tbody>
</table>
Quindi devi solo aggiornare la tua funzione di paginazione con la proprietà $max_num_pages
dalla tua query personalizzata
<?php
$big = 999999999; // serve un intero improbabile
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'prev_text' => __(' Precedente'),
'next_text' => __('Successivo '),
'current' => max( 1, get_query_var('paged') ),
'total' => $query->max_num_pages
) );
?>

Stavo utilizzando una query personalizzata e avevo bisogno di impaginare i risultati della mia query. Poiché la funzione originale paginate_links()
è strettamente legata ai contesti globali di $wp_query
e $wp_rewrite
, l'ho adattata per essere completamente indipendente. Utilizzo:
function myPaginateLinks( WP_Query $wp_query, $args = '' ) {
global $wp_rewrite;
// Impostazione dei valori predefiniti basati sull'URL corrente.
$pagenum_link = html_entity_decode( get_pagenum_link() );
$url_parts = explode( '?', $pagenum_link );
// Ottieni il numero massimo di pagine e la pagina corrente dalla query attuale, se disponibili.
$total = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1;
$current = !empty($_GET['pg']) ? absint($_GET['pg']) : 1;
// Aggiungi il segnaposto del formato all'URL base.
$pagenum_link = trailingslashit( $url_parts[0] ) . '%_%';
// La base dell'URL dipende dalle impostazioni dei permalink.
$format = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : '';
$format .= '?pg=%#%';
$defaults = array(
'base' => $pagenum_link, // http://example.com/all_posts.php%_% : %_% viene sostituito dal formato (sotto).
'format' => $format, // ?page=%#% : %#% viene sostituito dal numero di pagina.
'total' => $total,
'current' => $current,
'aria_current' => 'page',
'show_all' => false,
'prev_next' => true,
'prev_text' => __( '« Precedente' ),
'next_text' => __( 'Successivo »' ),
'end_size' => 1,
'mid_size' => 2,
'type' => 'plain',
'add_args' => array(), // Array di argomenti della query da aggiungere.
'add_fragment' => '',
'before_page_number' => '',
'after_page_number' => '',
);
$args = wp_parse_args( $args, $defaults );
if ( ! is_array( $args['add_args'] ) ) {
$args['add_args'] = array();
}
// Unisci le variabili aggiuntive della query trovate nell'URL originale nell'array 'add_args'.
if ( isset( $url_parts[1] ) ) {
// Trova l'argomento del formato.
$format = explode( '?', str_replace( '%_%', $args['format'], $args['base'] ) );
$format_query = isset( $format[1] ) ? $format[1] : '';
wp_parse_str( $format_query, $format_args );
// Trova gli argomenti della query dell'URL richiesto.
wp_parse_str( $url_parts[1], $url_query_args );
// Rimuovi l'argomento del formato dall'array degli argomenti della query, per evitare di sovrascrivere il formato personalizzato.
foreach ( $format_args as $format_arg => $format_arg_value ) {
unset( $url_query_args[ $format_arg ] );
}
$args['add_args'] = array_merge( $args['add_args'], urlencode_deep( $url_query_args ) );
}
// Chi sa cos'altro le persone passano in $args.
$total = (int) $args['total'];
if ( $total < 2 ) {
return;
}
$current = (int) $args['current'];
$end_size = (int) $args['end_size']; // Fuori dai limiti? Imposta il valore predefinito.
if ( $end_size < 1 ) {
$end_size = 1;
}
$mid_size = (int) $args['mid_size'];
if ( $mid_size < 0 ) {
$mid_size = 2;
}
$add_args = $args['add_args'];
$r = '';
$page_links = array();
$dots = false;
if ( $args['prev_next'] && $current && 1 < $current ) :
$link = str_replace( '%_%', 2 == $current ? '' : $args['format'], $args['base'] );
$link = str_replace( '%#%', $current - 1, $link );
if ( $add_args ) {
$link = add_query_arg( $add_args, $link );
}
$link .= $args['add_fragment'];
$page_links[] = sprintf(
'<a class="prev page-numbers" href="%s">%s</a>',
/**
* Filtro per i link impaginati per le pagine di archivio specificate.
*
* @since 3.0.0
*
* @param string $link URL del link impaginato.
*/
esc_url( apply_filters( 'paginate_links', $link ) ),
$args['prev_text']
);
endif;
for ( $n = 1; $n <= $total; $n++ ) :
if ( $n == $current ) :
$page_links[] = sprintf(
'<span aria-current="%s" class="page-numbers current">%s</span>',
esc_attr( $args['aria_current'] ),
$args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number']
);
$dots = true;
else :
if ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) :
$link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] );
$link = str_replace( '%#%', $n, $link );
if ( $add_args ) {
$link = add_query_arg( $add_args, $link );
}
$link .= $args['add_fragment'];
$page_links[] = sprintf(
'<a class="page-numbers" href="%s">%s</a>',
/** Questo filtro è documentato in wp-includes/general-template.php */
esc_url( apply_filters( 'paginate_links', $link ) ),
$args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number']
);
$dots = true;
elseif ( $dots && ! $args['show_all'] ) :
$page_links[] = '<span class="page-numbers dots">' . __( '…' ) . '</span>';
$dots = false;
endif;
endif;
endfor;
if ( $args['prev_next'] && $current && $current < $total ) :
$link = str_replace( '%_%', $args['format'], $args['base'] );
$link = str_replace( '%#%', $current + 1, $link );
if ( $add_args ) {
$link = add_query_arg( $add_args, $link );
}
$link .= $args['add_fragment'];
$page_links[] = sprintf(
'<a class="next page-numbers" href="%s">%s</a>',
/** Questo filtro è documentato in wp-includes/general-template.php */
esc_url( apply_filters( 'paginate_links', $link ) ),
$args['next_text']
);
endif;
switch ( $args['type'] ) {
case 'array':
return $page_links;
case 'list':
$r .= "<ul class='page-numbers'>\n\t<li>";
$r .= implode( "</li>\n\t<li>", $page_links );
$r .= "</li>\n</ul>\n";
break;
default:
$r = implode( "\n", $page_links );
break;
}
/**
* Filtro per l'output HTML dei link impaginati per gli archivi.
*
* @since 5.7.0
*
* @param string $r Output HTML.
* @param array $args Un array di argomenti. Vedi paginate_links()
* per informazioni sugli argomenti accettati.
*/
$r = apply_filters( 'paginate_links_output', $r, $args );
return $r;
}
Esempio di utilizzo:
$myQuery = new WP_Query();
$cars = $myQuery->query([
'post_type' => 'cars',
'paged' => !empty($_GET['pg']) ? absint($_GET['pg']) : 1,
]);
foreach ($cars as $car) {
echo $car->post_title;
}
echo myPaginateLinks($myQuery);
Che produce esattamente lo stesso risultato di paginate_links, ma senza alcun legame con la query globale o le regole di rewrite:
Nota che sto usando $_GET['pg']
invece di ?paged
per la paginazione, poiché non volevo che alcuna "magia di rewrite" interferisse con la paginazione.
