Paginare când folosim wp_query?

27 ian. 2017, 08:18:08
Vizualizări: 203K
Voturi: 47
<!-- interogare -->
<?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() ) : ?>

<!-- început buclă -->
<?php while ( $query->have_posts() ) : $query->the_post(); ?>

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

<?php endwhile; ?>
<!-- sfârșit buclă -->


<!-- CE TREBUIE PUS AICI?????? -->


<?php wp_reset_postdata(); ?>

<?php else : ?>
    <p><?php _e( 'Ne pare rău, nu s-au găsit articole care să corespundă criteriilor.' ); ?></p>
<?php endif; ?>

Am încercat totul pentru a obține paginarea pe această pagină statică folosind funcția wp_query dar fără succes. Există un comentariu în acest script numit CE TREBUIE PUS AICI?????... deci ce trebuie pus aici?

Acest cod este pe o pagină statică care nu este nici pagina principală și nici pagina de articole.

0
Toate răspunsurile la întrebare 4
4
67

Înlocuiți <!-- WHAT GOES HERE?????? --> cu codul de paginare de mai jos:

<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ări Recente', 'text-domain' ) ),
            'next_text'    => sprintf( '%1$s <i></i>', __( 'Postări Mai Vechi', 'text-domain' ) ),
            'add_args'     => false,
            'add_fragment' => '',
        ) );
    ?>
</div>

WordPress vine cu o funcție utilă numită paginate_links() care se ocupă de munca grea. În exemplul de mai sus, obiectul personalizat WP_Query $query este folosit în locul obiectului global $wp_query.

Editare: Ca răspuns la comentariul lui @mark-in-motion, iată un exemplu de funcție wrapper pentru paginate_links() pe care am făcut-o acum ceva timp. Puteți adăuga acest cod în functions.php al temei, apoi apelați echo my_pagination(); în șablon pentru a afișa paginarea.

/**
 * Paginare numerică prin funcția de bază WP paginate_links().
 * @link http://codex.wordpress.org/Function_Reference/paginate_links
 *
 * @param array $args
 *
 * @return string HTML pentru paginarea numerică
 */
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; Prev', 'text-domain' ),
        //'next_text'    => __( 'Next &raquo;', 'text-domain' ),
        //'prev_text'    => __( '&lsaquo; Prev', 'text-domain' ),
        //'next_text'    => __( 'Next &rsaquo;', 'text-domain' ),
        'prev_text'    => sprintf( '<i></i> %1$s',
            apply_filters( 'my_pagination_page_numbers_previous_text',
            __( 'Postări Recente', 'text-domain' ) )
        ),
        'next_text'    => sprintf( '%1$s <i></i>',
            apply_filters( 'my_pagination_page_numbers_next_text',
            __( 'Postări Mai Vechi', 'text-domain' ) )
        ),
        'add_args'     => false,
        'add_fragment' => '',

        // Argumente personalizate care nu fac parte din nucleul WP:
        'show_page_position' => false, // Opțional, permite afișarea HTML-ului "Pagina X din XX".
    );

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

    $output .= paginate_links( $pagination_args );

    // Opțional, afișează Pagina X din XX.
    if ( true == $pagination_args['show_page_position'] && $wp_query->max_num_pages > 0 ) {
        $output .= '<span class="page-of-pages">' .
                                    sprintf( __( 'Pagina %1s din %2s', 'text-domain' ), $pagination_args['current'], $wp_query->max_num_pages ) .
                '</span>';
    }

    return $output;
}
27 ian. 2017 08:34:18
Comentarii

Cred că am întârziat prea mult. Dar întrebarea este... de ce ar trebui să scriu 999999999?

MFarooqi MFarooqi
21 mar. 2021 01:47:21

Acesta este un truc pentru a obține rezultatele funcției get_pagenum_link() cu %#% în loc de numărul paginii (999999999).

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

Există vreo metodă de a pune asta în functions.php, astfel încât să poți apela doar pageinate_links() și nu tot codul?

mark-in-motion mark-in-motion
13 iul. 2022 10:26:23

@mark-in-motion Sigur! Am adăugat un exemplu în răspuns.

Dave Romsey Dave Romsey
15 iul. 2022 21:53:08
2
15

Acest cod este pentru Paginare Personalizată în WordPress. Puteți urma pașii pentru a vă crea propria paginare în WordPress.

<?php
/**
* Template Name: Pagină Personalizată
*/
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 );
?>
          <!----start-------->
<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> <!-- sfârșit articole blog -->
       <?php endwhile; ?>
      <?php if (function_exists("pagination")) {
          pagination($custom_query->max_num_pages);
      } ?>
</main><!-- #main -->
</div><!-- #primary -->
</div><!-- .wrap -->
          <!----end-------->
        <?php get_footer();

Referință: https://www.wpblog.com/use-wp_query-to-create-pagination/

15 nov. 2017 10:31:04
Comentarii

Se pare că funcția pagination nu există, te rog să mă ajuți

Karue Benson Karue Karue Benson Karue
27 iun. 2021 03:41:08

@KarueBensonKarue asta se întâmplă pentru că autorul acestui răspuns a copiat ceva de pe un alt website, iar tu ai copiat de pe acest website Dacă accesezi sursa https://wpblog.com/use-wp_query-to-create-pagination/ vei vedea cum explică ei definirea funcției pagination()

User User
21 feb. 2023 05:54:43
0

Dacă ajunge cineva aici încercând să creeze un wp_query cu paginare din interiorul unui 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(); // Pornim bufferul de ieșire
        global $paged;
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
        $atts = shortcode_atts(
            array(
                'post_type' => 'post',
                // orice doriți
            ),
            $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');
            } // sfârșitul while

            $big = 999999999; // avem nevoie de un număr improbabil
            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 // $q este interogarea personalizată
                )
            );
        } // Paginarea în interiorul endif
        return ob_get_clean(); // Returnăm conținutul bufferului și îl ștergem
        wp_reset_query(); // Ne întoarcem la main_query() după returnarea conținutului bufferizat
    }
}
27 mai 2021 08:38:48
1

Poți folosi simplu o funcție integrată în WordPress

<?
the_posts_pagination()
?>

Funcționează excelent și cu WP_Query personalizat

27 nov. 2020 00:47:37
Comentarii

Nu, nu se întâmplă dacă îl folosești pe o pagină, de exemplu. Există o explicație bună aici și o descriere detaliată aici despre cum poți rezolva problema, dar într-un mod "hacky" care nu este recomandat.

Adrian B Adrian B
18 oct. 2023 15:31:36