Paginación no funciona en página de inicio
Tengo una página llamada "share" con un loop complejo que funciona perfectamente. Esta página está ubicada en domain.com/share
. Ahora necesito usar esta página como página de inicio, así que fui a "Ajustes -> Lectura" y seleccioné esa página como página estática.
El problema ahora es que la paginación ya no funciona. En la página real se muestra como domain.com/share/page/2
pero ahora aparece como domain.com/page/2
y simplemente carga el mismo contenido de la primera página una y otra vez sin importar en qué página estés.
No hice ningún otro cambio, básicamente solo seleccioné esa página como página de inicio. ¿Cuáles son las posibles soluciones aquí?
Estoy usando WP Pagenavi por si eso hace alguna diferencia.
Este es mi template page.php
:
<?
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
if (is_page('join')) $post_types = array('articles');
if (is_page('learn')) $post_types = array('actions');
if (is_page('share')) $post_types = array('articles', 'actions');
$category = get_query_var('category');
$type = get_query_var('type');
$args = array(
'post_type' => $post_types,
'paged' => $paged,
'tax_query' => array('relation' => 'AND')
);
// Obtener todas las taxonomías relevantes
$taxonomies = array();
foreach ($post_types as $post_type) {
foreach (get_object_taxonomies($post_type) as $tax) {
if (array_search($tax, $taxonomies) === false) $taxonomies[] = $tax;
}
}
// Construir consulta de taxonomías
foreach ($taxonomies as $taxonomy) {
$all_terms = get_terms($taxonomy, array('fields' => 'names'));
$query_terms = array(ucfirst($category), ucwords(str_replace('-', ' ', $type)));
$cur_terms = array_values(array_filter(array_intersect($all_terms, $query_terms)));
if (! empty($cur_terms)) {
$args['tax_query'][] = array(
'taxonomy' => $taxonomy,
'terms' => empty($cur_terms) ? $all_terms : $cur_terms,
'field' => 'slug'
);
}
}
if (is_page('join')) $args['posts_per_page'] = 36;
$query = new WP_Query($args);
get_header();
Theme::toolbar();
?>
<div class="center">
<div id="content">
<? if ($query->have_posts()): ?>
<? while ($query->have_posts()): $query->the_post() ?>
<? get_template_part('content') ?>
<? endwhile ?>
<? else: ?>
<? endif ?>
</div>
</div>
<?
wp_reset_query();
Theme::pagination($query);
get_footer();
?>
Y este es el código de paginación en Theme
:
function pagination($query = null)
{
global $wp_query;
if (empty($query)) $query = $wp_query;
$is_paged = $query->max_num_pages > 1;
?>
<? if ($is_paged): ?>
<div class="center"><div id="pagination"><? wp_pagenavi(array('query' => $query)) ?></div></div>
<? endif ?>
<?
}

Me había enfrentado al mismo problema. Y finalmente, resolví el problema.
Obteniendo el número de paginación actual
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
Para obtener el número de paginación actual en una página frontal estática (plantilla de página) debes usar la variable de consulta 'page'.
<?php $paged = (get_query_var('page')) ? get_query_var('page') : 1; ?>
Por lo tanto, deberías usar get_query_var('page')
en lugar de get_query_var('paged')
.
Puedes usar la función is_front_page()
en una condición if para la consulta de la página frontal. Así como-
<?php
if(is_front_page()) {
$paged = (get_query_var('page')) ? get_query_var('page') : 1;
}else {
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
}
El crédito va aquí

No probé esto, pero la página de WP Query dice:
Nota sobre paginación: Usa
get_query_var('page');
si quieres que tu consulta funcione en una plantilla de Página que hayas configurado como tu página de inicio estática.
Entonces, quizás necesites esto:
$page_number = get_query_var('page') ? get_query_var('page') : 1;
[ ... ]
$args = array(
'post_type' => $post_types,
'page' => $page_number,
'tax_query' => array( 'relation' => 'AND' ),
);

Estoy usando este código para la paginación. En index.php para el bucle:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
// agregar título, extracto o enlaces permanentes
<?php endwhile; ?>
<?php pagination(); ?>
<?php else : ?>
<?php // mensaje de no se encontraron publicaciones va aquí ?>
<?php endif; ?>
Luego agrega las siguientes líneas a functions.php
function pagination() {
if( is_singular() )
return;
global $wp_query;
/** Detener la ejecución si solo hay 1 página */
if( $wp_query->max_num_pages <= 1 )
return;
$paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
$max = intval( $wp_query->max_num_pages );
/** Agregar la página actual al array */
if ( $paged >= 1 )
$links[] = $paged;
/** Agregar las páginas alrededor de la página actual al array */
if ( $paged >= 3 ) {
$links[] = $paged - 1;
$links[] = $paged - 2;
}
if ( ( $paged + 2 ) <= $max ) {
$links[] = $paged + 2;
$links[] = $paged + 1;
}
echo '<div class="navigation"><ul>' . "\n";
/** Enlace a la publicación anterior */
if ( get_previous_posts_link() )
printf( '<li>%s</li>' . "\n", get_previous_posts_link() );
/** Enlace a la primera página, más puntos suspensivos si es necesario */
if ( ! in_array( 1, $links ) ) {
$class = 1 == $paged ? ' class="active"' : '';
printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( 1 ) ), '1' );
if ( ! in_array( 2, $links ) )
echo '<li>…</li>';
}
/** Enlace a la página actual, más 2 páginas en cualquier dirección si es necesario */
sort( $links );
foreach ( (array) $links as $link ) {
$class = $paged == $link ? ' class="active"' : '';
printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $link ) ), $link );
}
/** Enlace a la última página, más puntos suspensivos si es necesario */
if ( ! in_array( $max, $links ) ) {
if ( ! in_array( $max - 1, $links ) )
echo '<li>…</li>' . "\n";
$class = $paged == $max ? ' class="active"' : '';
printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $max ) ), $max );
}
/** Enlace a la siguiente publicación */
if ( get_next_posts_link() )
printf( '<li>%s</li>' . "\n", get_next_posts_link() );
echo '</ul></div>' . "\n";
}
