Error 404 nella paginazione di query personalizzate
Il problema di base è che ogni pagina di paginazione del mio blog restituisce un errore 404. /page/2/, /page/3/, ecc. Prima funzionava correttamente, ma ora non più. Penso che il passaggio alla versione 3.9 possa aver causato il problema.
Ecco alcune delle molte cose che ho provato per risolvere il problema. Il risultato finale è sempre lo stesso: i link di paginazione restituiscono 404.
- disattivato tutti i plugin
- rimosso e reimpostato i permalink più volte
- provato i permalink come predefiniti invece di /postname
- Verificato che nelle Impostazioni di lettura > Le pagine blog mostrano al massimo fosse impostato lo stesso numero del mio loop (ho provato anche con valori diversi per testare)
- Ho provato due plugin di navigazione separati e la paginazione predefinita di WordPress (post più vecchi) ma dà sempre errore 404
- provato a usare parse_query
- provato paginate_links
Ecco il mio codice (o link al mio codice):
home.php
<?php require dirname( __FILE__ ) . '/blog-page.php';
blog-page.php
<?php
/*
Template Name: Blog Page - Custom
*/
get_header(); ?>
<---CODICE PERSONALIZZATO--->
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'posts_per_page' => 5,
'post_type' => 'post',
'paged' => $paged
);
$wp_query = new WP_Query($args);
if($wp_query->have_posts()) :
while($wp_query->have_posts()) : $wp_query->the_post(); ?>
<---CODICE PERSONALIZZATO--->
endwhile;
wp_reset_postdata();?>
<div class="nav-previous alignleft"><?php next_posts_link( 'Post più vecchi' ); ?></div>
<div class="nav-next alignright"><?php previous_posts_link( 'Post più recenti' ); ?></div>
<?php endif; wp_reset_query();
Se può aiutare, ecco un sito di test che ho creato con la pagina in questione. Ho lasciato la paginazione predefinita di WordPress.
Ho esaurito le idee. Qualsiasi suggerimento sarebbe apprezzato.

Ci sono un paio di cose che non capisco qui, ma cercherò di rispondere man mano che procedo.
Hai un home.php, che presumo sia la tua homepage predefinita. Hai una sola riga di codice lì dentro, che serve a richiamare un altro template di pagina. Ecco il tuo codice
<?php require dirname( __FILE__ ) . '/blog-page.php';
In blog-page.php hai il template completo della pagina. La mia domanda è: perché lo fai? Perché non inserire semplicemente il contenuto di blog-page.php direttamente in home.php? Sarebbe più logico.
Non stai usando la query principale per eseguire il tuo loop, ma una query personalizzata, cosa che non capisco, perché la tua query personalizzata fa esattamente la stessa cosa della query principale, tranne che per il numero di post per pagina. Tutta questa query personalizzata può essere evitata usando semplicemente pre_get_posts
per impostare un numero personalizzato di post nella tua homepage.
function posts_on_homepage( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'posts_per_page', '5' );
}
}
add_action( 'pre_get_posts', 'posts_on_homepage' );
Puoi aggiungere questo codice in functions.php, che imposterà il numero di post nella tua homepage a 5, e poi puoi sostituire la query personalizzata con un normale loop.
Una cosa da tenere a mente: ogni volta che esegui una query personalizzata, la paginazione fallirà come indicato nei commenti.
Dovrai dare un'occhiata ai parametri di paginazione di WP_Qeury
.
paged (int) - numero della pagina. Mostra i post che normalmente apparirebbero solo nella pagina X quando si utilizza il link "Older Entries".
page (int) - numero della pagina per una front page statica. Mostra i post che normalmente apparirebbero solo nella pagina X di una Front Page statica.
Quindi la tua query dovrebbe essere così per le pagine normali
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$query = new WP_Query( array( 'paged' => $paged ) );
E così per le pagine statiche
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
$query = new WP_Query( array( 'paged' => $paged ) );
Stai anche ripristinando i tuoi postdata due volte. Dovresti farlo solo una volta. A proposito, wp_reset_query();
è sbagliato, va usato solo con query_posts
che non dovrebbe essere utilizzato. Dovresti usare wp_reset_postdata();
Infine, quando usi una query personalizzata, devi specificare il numero massimo di pagine per next_posts_link
usando il parametro $max_pages
, altrimenti fallirà.
next_posts_link( 'Older Entries', $the_query->max_num_pages );
Ecco un esempio di una query personalizzata funzionante correttamente, preso dal codex
<?php
// imposta il parametro "paged" (usa 'page' se la query è su una front page statica)
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
// la query
$the_query = new WP_Query( 'cat=1&paged=' . $paged );
?>
<?php if ( $the_query->have_posts() ) : ?>
<?php
// il loop
while ( $the_query->have_posts() ) : $the_query->the_post();
?>
<?php the_title(); ?>
<?php endwhile; ?>
<?php
// uso di next_posts_link() con max_num_pages
next_posts_link( 'Older Entries', $the_query->max_num_pages );
previous_posts_link( 'Newer Entries' );
?>
<?php
// pulizia dopo la nostra query
wp_reset_postdata();
?>
<?php else: ?>
<p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
<?php endif; ?>
Spero che questo chiarisca il tuo problema

