La paginazione non funziona con il template dei risultati di ricerca
Non riesco a far funzionare correttamente la paginazione nel mio template dei risultati di ricerca. I link delle pagine appaiono, ma quando clicco sulla pagina 2, ricevo un errore 404.
Search.php
<?php
global $wp_query;
$total_results = $wp_query->found_posts;
?>
<?php
if(!$wp_query) global $wp_query;
$search_refer = $_GET["post_type"];
if ($search_refer == 'archive') { load_template(TEMPLATEPATH . '/search-gallery.php');}
else{load_template(TEMPLATEPATH . '/search-standard.php');}
?>
Codice di Paginazione in Functions.php
function pagination($pages = '', $range = 4){
$showitems = ($range * 2)+1;
global $paged;
if(empty($paged)) $paged = 1;
if($pages == '')
{
global $wp_query;
$pages = $wp_query->max_num_pages;
if(!$pages)
{
$pages = 1;
}
}
if(1 != $pages)
{
echo "<div class=\"pagination\"><span>Pagina ".$paged." di ".$pages."</span>";
if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>« Prima</a>";
if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>‹ Precedente</a>";
for ($i=1; $i <= $pages; $i++)
{
if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
{
echo ($paged == $i)? "<span class=\"current\">".$i."</span>":"<a href='".get_pagenum_link($i)."' class=\"inactive\">".$i."</a>";
}
}
if ($paged < $pages && $showitems < $pages) echo "<a href=\"".get_pagenum_link($paged + 1)."\">Successiva ›</a>";
if ($paged < $pages-1 && $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Ultima »</a>";
echo "</div>\n";
}
}
Template dei Risultati di Ricerca
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$search_query = array(
'posts_per_page' => '10',
'paged' => $paged,
);
$wp_query = new WP_Query($search_query);
if ($wp_query->have_posts()) : while ($wp_query->have_posts()) : $wp_query->the_post(); ?>
<div class="courseContent coursesLayout alumniMainContent alumniSpacing newsBoxMore">
<div class="courseContentHolder alumniContentHolder newsBoxMainHolder">
<div class="newsMainImage">
<?php the_post_thumbnail(); ?>
</div>
<div class="alumniHeading newsMainHeading">
<h5><?php the_title();?></h5>
</div>
<div class="alumniContent newsMainContent">
<?php the_excerpt(); ?>
</div>
</div>
<span class="readmoreButton" style="display: inline !important;"><a title="Premi Studenteschi" href="<?php the_permalink();?>">Leggi tutto</a></span>
</div><?php edit_post_link('Modifica'); ?>
<?php endwhile; ?><?php else : ?>
<p class="notfoundtext">Spiacenti, nessun risultato trovato per la tua ricerca. Riprova?</p>
<?php endif; ?>
<?php pagination(); ?>
Qualche suggerimento?

La pagina 1 che si ripete è solitamente un problema relativo a wp_query. Un errore 404 è invece un problema di permalink - prova a impostarli su default e verifica se lo stesso problema si presenta. Se non si presenta, reimpostali su personalizzato e il problema dovrebbe essersi risolto da solo.
Se con i permalink di default ottieni un errore 404 sulla pagina due, allora dobbiamo esaminare più da vicino il codice di paginazione. Personalmente, sono un fan del codice di Justin Tadlock perché è impeccabile.
https://github.com/justintadlock/hybrid-core/blob/master/extensions/loop-pagination.php

Ho ripristinato la struttura dei permalink a quella standard ma ha fatto la stessa cosa, problema di 404, poi ho provato il codice di Justin Tadlock ma mostra uno strano comportamento, ha la pagina 1 in ripetizione e la pagina 1 nella sezione dei link è evidenziata indipendentemente dalla pagina in cui mi trovo!

Stai sovrascrivendo $wp_query
all'interno del template di ricerca. Ciò significa che la query principale che viene eseguita prima che il tuo template di ricerca venga caricato non sarà sincronizzata con la $wp_query
nel template. Questo tende a causare errori 404.
Dato che l'unica cosa che stai facendo è modificare il valore di posts_per_page
, un semplice callback pre_get_posts
risolverà almeno parte del problema.
function alter_search_ppp_wpse_106961($qry) {
if ($qry->is_main_query() && $qry->is_search()) {
$qry->set('post_per_page',10);
}
}
add_action('pre_get_posts','alter_search_ppp_wpse_106961');
Con questo codice in posizione, non hai bisogno (e dovresti rimuovere) questo:
$search_query = array(
'posts_per_page' => '10',
'paged' => $paged,
);
$wp_query = new WP_Query($search_query);
Non so perché hai implementato una tua paginazione personalizzata, e non posso dire con certezza solo guardandolo se quel codice genererà problemi con gli URL
, ma ti suggerirei di dare un'occhiata a paginate_links

Grazie, pensavo potesse aver sovrascritto il $wp_query. Ho provato pre_get_posts ma non ha avuto alcun effetto

Il codice che hai fornito non ha prodotto alcun cambiamento riguardo al funzionamento della paginazione. Quando ho eseguito una ricerca, non ha limitato i risultati a 10 post per pagina, ma mostrava tutto. Ho provato a rimuovere la mia paginazione personalizzata e ad aggiungere paginate_links ma non ha funzionato. È meglio così?

Ho search.php che contiene il codice della mia domanda originale, che indirizza a due altri template e quello su cui voglio che funzioni la paginazione si chiama search-standard.php

Prova di nuovo. C'era un errore di battitura. Se ancora non funziona, probabilmente la condizione is_search
non viene soddisfatta a causa del modo in cui stai gestendo i template.
