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!
RoseCoder
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
RoseCoder
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ì?
RoseCoder
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
RoseCoder
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.
s_ha_dum