Grazie mille, davvero tanto, per aver dedicato del tempo a scrivere una risposta così dettagliata. Ho provato così tante opzioni che penso di aver finito per fare un pasticcio. Sicuramente salverò quello che hai scritto perché mi sarà utile molte volte in futuro. Ho copiato il mio codice da blog-page.php e l'ho spostato in home.php. Sono passato alla query di default. Poi ho aggiunto quella funzione per limitare il numero di post. L'avevo impostato nelle Impostazioni di Lettura, ma la pagina lo ignorava anche dopo aver spostato il codice in home.php. Hai idea del perché? In ogni caso, ora funziona perfettamente. Non posso ringraziarti abbastanza per il tuo aiuto.

Hai impostato una homepage in "Impostazioni di Lettura >> La tua home page visualizza"? Se no, modifica la tua domanda e aggiungi il codice che è attualmente in home.php così posso darci un'occhiata veloce :)

Sì, l'ho impostato. Guarda qui: http://imgur.com/n8YINbI Ecco il mio nuovo home.php http://pastebin.com/bTHRMFqT Se rimuovo la funzione che mi hai dato, vengono visualizzati tutti i post e non c'è paginazione. Se aggiungo la funzione, allora viene visualizzato il numero corretto e funziona come dovrebbe.

Sono arrivato in ritardo alla festa, ma nessuna delle soluzioni sopra mi ha aiutato. Sono riuscito a scrivere un piccolo workaround per questa situazione estremamente fastidiosa.
- Esamina l'URL
- Se è presente /page/2, scrivi una regola di reindirizzamento per aggiungere una query string all'URL
- Utilizza quella query nella tua paginazione.
//Imposta un globale per i segmenti URL (functions.php)
global $segments;
$segments = explode('/', $_SERVER['REQUEST_URI']);
$segments = array_filter($segments);
$segments['classes'] = implode(' ', $segments);
//Aggiungi questa riscrittura nel tuo functions.php per aggiungere una query string al target
add_action( 'init', 'forum_paging_redirect', 10 );
function forum_paging_redirect( $redirect_url ) {
global $segments;
if($segments[1] === 'forum' && $segments[2] === 'page') {
echo '<script>window.location = "/forum?topics_page='.$segments[3].'";</script>';
}
}
// Invece della funzione di paginazione nativa, stampa questo:
if(!empty($query_topics)) {
$total = $query_topics->max_num_pages;
$page = $_GET['topics_page'];
for($i = 1; $i < $total +1; $i++) {
if($i == $page) {
echo '<span aria-current="page" class="page-numbers current">'.$i.'</span>';
} else {
echo '<a class="page-numbers" href="/forum/?topics_page='.$i.'">'.$i.'</a>';
}
}
}
