La paginación no funciona
He estado usando la misma consulta de paginación para la mayoría de los sitios web que he creado. Esta vez no está funcionando por alguna razón. He utilizado los enlaces de solución de problemas de paginación Aquí pero nada parece funcionar. He adjuntado mi código a continuación.
Esta vez estoy consultando las entradas en una tabla, así que creo que debe tener algo que ver con eso, pero también he hecho la consulta sin una tabla y sigue sin funcionar. Por favor, vean mi código a continuación.
Nueva consulta
<?php
$args = array(
'post_type' => 'custom_post_type',
'posts_per_page' => 5,
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1),
);
query_posts($args);
?>
La tabla con mis datos de tabla desde mis campos meta personalizados.
<table>
<thead >
<tr>
<th>encabezado</th>
<th>encabezado</th>
<th>encabezado</th>
<th>encabezado</th>
</tr>
</thead>
<tbody>
<?php while (have_posts()) : the_post();?>
<tr>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
</tr>
<?php
endwhile;
?>
</tbody>
</table>
Mis enlaces de paginación
<?php
global $wp_query;
$big = 999999999; // necesitamos un número entero improbable
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'prev_text' => __('Anterior'),
'next_text' => __('Siguiente'),
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages
) );
?>
Cuando digo que no está funcionando, me refiero a que los enlaces de paginación se muestran con el número apropiado de páginas, pero cuando presiono en la página dos no está cambiando de páginas. Los enlaces permanentes están bien, dice dominio/pagina/2
pero la página es la misma que la página uno. Esto está en una plantilla de página que creé para home-page.php
. Agradezco las sugerencias.

Como ya mencioné en los comentarios, nunca deberías usar query_posts
, solo usa query_posts
si tu intención es romper la funcionalidad de tu página. Agrega query_posts
al principio de tu LISTA NEGRA.
query_posts
rompe el objeto de consulta principal, el mismo objeto del que depende tu función de paginación. Tu función de paginación depende de la propiedad $max_num_pages
de la consulta principal. Esto es solo una de las muchas cosas que query_posts
rompe.
Para solucionar tu problema, utiliza WP_Query
ya que parece que estás usando una plantilla de página personalizada aquí. Solo una nota, si home-page.php
es una página de inicio estática, lo cual sospecho por el nombre de la plantilla, entonces
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1),
debería ser
'paged' => ( get_query_var('page') ? get_query_var('page') : 1),
ya que las páginas de inicio estáticas usan page
y no paged
.
Puedes probar algo como esto: (Muy importante, esto no está probado y es copiado y pegado del OP, y siempre recuerda restablecer los datos de la publicación una vez que hayas terminado con tu consulta personalizada)
<?php
$args = array(
'post_type' => 'custom_post_type',
'posts_per_page' => 5,
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1),
);
$query = new WP_Query($args);
?>
<table>
<thead >
<tr>
<th>encabezado</th>
<th>encabezado</th>
<th>encabezado</th>
<th>encabezado</th>
</tr>
</thead>
<tbody>
<?php while ($query->have_posts()) : $query->the_post();?>
<tr>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
<td><?php echo get_post_meta($post->ID, 'metakey', true); ?></td>
</tr>
<?php
endwhile;
wp_reset_postdata();
?>
</tbody>
</table>
Luego solo necesitas actualizar tu función de paginación con la propiedad $max_num_pages
de tu consulta personalizada
<?php
$big = 999999999; // necesitamos un entero improbable
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'prev_text' => __(' Anterior'),
'next_text' => __('Siguiente '),
'current' => max( 1, get_query_var('paged') ),
'total' => $query->max_num_pages
) );
?>

