¿Paginación al usar wp_query?

27 ene 2017, 08:18:08
Vistas: 203K
Votos: 47
<!-- consulta -->
<?php
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $query = new WP_Query( array(
        'category_name' => 'investor-news',
        'posts_per_page' => 2,
        'paged' => $paged
    ) );
?>

<?php if ( $query->have_posts() ) : ?>

<!-- inicio del bucle -->
<?php while ( $query->have_posts() ) : $query->the_post(); ?>

    <h2><a href="<?php the_permalink(); ?>" title="Leer"><?php the_title(); ?></a></h2>
    <?php the_excerpt(); ?>
    <?php echo get_the_date(); ?>

<?php endwhile; ?>
<!-- fin del bucle -->


<!-- ¿QUÉ VA AQUÍ?????? -->


<?php wp_reset_postdata(); ?>

<?php else : ?>
    <p><?php _e( 'Lo sentimos, ninguna entrada coincide con tus criterios.' ); ?></p>
<?php endif; ?>

He intentado todo para lograr la paginación en esta página estática usando la función wp_query pero sin éxito. Hay un comentario en este script que dice ¿QUÉ VA AQUÍ?...... entonces, ¿qué va ahí?

Esto está en una página estática que no es la página principal ni la página de entradas.

0
Todas las respuestas a la pregunta 4
4
67

Reemplaza <!-- WHAT GOES HERE?????? --> con el código de paginación a continuación:

<div class="pagination">
    <?php 
        echo paginate_links( array(
            'base'         => str_replace( 999999999, '%#%', esc_url( get_pagenum_link( 999999999 ) ) ),
            'total'        => $query->max_num_pages,
            'current'      => max( 1, get_query_var( 'paged' ) ),
            'format'       => '?paged=%#%',
            'show_all'     => false,
            'type'         => 'plain',
            'end_size'     => 2,
            'mid_size'     => 1,
            'prev_next'    => true,
            'prev_text'    => sprintf( '<i></i> %1$s', __( 'Entradas más recientes', 'text-domain' ) ),
            'next_text'    => sprintf( '%1$s <i></i>', __( 'Entradas más antiguas', 'text-domain' ) ),
            'add_args'     => false,
            'add_fragment' => '',
        ) );
    ?>
</div>

WordPress incluye una función práctica llamada paginate_links() que hace el trabajo pesado. En el ejemplo anterior, se utiliza el objeto personalizado WP_Query $query en lugar del objeto global $wp_query.

Edición: En respuesta al comentario de @mark-in-motion, aquí hay un ejemplo de una función envoltorio para paginate_links() que hice hace un tiempo. Puedes agregar esto al functions.php de tu tema, luego llamar a echo my_pagination(); en tu plantilla para mostrar la paginación.

/**
 * Paginación numérica mediante la función principal de WP paginate_links().
 * @link http://codex.wordpress.org/Function_Reference/paginate_links
 *
 * @param array $args
 *
 * @return string HTML para paginación numérica
 */
function my_pagination( $args = array() ) {
    global $wp_query;
    $output = '';

    if ( $wp_query->max_num_pages <= 1 ) {
        return;
    }

    $pagination_args = array(
        'base'         => str_replace( 999999999, '%#%', esc_url( get_pagenum_link( 999999999 ) ) ),
        'total'        => $wp_query->max_num_pages,
        'current'      => max( 1, get_query_var( 'paged' ) ),
        'format'       => '?paged=%#%',
        'show_all'     => false,
        'type'         => 'plain',
        'end_size'     => 2,
        'mid_size'     => 1,
        'prev_next'    => true,
        //'prev_text'    => __( '&laquo; Anterior', 'text-domain' ),
        //'next_text'    => __( 'Siguiente &raquo;', 'text-domain' ),
        //'prev_text'    => __( '&lsaquo; Anterior', 'text-domain' ),
        //'next_text'    => __( 'Siguiente &rsaquo;', 'text-domain' ),
        'prev_text'    => sprintf( '<i></i> %1$s',
            apply_filters( 'my_pagination_page_numbers_previous_text',
            __( 'Entradas más recientes', 'text-domain' ) )
        ),
        'next_text'    => sprintf( '%1$s <i></i>',
            apply_filters( 'my_pagination_page_numbers_next_text',
            __( 'Entradas más antiguas', 'text-domain' ) )
        ),
        'add_args'     => false,
        'add_fragment' => '',

        // Argumentos personalizados que no son parte del núcleo de WP:
        'show_page_position' => false, // Opcionalmente permite mostrar el HTML "Página X de XX".
    );

    $pagination_args = apply_filters( 'my_pagination_args', array_merge( $pagination_args, $args ), $pagination_args );

    $output .= paginate_links( $pagination_args );

    // Opcionalmente, mostrar Página X de XX.
    if ( true == $pagination_args['show_page_position'] && $wp_query->max_num_pages > 0 ) {
        $output .= '<span class="page-of-pages">' .
                                    sprintf( __( 'Página %1s de %2s', 'text-domain' ), $pagination_args['current'], $wp_query->max_num_pages ) .
                '</span>';
    }

    return $output;
}
27 ene 2017 08:34:18
Comentarios

