pattern background 1245991 1920
Bildquelle: Pixabay, Free-Photos

Paginierung für ACF-Repeater Einträge

Die Datenfelder sollen nur für Seiten und auch nur dann verfügbar sein, wenn ein bestimmtes Template ausgewählt wird. Da die Anzahl der Einträge auf manchen Seiten hoch werden kann, wünscht sich der Kunde eine Paginierung nach einer je Seite frei definierbaren Anzahl von Einträgen. Die wird je Seite die das Template verwendet in einem separaten Nummernfeld (items_per_page) festgelegt.

Nachfolgend ein Entwurf für ein ganzes Seitentemplate mit dem Seiten-Loop, innerhalb dessen der ACF-Loop stattfindet.

<?php
/**
 * Template Name: Repeater Page Template
 *
 * @package ZIMM WordPress theme
 */
get_header(); ?>
<div id="content-wrap" class="container clr">
<div id="primary" class="content-area clr">
<div id="content" class="site-content clr">

    <?php
        // Start page loop
        while ( have_posts() ) : the_post(); ?>

            <article class="single-page">

                <div class="entry" itemprop="text">

                <?php
                    if ( get_query_var( 'page' ) ) {
                        $page = get_query_var( 'page' );
                    } else {
                        $page = 1;
                    }

                    if ( $page === 1 )  {
                        the_title( '<h1 class="entry-title">', '</h1>' ); 
                        the_content();
                    }

                    // field to configure how many items to display on each page
                    $items_per_page = get_field( 'items_per_page' ); 
                    if ( !$items_per_page ) {
                        $items_per_page = 6;
                    }

                    $i                 = 0;
                    $entries           = get_field( 'items_list' );
                    $total             = count( $entries );
                    $pages             = ceil( $total / $items_per_page );
                    $min               = ( ( $page * $items_per_page ) - $items_per_page ) + 1;
                    $max               = ( $min + $items_per_page ) - 1;


                    if ( have_rows( 'items_list' ) ) : ?>

                    <div class="columns row flex columns-2">

                    <?php while( have_rows( 'items_list' ) ): the_row();

                    $i++;
                    // continue if $row is lower than $min
                    if ( $i < $min ) { continue; }

                    // Stop loop if $row is higher than $max
                    if ( $i > $max ) { break; }    
                
                    echo '<div>';
                        $link   = sprintf( '<div class="blog-entry-readmore"><a class="button" href="%1$s" target="_blank" rel="noopener">%2$s</a></div>', get_sub_field('more_button_link'), __( 'more', 'my-theme-textdomain' ) );
                        $img    = get_sub_field('item_img');
                        $image  = sprintf('<img src="%1$s" alt="%2$s" width="250" height="250" class="alignleft" />', $img, get_sub_field('item_title'));

                        $title = sprintf( '<h2 class="entry-title">%1$s</h2>', get_sub_field('item_title') );
                        printf( '<div class="entry-summary">%1$s %2$s %3$s %4$s</div>', $image, $title, get_sub_field('item_desc'), $link );
                    echo '</div>';
                                            
                    endwhile;

                    // Pagination

                    echo '</div><nav class="pagination center">';

                    echo paginate_links( array(
                        'base'      => get_permalink() . '%#%' . '/',
                        'format'    => '?page=%#%',
                        'prev_text' => '<i class="icon-previous"></i>',
                        'next_text' => '<i class="icon-next"></i>',                               
                        'current'   => $page,
                        'total'     => $pages,
                        'type'      => 'list'
                    ) );
                    
                    echo '</nav>';

                    endif;
                ?>
                </div>

            
            </article>

    <?php
        endwhile;
    ?>

</div><!-- #content -->
</div><!-- #primary -->
</div><!-- #content-wrap -->
<?php get_footer(); ?>

Quellen

https://support.advancedcustomfields.com/forums/topic/advanced-custom-repeater-field-page-navigation/

https://jonathannicol.com/blog/2014/03/06/paginating-an-advanced-custom-fields-repeater/

Über Gabriele Lässer

WordPress Sorgen? - Nicht mit mir! Ich freue mich auf spannende Herausforderungen

Kommentar schreiben

E-Mail-Adresse wird nicht veröffentlicht.

Overlay background for modal content