La paginación no funciona

28 abr 2015, 00:39:14
Vistas: 25.6K
Votos: 2

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.

5
Comentarios

describe qué quieres decir con no funciona, ¿qué sucede? ¿en qué tipo de página está esto?

Milo Milo
28 abr 2015 01:49:05

Hola @Milo Gracias por tu respuesta, cuando digo que no funciona me refiero a que los enlaces de paginación muestran el número correcto de páginas. pero cuando presiono en la página dos no cambia de página. los enlaces permanentes son correctos, dice dominio/página/2 pero la página es la misma que la página uno. Esto está en una página de plantilla que creé para home-page.php Agradezco la ayuda.

steamfunk steamfunk
28 abr 2015 02:49:07

No uses query_posts, rompe la paginación y la consulta principal

Pieter Goosen Pieter Goosen
28 abr 2015 07:59:24

Además, ten en cuenta que tu comentario debería ser una [edición] a tu pregunta. Muchos otros pasan por alto y ignoran los comentarios, y pasarán por alto e ignorarán tu pregunta ya que no funciona tampoco tiene mucho sentido para ellos

Pieter Goosen Pieter Goosen
28 abr 2015 08:55:18

@PieterGoosen ¡gracias una vez más, lo tendré en cuenta!

steamfunk steamfunk
28 abr 2015 09:25:40
Todas las respuestas a la pregunta 2
2

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
) );
?>
28 abr 2015 20:21:05
Comentarios

¡Increíble, gracias! Realmente lo aprecio. No sabía eso antes.

steamfunk steamfunk
29 abr 2015 00:39:36

¿esto cambió recientemente? Hasta 2018 "paged" funcionaba, pero dejó de funcionar recientemente (2020). Lo cambié a "page" y ahora funciona

thebigtine thebigtine
22 feb 2021 18:30:30
0

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'          => __( '&laquo; Anterior' ),
        'next_text'          => __( 'Siguiente &raquo;' ),
        '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">' . __( '&hellip;' ) . '</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:

paginación de wordpress en consulta personalizada con tipo de post personalizado cpt

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.

20 jun 2021 19:32:49