Creo que llegué demasiado tarde. Pero la pregunta es... ¿por qué debería escribir 999999999?

MFarooqi MFarooqi
21 mar 2021 01:47:21

Este es un truco para obtener los resultados de get_pagenum_link() con %#% en lugar del número de página (999999999).

Dave Romsey Dave Romsey
26 mar 2021 17:32:30

¿Hay alguna manera de poner esto en functions.php para que solo tengas que llamar a pageinate_links() y no todo el código?

mark-in-motion mark-in-motion
13 jul 2022 10:26:23

@mark-in-motion ¡Claro! He añadido un ejemplo a la respuesta.

Dave Romsey Dave Romsey
15 jul 2022 21:53:08
2
15

Este código es para la Paginación de Consulta Personalizada. Puedes seguir los pasos para crear tu propia paginación en WordPress.

<?php
/**
* Plantilla Nombre: Página Personalizada
*/
get_header(); ?>

<?php
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$args = array(
  'posts_per_page' => 4,
  'paged' => $paged
);
$custom_query = new WP_Query( $args );
?>
          <!----inicio-------->
<div class="wrap">
<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">

<?php
   while($custom_query->have_posts()) :
      $custom_query->the_post();
?>
       <div>
        <ul>
         <li>
           <h3><a href="<?php the_permalink(); ?>" ><?php the_title(); ?></a></h3>
        <div>
          <ul>
        <div><a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('thumbnail'); ?></a></div>
          </ul>
          <ul>
        <p><?php echo the_content(); ?></p>
          </ul>
        </div>
        <div>
          </li>
        </ul>
          </div> <!-- fin de entradas del blog -->
       <?php endwhile; ?>
      <?php if (function_exists("pagination")) {
          pagination($custom_query->max_num_pages);
      } ?>
</main><!-- #main -->
</div><!-- #primary -->
</div><!-- .wrap -->
          <!----fin-------->
        <?php get_footer();

Referencia: https://www.wpblog.com/use-wp_query-to-create-pagination/

15 nov 2017 10:31:04
Comentarios

Parece que la función pagination no existe, por favor ayuda

Karue Benson Karue Karue Benson Karue
27 jun 2021 03:41:08

@KarueBensonKarue eso es porque el autor de esta respuesta copió y pegó algo de otro sitio web, y tú copiaste y pegaste de este sitio web Si vas a la fuente https://wpblog.com/use-wp_query-to-create-pagination/ verás cómo explican definir la función pagination() también

User User
21 feb 2023 05:54:43
0

Si alguien llega aquí intentando crear una wp_query con paginación desde dentro de un shortcode:


add_shortcode('wp_query_pagination_inside_shortcode', 'my_shortcode_function_tag');
if (!function_exists('my_shortcode_function_tag')) {
    function my_shortcode_function_tag($atts)
    {
        ob_start(); // Activar el buffer de salida
        global $paged;
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
        $atts = shortcode_atts(
            array(
                'post_type' => 'post',
                // lo que prefieras
            ),
            $atts
        );
        $args = array(
            'posts_per_page' => 3,
            'paged' => $paged,
            'post_type' => $atts['post_type'],
            'orderby' => 'date',
            'order' => 'DESC',
        );
        $the_query = new WP_Query($args);

        if ($the_query->have_posts()) {
            while ($the_query->have_posts()) {
                $the_query->the_post();
                get_template_part('template-parts/loop');
            } //fin while

            $big = 999999999; // necesitamos un número improbable
            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 //$q es tu query personalizada
                )
            );
        } // Paginación dentro del endif
        return ob_get_clean(); // Descartar silenciosamente el contenido del buffer
        wp_reset_query(); // Volvemos al main_query() después de retornar nuestro contenido en buffer
    }
}
27 may 2021 08:38:48
1

Puedes simplemente usar una función integrada de WP

<?
the_posts_pagination()
?>

Hace el trabajo muy bien con WP_Query personalizado

27 nov 2020 00:47:37
Comentarios

No, no lo hace si lo usas en una página, por ejemplo. Hay una buena explicación aquí y una descripción detallada aquí sobre cómo puedes solucionarlo, pero de una manera "hackeada" no recomendada.

Adrian B Adrian B
18 oct 2023 15:31:36