La paginazione non funziona con il template dei risultati di ricerca

18 lug 2013, 12:36:09
Visualizzazioni: 13.6K
Voti: 0

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)."'>&laquo; Prima</a>";
     if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>&lsaquo; 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 &rsaquo;</a>";  
     if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Ultima &raquo;</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?

1
Commenti

Questo è contrassegnato come un duplicato ma non c'è alcun link a un'altra risposta.

strattonn strattonn
31 ott 2014 00:35:33
Tutte le risposte alla domanda 2
1

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

18 lug 2013 13:08:30
Commenti

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 RoseCoder
18 lug 2013 13:24:43
7

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

18 lug 2013 17:08:30
Commenti

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

RoseCoder RoseCoder
19 lug 2013 10:35:33

"non ha avuto alcun effetto" non è molto descrittivo.

s_ha_dum s_ha_dum
19 lug 2013 16:35:45

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 RoseCoder
19 lug 2013 21:11:32

Qual è il nome del tuo file template di ricerca .php?

s_ha_dum s_ha_dum
19 lug 2013 21:22:16

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 RoseCoder
19 lug 2013 21:27:42

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 s_ha_dum
19 lug 2013 21:39:25

Grazie, ho provato e testato ma senza successo! Potrei lasciar perdere l'idea, ma grazie mille per il tuo aiuto, davvero apprezzato!

RoseCoder RoseCoder
19 lug 2013 22:13:23
Mostra i restanti 2 commenti