Estaba usando una consulta personalizada y necesitaba paginar los resultados de mi consulta. Dado que la función original paginate_links()
está fuertemente vinculada a los contextos globales $wp_query
y $wp_rewrite
, la he adaptado para que sea completamente independiente. Uso:
function myPaginateLinks( WP_Query $wp_query, $args = '' ) {
global $wp_rewrite;
// Configurar valores predeterminados basados en la URL actual.
$pagenum_link = html_entity_decode( get_pagenum_link() );
$url_parts = explode( '?', $pagenum_link );
// Obtener páginas máximas y página actual de la consulta actual, si está disponible.
$total = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1;
$current = !empty($_GET['pg']) ? absint($_GET['pg']) : 1;
// Añadir el marcador de posición de formato a la URL base.
$pagenum_link = trailingslashit( $url_parts[0] ) . '%_%';
// La base de la URL depende de la configuración de enlaces permanentes.
$format = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : '';
$format .= '?pg=%#%';
$defaults = array(
'base' => $pagenum_link, // http://ejemplo.com/todos_los_posts.php%_% : %_% es reemplazado por format (abajo).
'format' => $format, // ?page=%#% : %#% es reemplazado por el número de página.
'total' => $total,
'current' => $current,
'aria_current' => 'page',
'show_all' => false,
'prev_next' => true,
'prev_text' => __( '« Anterior' ),
'next_text' => __( 'Siguiente »' ),
'end_size' => 1,
'mid_size' => 2,
'type' => 'plain',
'add_args' => array(), // Array de argumentos de consulta para añadir.
'add_fragment' => '',
'before_page_number' => '',
'after_page_number' => '',
);
$args = wp_parse_args( $args, $defaults );
if ( ! is_array( $args['add_args'] ) ) {
$args['add_args'] = array();
}
// Fusionar variables de consulta adicionales encontradas en la URL original en el array 'add_args'.
if ( isset( $url_parts[1] ) ) {
// Encontrar el argumento de formato.
$format = explode( '?', str_replace( '%_%', $args['format'], $args['base'] ) );
$format_query = isset( $format[1] ) ? $format[1] : '';
wp_parse_str( $format_query, $format_args );
// Encontrar los argumentos de consulta de la URL solicitada.
wp_parse_str( $url_parts[1], $url_query_args );
// Eliminar el argumento de formato del array de argumentos de consulta, para evitar sobrescribir el formato personalizado.
foreach ( $format_args as $format_arg => $format_arg_value ) {
unset( $url_query_args[ $format_arg ] );
}
$args['add_args'] = array_merge( $args['add_args'], urlencode_deep( $url_query_args ) );
}
// Quién sabe qué más pasan las personas en $args.
$total = (int) $args['total'];
if ( $total < 2 ) {
return;
}
$current = (int) $args['current'];
$end_size = (int) $args['end_size']; // ¿Fuera de límites? Hacerlo predeterminado.
if ( $end_size < 1 ) {
$end_size = 1;
}
$mid_size = (int) $args['mid_size'];
if ( $mid_size < 0 ) {
$mid_size = 2;
}
$add_args = $args['add_args'];
$r = '';
$page_links = array();
$dots = false;
if ( $args['prev_next'] && $current && 1 < $current ) :
$link = str_replace( '%_%', 2 == $current ? '' : $args['format'], $args['base'] );
$link = str_replace( '%#%', $current - 1, $link );
if ( $add_args ) {
$link = add_query_arg( $add_args, $link );
}
$link .= $args['add_fragment'];
$page_links[] = sprintf(
'<a class="prev page-numbers" href="%s">%s</a>',
/**
* Filtra los enlaces paginados para las páginas de archivo dadas.
*
* @since 3.0.0
*
* @param string $link La URL del enlace paginado.
*/
esc_url( apply_filters( 'paginate_links', $link ) ),
$args['prev_text']
);
endif;
for ( $n = 1; $n <= $total; $n++ ) :
if ( $n == $current ) :
$page_links[] = sprintf(
'<span aria-current="%s" class="page-numbers current">%s</span>',
esc_attr( $args['aria_current'] ),
$args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number']
);
$dots = true;
else :
if ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) :
$link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] );
$link = str_replace( '%#%', $n, $link );
if ( $add_args ) {
$link = add_query_arg( $add_args, $link );
}
$link .= $args['add_fragment'];
$page_links[] = sprintf(
'<a class="page-numbers" href="%s">%s</a>',
/** Este filtro está documentado en wp-includes/general-template.php */
esc_url( apply_filters( 'paginate_links', $link ) ),
$args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number']
);
$dots = true;
elseif ( $dots && ! $args['show_all'] ) :
$page_links[] = '<span class="page-numbers dots">' . __( '…' ) . '</span>';
$dots = false;
endif;
endif;
endfor;
if ( $args['prev_next'] && $current && $current < $total ) :
$link = str_replace( '%_%', $args['format'], $args['base'] );
$link = str_replace( '%#%', $current + 1, $link );
if ( $add_args ) {
$link = add_query_arg( $add_args, $link );
}
$link .= $args['add_fragment'];
$page_links[] = sprintf(
'<a class="next page-numbers" href="%s">%s</a>',
/** Este filtro está documentado en wp-includes/general-template.php */
esc_url( apply_filters( 'paginate_links', $link ) ),
$args['next_text']
);
endif;
switch ( $args['type'] ) {
case 'array':
return $page_links;
case 'list':
$r .= "<ul class='page-numbers'>\n\t<li>";
$r .= implode( "</li>\n\t<li>", $page_links );
$r .= "</li>\n</ul>\n";
break;
default:
$r = implode( "\n", $page_links );
break;
}
/**
* Filtra la salida HTML de los enlaces paginados para archivos.
*
* @since 5.7.0
*
* @param string $r Salida HTML.
* @param array $args Un array de argumentos. Ver paginate_links()
* para información sobre los argumentos aceptados.
*/
$r = apply_filters( 'paginate_links_output', $r, $args );
return $r;
}
Ejemplo de uso:
$myQuery = new WP_Query();
$cars = $myQuery->query([
'post_type' => 'cars',
'paged' => !empty($_GET['pg']) ? absint($_GET['pg']) : 1,
]);
foreach ($cars as $car) {
echo $car->post_title;
}
echo myPaginateLinks($myQuery);
Lo que produce exactamente el mismo resultado que paginate_links, pero sin ningún vínculo con la consulta global o las reglas de reescritura:
Observa que estoy usando $_GET['pg']
en lugar de ?paged
para la paginación, ya que no quería que ninguna "magia de reescritura" interfiriera con la paginación.
