¿Paginación al usar wp_query?
<!-- 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.

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' => __( '« Anterior', 'text-domain' ),
//'next_text' => __( 'Siguiente »', 'text-domain' ),
//'prev_text' => __( '‹ Anterior', 'text-domain' ),
//'next_text' => __( 'Siguiente ›', '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;
}

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

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

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

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/

@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

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
}
}

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.
