Paginazione non funzionante

28 apr 2015, 00:39:14
Visualizzazioni: 25.6K
Voti: 2

Ho utilizzato la stessa query di paginazione per la maggior parte dei siti web che ho creato. Questa volta non funziona per qualche motivo. Ho utilizzato i link per la risoluzione dei problemi di paginazione Qui ma niente sembra funzionare. Ho allegato il mio codice qui sotto.

Questa volta sto interrogando i post in una tabella quindi penso che questo possa avere qualcosa a che fare con il problema, ma ho fatto la query anche senza tabella e continua a non funzionare. Si prega di vedere il mio codice qui sotto.

Nuova query

<?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 tabella con i dati dei miei campi meta personalizzati.

<table>
    <thead >
        <tr>

            <th>intestazione</th>
            <th>intestazione</th>
            <th>intestazione</th>
            <th>intestazione</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>

I miei link di paginazione

<?php
global $wp_query;

$big = 999999999; // serve un numero intero improbabile

echo paginate_links( array(
    'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format' => '?paged=%#%',
    'prev_text'          => __(' Precedente'),
    'next_text'          => __('Successivo '),
    'current' => max( 1, get_query_var('paged') ),
    'total' => $wp_query->max_num_pages
) );
?>

Quando dico che non funziona, intendo che i link di paginazione vengono visualizzati con il numero appropriato di pagine, ma quando premo sulla pagina due non cambia pagina. I permalink sono corretti e mostrano dominio/page/2 ma la pagina è la stessa della pagina uno. Questo è su un modello di pagina che ho creato per home-page.php. Apprezzo i suggerimenti.

5
Commenti

descrivi cosa intendi con non funziona, cosa succede? su che tipo di pagina si trova?

Milo Milo
28 apr 2015 01:49:05

Ciao @Milo Grazie per la tua risposta, quando dico che non funziona intendo che i link di impaginazione mostrano il numero corretto di pagine. ma quando clicco sulla pagina due non cambia pagina. i permalink sono corretti dice dominio/pagina/2 ma la pagina è la stessa della pagina uno. Questo succede su una pagina template che ho creato per home-page.php Apprezzo l'aiuto.

steamfunk steamfunk
28 apr 2015 02:49:07

Non usare query_posts, interrompe l'impaginazione e la query principale

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

Inoltre, tieni presente che il tuo commento dovrebbe essere una [modifica] alla tua domanda. Molti altri saltano e ignorano i commenti, e ignoreranno anche la tua domanda poiché non funziona non ha molto senso per loro

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

@PieterGoosen grazie ancora, lo terrò a mente!

steamfunk steamfunk
28 apr 2015 09:25:40
Tutte le risposte alla domanda 2
2

Come ho già affermato nei commenti, non dovresti mai usare query_posts, usa query_posts solo se intendi interrompere le funzionalità della tua pagina. Aggiungi query_posts in cima alla tua LISTA DEL MALE.

query_posts interrompe l'oggetto della query principale, lo stesso oggetto su cui si basa la tua funzione di paginazione. La tua funzione di paginazione si basa sulla proprietà $max_num_pages della query principale. Questo è solo uno dei tanti elementi che query_posts interrompe.

Per risolvere il tuo problema, utilizza WP_Query poiché sembra che tu stia usando un template di pagina personalizzato qui. Solo una nota: se home-page.php è una pagina frontale statica, come sospetto dal nome del template, allora

'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1),

dovrebbe essere

'paged' => ( get_query_var('page') ? get_query_var('page') : 1),

poiché le pagine frontali statiche usano page e non paged.

