Paginazione quando si usa wp_query?

27 gen 2017, 08:18:08
Visualizzazioni: 203K
Voti: 47
<!-- query -->
<?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() ) : ?>

<!-- inizia il loop -->
<?php while ( $query->have_posts() ) : $query->the_post(); ?>

    <h2><a href="<?php the_permalink(); ?>" title="Leggi"><?php the_title(); ?></a></h2>
    <?php the_excerpt(); ?>
    <?php echo get_the_date(); ?>

<?php endwhile; ?>
<!-- fine del loop -->


<!-- COSA VA QUI?????? -->


<?php wp_reset_postdata(); ?>

<?php else : ?>
    <p><?php _e( 'Spiacenti, nessun post corrisponde ai criteri.' ); ?></p>
<?php endif; ?>

Ho provato di tutto per ottenere la paginazione su questa pagina statica utilizzando la funzione wp_query ma senza successo. C'è un commento in questo script chiamato COSA VA QUI?????... quindi cosa va inserito in quel punto?

Questo codice si trova in una pagina statica che non è né la pagina principale né la pagina dei post.

0
Tutte le risposte alla domanda 4
4
67

Sostituisci <!-- WHAT GOES HERE?????? --> con il codice di paginazione qui sotto:

<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', __( 'Post più recenti', 'text-domain' ) ),
            'next_text'    => sprintf( '%1$s <i></i>', __( 'Post più vecchi', 'text-domain' ) ),
            'add_args'     => false,
            'add_fragment' => '',
        ) );
    ?>
</div>

WordPress include una comoda funzione chiamata paginate_links() che fa il lavoro pesante. Nell'esempio sopra, l'oggetto WP_Query personalizzato $query viene utilizzato al posto dell'oggetto globale $wp_query.

Modifica: In risposta al commento di @mark-in-motion, ecco un esempio di funzione wrapper per paginate_links() che ho creato tempo fa. Puoi aggiungerla al file functions.php del tuo tema, poi chiamare echo my_pagination(); nel tuo template per visualizzare la paginazione.

/**
 * Paginazione numerica tramite la funzione core di WP paginate_links().
 * @link http://codex.wordpress.org/Function_Reference/paginate_links
 *
 * @param array $args
 *
 * @return string HTML per la paginazione numerica
 */
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'    => __( '&laquo; Prec', 'text-domain' ),
        //'next_text'    => __( 'Succ &raquo;', 'text-domain' ),
        //'prev_text'    => __( '&lsaquo; Prec', 'text-domain' ),
        //'next_text'    => __( 'Succ &rsaquo;', 'text-domain' ),
        'prev_text'    => sprintf( '<i></i> %1$s',
            apply_filters( 'my_pagination_page_numbers_previous_text',
            __( 'Post più recenti', 'text-domain' ) )
        ),
        'next_text'    => sprintf( '%1$s <i></i>',
            apply_filters( 'my_pagination_page_numbers_next_text',
            __( 'Post più vecchi', 'text-domain' ) )
        ),
        'add_args'     => false,
        'add_fragment' => '',

        // Argomenti personalizzati non parte del core di WP:
        'show_page_position' => false, // Consente opzionalmente di visualizzare l'HTML "Pagina X di XX".
    );

    $pagination_args = apply_filters( 'my_pagination_args', array_merge( $pagination_args, $args ), $pagination_args );

    $output .= paginate_links( $pagination_args );

    // Opzionalmente, mostra Pagina X di XX.
    if ( true == $pagination_args['show_page_position'] && $wp_query->max_num_pages > 0 ) {
        $output .= '<span class="page-of-pages">' .
                                    sprintf( __( 'Pagina %1s di %2s', 'text-domain' ), $pagination_args['current'], $wp_query->max_num_pages ) .
                '</span>';
    }

    return $output;
}
27 gen 2017 08:34:18
Commenti

Penso di essere in ritardo. ma la domanda è.. perché dovrei scrivere 999999999?

MFarooqi MFarooqi
21 mar 2021 01:47:21

Questo è un trucco per ottenere i risultati di get_pagenum_link() con %#% invece del numero di pagina (999999999).

Dave Romsey Dave Romsey
26 mar 2021 17:32:30

C'è un modo per inserire questo in functions.php in modo da dover solo chiamare pageinate_links() e non l'intera cosa?

mark-in-motion mark-in-motion
13 lug 2022 10:26:23

@mark-in-motion Certo! Ho aggiunto un esempio alla risposta.

Dave Romsey Dave Romsey
15 lug 2022 21:53:08
2
15

Questo codice è per la Paginazione Personalizzata delle Query. Puoi seguire i passaggi per creare la tua paginazione in WordPress.

 <?php
/**
* Template Name: Pagina Personalizzata
*/
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 );
?>
          <!----inizio-------->
<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> <!-- fine articoli blog -->
       <?php endwhile; ?>
      <?php if (function_exists("pagination")) {
          pagination($custom_query->max_num_pages);
      } ?>
</main><!-- #main -->
</div><!-- #primary -->
</div><!-- .wrap -->
          <!----fine-------->
        <?php get_footer();

Riferimento: https://www.wpblog.com/use-wp_query-to-create-pagination/

15 nov 2017 10:31:04
Commenti

Sembra che la funzione pagination non esista, per favore assistimi

Karue Benson Karue Karue Benson Karue
27 giu 2021 03:41:08

@KarueBensonKarue questo perché l'autore di questa risposta ha copiato e incollato qualcosa da un altro sito, e tu hai copiato e incollato da questo sito Se vai alla fonte https://wpblog.com/use-wp_query-to-create-pagination/ vedrai come spiegano di definire la funzione pagination()

User User
21 feb 2023 05:54:43
0

Se qualcuno arriva qui cercando di creare una wp_query con paginazione all'interno di uno 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(); // Attiva il buffer di output
        global $paged;
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
        $atts = shortcode_atts(
            array(
                'post_type' => 'post',
                // qualsiasi parametro desideri
            ),
            $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');
            } // fine while

            $big = 999999999; // numero improbabilmente grande
            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 // $the_query è la query personalizzata
                )
            );
        } // Paginazione all'interno dell'endif
        return ob_get_clean(); // Restituisce il contenuto del buffer eliminando il buffer
        wp_reset_query(); // Ritorna alla main_query() dopo aver restituito il contenuto bufferizzato
    }
}
27 mag 2021 08:38:48
1

Puoi semplicemente utilizzare una funzione integrata di WP

<?
the_posts_pagination()
?>

Funziona molto bene anche con WP_Query personalizzate

27 nov 2020 00:47:37
Commenti

No, non lo fa se lo usi su una pagina, ad esempio. C'è una buona spiegazione qui e una descrizione dettagliata qui su come puoi risolverlo, ma in un modo "hacky" non raccomandato.

Adrian B Adrian B
18 ott 2023 15:31:36