La paginación no funciona con la plantilla de resultados de búsqueda
No logro que la paginación funcione correctamente en mi plantilla de resultados de búsqueda. Los enlaces de página aparecen, pero cuando hago clic en la página 2, me da un error 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');}
?>
Código de Paginación en 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>Página ".$paged." de ".$pages."</span>";
if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>« Primera</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)."\">Siguiente ›</a>";
if ($paged < $pages-1 && $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Última »</a>";
echo "</div>\n";
}
}
Plantilla de Resultados de Búsqueda
<?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="Premios Estudiantiles" href="<?php the_permalink();?>">Leer más</a></span>
</div><?php edit_post_link('Editar'); ?>
<?php endwhile; ?><?php else : ?>
<p class="notfoundtext">Lo sentimos, no se encontraron resultados que coincidan con tu búsqueda. ¿Quieres intentarlo de nuevo?</p>
<?php endif; ?>
<?php pagination(); ?>
¿Alguna sugerencia?

La página 1 en bucle suele ser un problema de wp_query. Un error 404 es un problema de enlaces permanentes: intenta configurarlos por defecto y comprueba si ocurre el mismo problema. Si no ocurre, vuelve a cambiarlos a personalizados y tu problema debería haberse resuelto.
Si los enlaces permanentes por defecto te dan un error 404 en la página dos, entonces debemos examinar más de cerca ese código de paginación. Personalmente, soy fan del código de Justin Tadlock porque es impecable.
https://github.com/justintadlock/hybrid-core/blob/master/extensions/loop-pagination.php

Cambié la estructura de los enlaces permanentes de vuelta a la estándar y ocurrió lo mismo, el problema del error 404, luego probé el código de Justin Tadlock pero muestra un comportamiento extraño, tiene la página 1 en repetición y la página 1 en la sección de enlaces aparece resaltada sin importar en qué página esté.

Estás sobrescribiendo $wp_query
dentro de la plantilla de búsqueda. Eso significa que la consulta principal que se ejecuta antes de que cargue tu plantilla de búsqueda no estará sincronizada con el $wp_query
en la plantilla. Esto suele causar errores 404.
Ya que lo único que estás haciendo es cambiar el posts_per_page
, un simple callback con pre_get_posts
solucionará al menos parte de este 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 esto implementado, no necesitas, y deberías eliminar, esto:
$search_query = array(
'posts_per_page' => '10',
'paged' => $paged,
);
$wp_query = new WP_Query($search_query);
No sé por qué has creado tu propia paginación, y no puedo determinar si ese código generará problemas con las URL
s, pero te sugiero que revises paginate_links

Gracias, pensé que podría haber estado sobrescribiendo el $wp_query. Probé el pre_get_posts pero no hizo nada

El código que me diste no produjo ningún cambio en cuanto a hacer funcionar la paginación. Cuando realicé una búsqueda, no limitó a 10 publicaciones por página, mostró todas. Intenté eliminar mi paginación personalizada y agregar paginate_links pero no hizo nada. ¿Es eso mejor?

Tengo search.php que contiene el código de mi pregunta original, que dirige a otras dos plantillas y la que quiero que funcione la paginación se llama search-standard.php

Inténtalo de nuevo. Había un error tipográfico. Si aún no funciona, probablemente la condición is_search
no se cumple debido a la forma en que estás manejando las plantillas.
