La paginación de WordPress no funciona en la plantilla search.php

2 ene 2018, 09:32:18
Vistas: 359
Votos: 1

Tengo un pequeño problema, la paginación no funciona en search.php. Consulto los resultados con wp_Query usando el código de abajo, puedo ver los enlaces de página pero cuando los presiono obtengo un error 404. Me dijeron que esto sucede porque estoy haciendo la consulta en la página search.php.

El código que estoy usando está tomado de la paginación de código wp, es una consulta larga pero lo importante son estas dos líneas:

$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;

y

'paged' => $paged,

consulta completa

if (isset($_GET['reg-prop-search-form'])){
    $paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;

    $args = array(
        'posts_per_page' => 9,
        's' => $_GET['s'],
        'post_type'      => 'property',
        'paged' => $paged,
        'meta_query'     =>  array(
            'relation '  => 'AND',
            array(
                'key'       => 'prop_area',
                'value'     => $area,
                'compare'   => $area_val,
            ),
            array(
                'key'       => 'prop_city',
                'value'     => $city,
                'compare'   => $city_val,
            ),
            array(
                'key'       => 'prop_type',
                'value'     => $type,
                'compare'   => $type_val,
            ),
            array(
                'key'     => 'prop_rooms',
                'value'   => array( $fromrooms, $torooms ),
                'type'    => 'numeric',
                'compare' => 'BETWEEN',
            ),
            array(
                'key'     => 'prop_store',
                'value'   => array( $fromfloor, $tofloor ),
                'type'    => 'numeric',
                'compare' => 'BETWEEN',
            ),
            array(
                'key'     => 'prop_price',
                'value'   => array( $min, $max ),
                'type'    => 'numeric',
                'compare' => $equal,
            ),
        ),
    );  
};

este es el loop

$the_query = new WP_Query( $args );

.....

    <?php if( $the_query->have_posts() ): ?>
        <?php while( $the_query->have_posts() ) : $the_query->the_post(); ?>

            <?php get_template_part( 'content', 'search' ); ?>

        <?php endwhile; ?>
    <div id="pagination">

        <?php
            $big = 999999999;
             echo paginate_links( array(
                'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
                'format' => '?paged=%#%',
                'current' => max( 1, get_query_var('paged') ),
                'total' => $the_query->max_num_pages
            ) );
        ?>
        <?php echo paginate_links( $args ); ?>

    </div>
    <?php else : ?>

        <?php get_template_part( 'no-results', 'search' ); ?>

    <?php endif; ?>
    <?php wp_reset_query();  // Restaurar los datos globales de post afectados por the_post(). ?>
</div>
Comentarios

El error 404 ocurre antes de que se seleccione tu archivo de plantilla. Usa la consulta global y el gancho de acción pre_get_posts para manipularlo.

janh janh
2 ene 2018 09:52:01

Gracias por tu respuesta, leí la documentación. No estoy usando la consulta global, estoy usando wp_query. ¿En qué función debería usar el pre_get_posts que mencionaste?

DavSev DavSev
2 ene 2018 10:01:07

pre_get_posts es un gancho global que te permite usar la consulta global wp_query, así que WP sabe cuántos resultados de búsqueda (y por lo tanto: páginas de resultados de búsqueda) están disponibles. Hay ejemplos que puedes adaptar, pero probablemente puedas copiar la mayor parte de tu código.

janh janh
2 ene 2018 12:53:16