web-dev-qa-db-fra.com

Comment paginer des pièces jointes dans une requête secondaire en tant que galerie?

J'ai ce code qui montre toutes les images attachées à mon post-type. Existe-t-il un moyen de les paginer? J'ai environ 25 photos et je ne voudrais pas éviter de faire défiler autant que je peux.

Code:

<div class="galleries ten columns">
<?php
    $attachments = get_posts( array( 
   'post_type' => 'attachment',
   'post_mime_type'=>'image',
   'posts_per_page' => -1,
   'post_status' => 'any',
   'post_parent' => $post->ID)
);
if ( $attachments ) {
foreach ( $attachments as $attachment ) {
    $src = wp_get_attachment_image_src( $attachment->ID, full);     
    $html = '<a class="fancybox" href="'.$src[0].'">';
    $html .= wp_get_attachment_image( $attachment->ID, 'gallery-thumb') .'</a>';
    echo $html;
}
}
?>
</div>

Merci!

4
Cynthia Lara

Je suppose que vous voulez quelque chose comme ça:

|---------------------|   
|       content       |  
|       (static)      |  
|---------------------|  
|       gallery       |  
|       (paged)       |  
|---------------------|  
|   << pagelinks >>   |  
|---------------------|  

Dans cette configuration, le contenu de votre message reste le même, semble statique, tandis que la galerie est paginée. Cela signifie que vous avez la requête principale, vous indiquant le titre, le contenu, etc., et une requête secondaire, chargée de vous montrer les images de la galerie. Les liens de page sur cette page sont connectés à la boucle secondaire et effectuent la pagination à cet endroit. Pour ce faire, je suggère d'utiliser WP_Query au lieu de get_posts(), non seulement parce que je n'ai pas de solution pour ce dernier en tête, mais aussi parce que je pense que c'est généralement la meilleure approche. Dans un premier temps, vous devez configurer une nouvelle variable de requête, qui sera utilisée pour la pagination. La fonction add_gallery_query_var() entre dans votre functions.php.

Code:

    add_filter('init', 'wpse124169_attachment_gallery_add_query_var');
    function wpse124169_attachment_gallery_add_query_var() {
        global $wp;
        $wp->add_query_var('gallery_page');
    }


En outre, si vous voulez que de jolis permaliens fonctionnent avec la nouvelle variable de requête, vous devez implémenter une nouvelle règle de réécriture. Pour cela, ajoutez ce qui suit à votre functions.php, qui utilise add_rewrite_tag et add_rewrite_rule .

Code:

    add_filter('init', 'wpse124169_attachment_gallery_add_rewrite_tag_rule');
    function wpse124169_attachment_gallery_add_rewrite_tag_rule() {
        add_rewrite_tag('%gallery_page%','([^&]+)');
        add_rewrite_rule('([^/]+)/gallery/image//?([0-9]{1,})/?$', 'index.php?name=$matches[1]&gallery_page=$matches[2]', 'top');
    }


L'étape suivante consiste à créer la boucle secondaire pour la galerie. WP_Query est utilisé pour le faire. De plus, paginate_links nous donne la possibilité de créer des liens pour la pagination dans la galerie. J'ai décidé de créer une fonction pour cela, donc le code ci-dessous va dans le functions.php.

Code:

function wpse124169_get_attachment_gallery() {
    global $post;
    $gallery_page = (get_query_var('gallery_page')) ? get_query_var('gallery_page') : 1;
    $args = array(
        'posts_per_page' => 1, 
        'orderby' => 'menu_order', 
        'order' => 'ASC', 
        'post_type' => 'attachment',
        'post_status' => 'inherit', 
        'post_mime_type' => 'image', 
        'post_parent' => $post->ID, 
        'paged' => $gallery_page
    ); 
    $gallery = new WP_Query($args);
        if ( $gallery->have_posts() ) :
            echo '<div class="my_cpt_gallery_paged">';
                    while ( $gallery->have_posts() ) : $gallery->the_post();
                        echo wp_get_attachment_image( $post->ID, 'medium' );
                    endwhile;
            echo '</div>';
            echo '<div class="my_cpt_gallery_paginate_links">';
                    if ( get_option('permalink_structure') ) {
                        $format = 'gallery/image/%#%';
                    } else {
                        $format = '&gallery_page=%#%';
                    }
                    $args = array(
                        'base' => get_permalink( $post->post_parent ) . '%_%',
                        'format' => $format,
                        'current' => $gallery_page,
                        'total' => $gallery->max_num_pages
                    );
                    echo paginate_links( $args );
                    wp_reset_postdata();
            echo '</div>';
        endif;
}


Comme vous pouvez le constater, la requête secondaire utilise un objet post supplémentaire - $gallery - et la variable de requête définie précédemment - gallery_page - pour permettre une pagination correcte. Ce dernier est utilisé pour configurer le paramètre format de paginate_links(). Nous ne devrions pas oublier de réinitialiser - wp_reset_postdata() - pour éviter les problèmes. Bien entendu, il ne s’agit que de la boucle secondaire, et non du modèle complet.

J'appelle la requête de la galerie de pièces jointes secondaire dans mon single.php, après la requête/boucle principale, via la fonction wpse124169_get_attachment_gallery(). En suivant les étapes ci-dessus, vous avez configuré votre galerie de pièces jointes paginées. J'ai testé ceci et cela fonctionne pour moi.




Ci-dessous, je liste les informations et les sources les plus importantes. Si vous souhaitez plus de détails, cela devrait vous donner plus que juste commencer.

Information:

  1. WP_Query
  2. paginate_links
  3. Classe WP/source/add_query_var
  4. API de réécriture
  5. add_rewrite_tag
  6. add_rewrite_rule
  7. Plusieurs boucles WP_Query avec pagination
  8. Comment créer une pagination séparée pour plusieurs boucles?




Optionnel:

Cela change le lien par défaut pour la première image. Normalement, il s’agit de http://site.ext/?p=123 ou http://site.ext/post-name/, le lien de parenté en pièce jointe. C'est bon, cela vous montre la première image par défaut. Mais si vous souhaitez que le lien de la première image représente la requête de galerie dans l'URL, vous devez vous connecter à paginate_links. Cela conduit à la condensation du lien comme ceci http://site.ext/?p=123&gallery_page=1 ou http://site.ext/post-name/gallery/image/1. Ceci s'applique uniquement à la navigation via le lien par paginate_links(), l'appel de la publication parent affiche uniquement le permalien correspondant. Le code irait également dans le functions.php.

Code:

add_filter( 'paginate_links', 'wpse124169_attachment_gallery_first_image_link' );
function wpse124169_attachment_gallery_first_image_link( $link ) {
    global $post;
    if ( get_option('permalink_structure') ) {
        $gpg_num = substr( strrchr( $link, '/' ), 1 );
    } else {
        $gpg_plk = wp_parse_args($link);
        $gpg_num = $gpg_plk['gallery_page'];
    }
    if ( empty( $gpg_num ) ) {
        if ( get_option('permalink_structure') ) {
            $link = get_permalink( $post->post_parent ) . 'gallery/image/1';
        } else {
            $link = get_permalink( $post->post_parent ) . '&gallery_page=1';
        }
    }

    return $link;
}




Mise à jour:

Ceci peut être utilisé pour modifier le shortcode [gallery], comme indiqué ici: Comment paginer un shortcode wordpress [gallery]? .

7
Nicolai