La paginación no funciona con la plantilla de resultados de búsqueda

18 jul 2013, 12:36:09
Vistas: 13.6K
Votos: 0

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

1
Comentarios

Está marcado como duplicado pero no hay un enlace a otra respuesta.

strattonn strattonn
31 oct 2014 00:35:33
Todas las respuestas a la pregunta 2
1

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

18 jul 2013 13:08:30
Comentarios

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é.

RoseCoder RoseCoder
18 jul 2013 13:24:43
7

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 URLs, pero te sugiero que revises paginate_links

18 jul 2013 17:08:30
Comentarios

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

RoseCoder RoseCoder
19 jul 2013 10:35:33

"no hizo nada" no es muy descriptivo.

s_ha_dum s_ha_dum
19 jul 2013 16:35:45

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?

RoseCoder RoseCoder
19 jul 2013 21:11:32

¿Cuál es el nombre de tu archivo de plantilla de búsqueda .php?

s_ha_dum s_ha_dum
19 jul 2013 21:22:16

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

RoseCoder RoseCoder
19 jul 2013 21:27:42

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.

s_ha_dum s_ha_dum
19 jul 2013 21:39:25

¡Gracias, lo intenté y lo probé pero sin éxito! Tal vez abandone la idea, pero muchas gracias por tu ayuda, ¡realmente lo aprecio mucho!

RoseCoder RoseCoder
19 jul 2013 22:13:23
Mostrar los 2 comentarios restantes