web-dev-qa-db-fra.com

Obtenir que paginate_links () 'end_size' n'en affiche aucun

Je travaille avec la fonction paginate_links () et j'essaie de créer une pagination dans ce genre de style.

<3 4 5 6 7>

Logiquement, je pensais que ce serait simple en définissant end_size sur 0 et mid_size sur 2.

Je l'ai fait mais mon code est en sortie comme ceci;

<1 ... 3 4 5 6 7 ... 9>

Pour moi, cela indique 1 comme taille de fin, même si je l’ai défini sur 0 (à moins que je ne comprenne pas bien ce que fait l’option).

Ma fonction actuelle de liens de pagination ressemble à ceci;

$paginationArgs = array(
    'base'          => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format'        => '?paged=%#%',
    'current'       => max( 1, get_query_var('paged') ),
    'total'         => $loop->max_num_pages,
    'end_size'      => 0,
    'mid_size'      => 1,
    'prev_next'     => TRUE,
    'prev_text'     => '<',
    'next_text'     => '>',
    'type'          => 'list',
    'add_args'      => FALSE,
    'add_fragment'  => ''
)
$pagination = paginate_links($paginationArgs);

Est-ce que quelqu'un a des conseils/réponses?

Merci Harry.

2
Harry Francis

Voici une suggestion:

Nous devons d’abord laisser paginate_links() renvoyer un tableau au lieu d’une liste HTML:

'type' => 'array',

Ensuite, nous pouvons récupérer la sortie avec:

$paginate_links = paginate_links( $paginationArgs );

Le plan est alors de filtrer les liens recherchés.

Récupérons la valeur actuelle:

$c = $paginationArgs['current'];

Nous construisons le filtre de recherche comme:

$allowed = [
    ' current',
    'prev ',
    'next ',
    sprintf( '/page/%d/', $c-2 ),
    sprintf( '/page/%d/', $c-1 ),
    sprintf( '/page/%d/', $c+1 ),
    sprintf( '/page/%d/', $c+2 )
];

Notez que nous pourrions affiner ceci sur les bords et ne filtrer que ce qui est disponible. Il est également possible de le faire dépendre dynamiquement de l'attribut mid_size. Nous supposons ici que:

'mid_size' => 2,

Notez également que:

'end_size' => 0,

signifie que end_size est 1 en raison des vérifications suivantes dans la fonction principale paginate_links():

if ( $end_size < 1 ) {
    $end_size = 1;
}

Ensuite, nous filtrons les liens de pagination autorisés:

$paginate_links = array_filter(
    $paginate_links,
    function( $value ) use ( $allowed ) {
        foreach( (array) $allowed as $tag )
        {
            if( false !== strpos( $value, $tag ) )
                return true;
        }
        return false;
    }
);

Enfin, nous affichons le résultat:

if( ! empty( $paginate_links ) )
    printf(
        "<ul class='page-numbers'>\n\t<li>%s</li>\n</ul>\n",
        join( "</li>\n\t<li>", $paginate_links )
    );

J'espère que vous pourrez l'adapter à vos besoins!

3
birgire