Paginarea nu funcționează în template-ul de rezultate căutare
Nu reușesc să fac paginarea să funcționeze corect în template-ul meu de rezultate căutare. Linkurile de pagină apar, dar când accesez pagina 2, primesc o eroare 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');}
?>
Codul de Paginare în 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." din ".$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)."'>‹ Anterior</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)."\">Următoarea ›</a>";
if ($paged < $pages-1 && $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Ultima »</a>";
echo "</div>\n";
}
}
Template-ul de Rezultate Căutare
<?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="Premii Studenți" href="<?php the_permalink();?>">Citește mai mult</a></span>
</div><?php edit_post_link('Editează'); ?>
<?php endwhile; ?><?php else : ?>
<p class="notfoundtext">Ne pare rău, nu s-au găsit rezultate care să corespundă căutării. Încercați din nou?</p>
<?php endif; ?>
<?php pagination(); ?>
Aveți sugestii?
Pagina 1 care se repetă este de obicei o problemă legată de wp_query. O eroare 404 este o problemă de permalinkuri - încearcă să le setezi la valorile implicite și verifică dacă problema persistă. Dacă nu, atunci revino la setările personalizate și problema ar trebui să fie rezolvată.
Dacă permalinkurile implicite îți dau o eroare 404 pe pagina a doua, atunci trebuie să analizăm mai atent codul de paginare. Personal, sunt fan al codului lui Justin Tadlock pentru că este impecabil.
https://github.com/justintadlock/hybrid-core/blob/master/extensions/loop-pagination.php

Am schimbat structura permalinkurilor înapoi la cea standard și a făcut același lucru, problema cu eroarea 404, apoi am încercat codul lui Justin Tadlock dar afișează un comportament ciudat, are pagina 1 care se repetă și linkul către pagina 1 este evidențiat indiferent pe ce pagină mă aflu!

Suprascrieți variabila $wp_query
în cadrul șablonului de căutare. Aceasta înseamnă că interogarea principală care rulează înainte de încărcarea șablonului de căutare va fi dez sincronizată cu variabila $wp_query
din șablon. Acest lucru poate cauza erori 404.
Deoarece singurul lucru pe care îl faceți este modificarea parametrului posts_per_page
, un simplu callback pre_get_posts
va rezolva cel puțin o parte din această problemă.
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');
Cu această funcție implementată, nu mai aveți nevoie și ar trebui să eliminați următorul cod:
$search_query = array(
'posts_per_page' => '10',
'paged' => $paged,
);
$wp_query = new WP_Query($search_query);
Nu știu de ce ați implementat propria soluție de paginare și nu pot spune doar privind codul dacă acesta va genera probleme în structura URL
-urilor, dar vă sugerez să analizați funcția paginate_links

Mulțumesc, m-am gândit că poate suprascria $wp_query. Am încercat pre_get_posts dar nu a făcut nimic

Codul pe care l-ai dat nu a produs nicio schimbare în ceea ce privește funcționarea paginării. Când am efectuat o căutare, nu a limitat la 10 postări pe pagină, a afișat toate. Am încercat să elimin paginarea personalizată și să adaug paginate_links dar nu a făcut nimic. E mai bine acum?

Am search.php care conține codul din întrebarea mea originală, care direcționează către alte două șabloane, iar cel pe care vreau să funcționeze paginarea se numește search-standard.php

Încearcă din nou. A fost o greșală de tipar. Dacă tot nu funcționează, probabil condiția is_search
nu este îndeplinită din cauza modului în care jonglezi cu șabloanele.
