Paginierung für ACF-Repeater Einträge

pattern background 1245991 1920
Bildquelle: Pixabay, Free-Photos

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/

Bitte Kommentarfunktion nicht für Supportanfragen nutzen. Dem kann hier nicht entsprochen werden. Die Angabe einer E-Mail-Adresse und eines Namens ist nicht erforderlich. Einen (Spitz)-Namen zu nennen wäre aber doch nett.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Sowohl angegebener Name als auch E-Mail-Adresse (beides ist optional, dafür werden alle Kommentare vor Veröffentlichung geprüft) werden dauerhaft gespeichert. Du kannst jeder Zeit die Löschung Deiner Daten oder / und Kommentare einfordern, direkt über dieses Formular (wird nicht veröffentlicht, und im Anschluss gelöscht), und ich werde das umgehend erledigen. – Mit hinterlassenen Kommentaren hinterlegte IP-Adressen werden nach zwei Monaten automatisch gelöscht

publicly queryable