Puoi provare qualcosa del genere: (Molto importante, questo non è testato e copiato e incollato dall'OP, e ricorda sempre di resettare i postdata una volta che hai finito con la tua query personalizzata)

<?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>intestazione</th>
            <th>intestazione</th>
            <th>intestazione</th>
            <th>intestazione</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>

Quindi devi solo aggiornare la tua funzione di paginazione con la proprietà $max_num_pages dalla tua query personalizzata

<?php
$big = 999999999; // serve un intero improbabile

echo paginate_links( array(
    'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format' => '?paged=%#%',
    'prev_text'          => __(' Precedente'),
    'next_text'          => __('Successivo '),
    'current' => max( 1, get_query_var('paged') ),
    'total' => $query->max_num_pages
) );
?>
28 apr 2015 20:21:05
Commenti

Fantastico, grazie, lo apprezzo molto. Non lo sapevo prima.

steamfunk steamfunk
29 apr 2015 00:39:36

questo è cambiato recentemente? Fino al 2018 "paged" funzionava ma ha smesso di funzionare di recente (2020). Ho cambiato in "page" e ora funziona

thebigtine thebigtine
22 feb 2021 18:30:30
0

Stavo utilizzando una query personalizzata e avevo bisogno di impaginare i risultati della mia query. Poiché la funzione originale paginate_links() è strettamente legata ai contesti globali di $wp_query e $wp_rewrite, l'ho adattata per essere completamente indipendente. Utilizzo:

function myPaginateLinks( WP_Query $wp_query, $args = '' ) {
    global $wp_rewrite;

    // Impostazione dei valori predefiniti basati sull'URL corrente.
    $pagenum_link = html_entity_decode( get_pagenum_link() );
    $url_parts    = explode( '?', $pagenum_link );

    // Ottieni il numero massimo di pagine e la pagina corrente dalla query attuale, se disponibili.
    $total   = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1;
    $current = !empty($_GET['pg']) ? absint($_GET['pg']) : 1;

    // Aggiungi il segnaposto del formato all'URL base.
    $pagenum_link = trailingslashit( $url_parts[0] ) . '%_%';

    // La base dell'URL dipende dalle impostazioni dei permalink.
    $format  = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : '';
    $format .= '?pg=%#%';

    $defaults = array(
        'base'               => $pagenum_link, // http://example.com/all_posts.php%_% : %_% viene sostituito dal formato (sotto).
        'format'             => $format, // ?page=%#% : %#% viene sostituito dal numero di pagina.
        'total'              => $total,
        'current'            => $current,
        'aria_current'       => 'page',
        'show_all'           => false,
        'prev_next'          => true,
        'prev_text'          => __( '&laquo; Precedente' ),
        'next_text'          => __( 'Successivo &raquo;' ),
        'end_size'           => 1,
        'mid_size'           => 2,
        'type'               => 'plain',
        'add_args'           => array(), // Array di argomenti della query da aggiungere.
        'add_fragment'       => '',
        'before_page_number' => '',
        'after_page_number'  => '',
    );

    $args = wp_parse_args( $args, $defaults );

    if ( ! is_array( $args['add_args'] ) ) {
        $args['add_args'] = array();
    }

    // Unisci le variabili aggiuntive della query trovate nell'URL originale nell'array 'add_args'.
    if ( isset( $url_parts[1] ) ) {
        // Trova l'argomento del formato.
        $format       = explode( '?', str_replace( '%_%', $args['format'], $args['base'] ) );
        $format_query = isset( $format[1] ) ? $format[1] : '';
        wp_parse_str( $format_query, $format_args );

        // Trova gli argomenti della query dell'URL richiesto.
        wp_parse_str( $url_parts[1], $url_query_args );

        // Rimuovi l'argomento del formato dall'array degli argomenti della query, per evitare di sovrascrivere il formato personalizzato.
        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 ) );
    }

    // Chi sa cos'altro le persone passano in $args.
    $total = (int) $args['total'];
    if ( $total < 2 ) {
        return;
    }
    $current  = (int) $args['current'];
    $end_size = (int) $args['end_size']; // Fuori dai limiti? Imposta il valore predefinito.
    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>',
            /**
             * Filtro per i link impaginati per le pagine di archivio specificate.
             *
             * @since 3.0.0
             *
             * @param string $link URL del link impaginato.
             */
            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>',
                    /** Questo filtro è documentato in 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>',
            /** Questo filtro è documentato in 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;
    }

    /**
     * Filtro per l'output HTML dei link impaginati per gli archivi.
     *
     * @since 5.7.0
     *
     * @param string $r    Output HTML.
     * @param array  $args Un array di argomenti. Vedi paginate_links()
     *                     per informazioni sugli argomenti accettati.
     */
    $r = apply_filters( 'paginate_links_output', $r, $args );

    return $r;
}

Esempio di utilizzo:

$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);

Che produce esattamente lo stesso risultato di paginate_links, ma senza alcun legame con la query globale o le regole di rewrite:

paginazione wordpress query personalizzata custom post type cpt

Nota che sto usando $_GET['pg'] invece di ?paged per la paginazione, poiché non volevo che alcuna "magia di rewrite" interferisse con la paginazione.

20 giu 2021 19:32:49