Julien a présenté ce 25 août 2009 une fonction d’affichage des miniatures liées à un même article pour WordPress. Bien que fonctionnelle, elle ne se révèle pas être des plus pratique.

Note :
J’écris ici même parce qu’en fin de billet je colle une fonction qui ferait un peu pavé dans les commentaires de l’article de Julien. Je ne fais également plus confiance aux services de pasties en ligne, ayant perdu trop d’extraits de code…

Comme le relève OncleTom, la présentation et la logique sont mélangées.
La fonction wallthumb dispose d’un argument $id qui est finalement inutile. Il sert simplement à tester la vignette courante, mais, comme la fonction est à appeler sur la page d’un media, l’élément courant est obligatoirement le media affiché.
Enfin, les arguments de présentation cassent avec la logique introduite par WordPress. Dans son API, ce dernier fait généralement appel à un unique argument1, passé sous la forme d’un tableau ou d’une chaîne de caractères.

Ci-dessous, une fonction de remplacement à ajouter dans le fichier functions.php de votre thème.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php
/**
 * Retrieve the list of images attached to the same post that the current attachment.
 *
 * @author Mehdi Kabab <http://pioupioum.fr>
 * @copyright Copyright (C) 2009 Mehdi Kabab
 * @license http://www.gnu.org/licenses/gpl.html  GNU GPL version 3 or later
 *
 * @link http://www.webinventif.fr/wordpress-afficher-toutes-miniatures-liees-article-pages-media/ Inspiration
 *
 * @param  string $output Optional. Constant for return type, either OBJECT (default), ARRAY_A, ARRAY_N.
 * @return array|bool False on failure
 **/
function get_other_attachments($output = OBJECT)
{
    global $post;
    if (!is_attachment() || false === (bool) $post->post_parent)
        return false;
 
    $attachments = get_children(array(
        'post_type'      => 'attachment',
        'post_mime_type' => 'image',
        'post_status'    => 'inherit',
        'post_parent'    => $post->post_parent
    ), $output);
 
    return $attachments;
}
 
/**
 * Display the HTML list of images attached to the same post that the current attachment.
 *
 * Only works on an attachment page.
 *
 * @author Mehdi Kabab <http://pioupioum.fr>
 * @copyright Copyright (C) 2009 Mehdi Kabab
 * @license http://www.gnu.org/licenses/gpl.html  GNU GPL version 3 or later
 *
 * @link http://www.webinventif.fr/wordpress-afficher-toutes-miniatures-liees-article-pages-media/ Inspiration
 *
 * @param  string|array $args Optional. User defined arguments for replacing the defaults.
 * @return bool False on failure.
 */
function wallthumb($args = array())
{
    global $post;
    $attachments = get_other_attachments();
    if (!$attachments)
        return false;
 
    $defaults = array(
        'id'            => 'gallery-%d',
        'current_class' => 'current',
        'thumb_class'   => 'gallerythumb',
        'before_thumb'  => '<li class="%s">',
        'after_thumb'   => '</li>',
        'before_list'   => '<ul id="%s">',
        'after_list'    => '</ul>',
    );
    $args        = wp_parse_args($args, $defaults);
    $current_id  = $post->ID;
    $thumb_class = trim($args['thumb_class']);
 
    static $i = 0;
    $stack = array(sprintf($args['before_list'], sprintf($args['id'], ++$i)));
    foreach ($attachments as $attachment)
    {
        if ($current_id != $attachment->ID)
        {
            $buf = sprintf($args['before_thumb'], $thumb_class);
        }
        else
        {
            $buf = sprintf($args['before_thumb'], trim($thumb_class . ' ' . $args['current_class']));
        }
        $buf .= sprintf('<a href="%s" title="%s" rel="attachment">%s</a>',
            get_attachment_link($attachment->ID),
            esc_attr(get_the_title($attachment->ID)),
            wp_get_attachment_image($attachment->ID, 'thumbnail')
        );
        $buf .= $args['after_thumb'];
        $stack[] = $buf;
    }
    echo implode("\n\t", $stack) . "\n{$args['after_list']}";
}

Notes

  1. Voir la fonction register_sidebar par exemple. 

publicité (chargement)

11 réponses pour WordPress : lister les images d’un article sur une page media

  1. Julien dit :

    Ralalala c’est malin maintenant j’ai honte de ma fonction toute cracra ^_^’

    Merci pour cette mise au propre en tout cas :)

  2. Valentin dit :

    Je vais tester ! Merci du partage !

    On peut également faire cette manip

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    $args = array(
        'post_type' => 'attachment',
        'numberposts' => null,
        'post_status' => null,
        'post_parent' => $post->ID
    ); 
    $attachments = get_posts($args);
    if ($attachments) {
        foreach ($attachments as $attachment) {
            echo the_attachment_link($attachment->ID, false);
        }
    }
  3. piouPiouM dit :

    De rien, il faut bien s’entraider :)

  4. piouPiouM dit :

    @Valentin effectivement, nous pouvons faire appel à

    76
    
    $buf .= wp_get_attachment_link($attachment->ID, 'thumbnail');

    en remplacement du bloc :

    76
    77
    78
    79
    80
    
    $buf .= sprintf('<a href="%s" title="%s" rel="attachment" rel="nofollow">%s</a>',
        get_attachment_link($attachment->ID),
        esc_attr(get_the_title($attachment->ID)),
        wp_get_attachment_image($attachment->ID, 'thumbnail')
    );

    Thx ;-)

  5. Jib's dit :

    Merci pour cette fonction.

    Une petite question : au moment d’uploader une image, on rentre sa légende, description, et titre. Je n’arrive pas à les récupérer ensuite. Une idée ?

    Merci d’avance.

  6. piouPiouM dit :

    La description est accessible via la propriété post_content et on accède à la légende à l’aide de la propriété post_excerpt.

    Ainsi, en utilisant get_other_attachments(), nous obtenons ce qui suit :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    $attachements = get_other_attachments();
    foreach ($attachements as $attachement)
    {
        printf('<dl><dt>%s</dt><dd>Description : %s</dd><dd>Légende : %s</dd></dl>',
            $attachement->post_title,
            $attachement->post_content,
            $attachement->post_excerpt
        );
    }

    Les informations sont également disponibles si vous utilisez la fonction get_children().

  7. Franck dit :

    avec WP 2.9 on peut utiliser des attributs include/exclude pour créer une galerie personnalisée. Comment faire pour que les images sélectionnées « suivent » dans le wallthumb ? Avec le code toutes les images de la galerie apparaissent ;-) Merci de ton aide.

  8. Laetitia dit :

    Coucou :) Je suis retombée sur ta fonction en cherchant comment exclure le post thumbnail. Je l’utilise ailleurs dans le template et ça ferait redondant dans ma galerie… Une idée? Merci :)

  9. Franck dit :

    Bonjour, peut on adapter ce code pour faire une widget qui listerait les images d’une catégorie et nom d’un article? Merci d’avance pour l’information. Cordialement, Franck

Ajouter un commentaire


Syndication

Réseaux sociaux