web-dev-qa-db-fra.com

Comment puis-je modifier le balisage [galerie]?

Je voudrais changer le balisage créé par [galerie] de ce qui est en standard (dl) à une liste non ordonnée avec une différence. Ci-dessous le balisage souhaité:

<ul>
    <li><a href="/path/to/image.jpg"><img src="/path/to/image.jpg" /></a></li>
    <li><a href="/path/to/image2.jpg"><img src="/path/to/image2.jpg" /></a></li>
    <!-- And so on, all in one ul -->
</ul> 

Je veux la source d'image principale pour le lien & img, car je veux exécuter img src via un script de découpage php.

Est-ce possible? Je suis sûr que nous pouvons le casser!

8
PaulAdamDavis

Merci pour vos réponses, Jan & Rarst. Ils m'ont dirigé dans la bonne direction. Voici ce que j'ai fini avec.

Cela désactive les codes courts dans le contenu. Parfait pour ce site et la fonction obtient des images jointes et les recrache sous forme de liste. (J'ai trouvé la fonction quelque part et l'ai réduite un peu)

// Removed shortcodes from the content
add_filter('the_content', 'strip_shortcodes');

// Get attached images & spits out a list of them.
function nerdy_get_images($size = 'thumbnail', $limit = '0', $offset = '0') {
    global $post;
    $images = get_children( array('post_parent' => $post->ID, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => 'ASC', 'orderby' => 'menu_order ID') );
    if ($images) {
        $num_of_images = count($images);
        if ($offset > 0) : $start = $offset--; else : $start = 0; endif;
        if ($limit > 0) : $stop = $limit+$start; else : $stop = $num_of_images; endif;
        $i = 0;
        foreach ($images as $image) {
            if ($start <= $i and $i < $stop) {
            $img_title = $image->post_title;   // title.
            $img_description = $image->post_content; // description.
            $img_caption = $image->post_excerpt; // caption.
            $img_url = wp_get_attachment_url($image->ID); // url of the full size image.
            $preview_array = image_downsize( $image->ID, $size );
            $img_preview = $preview_array[0]; // thumbnail or medium image to use for preview.
            ?>
            <li>
                <a href="<?php echo $img_url; ?>"><img src="<?php echo $img_preview; ?>" alt="<?php echo $img_caption; ?>" title="<?php echo $img_title; ?>"></a>
            </li>
            <?
            }
            $i++;
        }
    }
}

Ceci est l'appel dans single.php

<ul>
    <?php nerdy_get_images('medium','0','0'); ?>
</ul>

Cela crache une liste exactement comme je le voulais.

Encore une fois, merci les gars!

3
PaulAdamDavis

La sortie des éléments de la fonction gallery_shortcode() n'est pas filtrée. Aucune possibilité de le modifier ici. Le balisage ne peut être remplacé que dans son intégralité, à l’aide du filtre post_gallery qui s’exécute au début. C'est un peu peu conventionnel comparé au résultat final de filtrage habituel et c'est probablement pour des raisons de performances (la génération d'une galerie peut être très lourde en calcul).

Mais il utilise wp_get_attachment_link() pour générer des liens et sa sortie est filtrée par le crochet wp_get_attachment_link avec beaucoup de détails:

apply_filters( 'wp_get_attachment_link', "<a href='$url' title='$post_title'>$link_text</a>", $id, $size, $permalink, $icon, $text );

Avez-vous besoin d'effectuer un recadrage très complexe pour lequel vous souhaitez qu'un script séparé le gère? Pourquoi ne pas laisser WP le gérer avec add_image_size() ?

3
Rarst

Si vous souhaitez remplacer les listes dl par des listes ul sur toutes les galeries, et pas seulement sur celles qui le demandent via des attributs supplémentaires, vous pouvez vous connecter au filtre post_gallery exécuté au début de la fonction gallery_shortcode . Là, vous pouvez remplacer et définir les valeurs par défaut pour les attributs.

La sortie finale n'est pas filtrée, mais je suppose qu'il devrait être possible de supprimer le gestionnaire de shortcode par défaut pour gallery et d'ajouter votre propre fonction qui enveloppe gallery_shortcode() mais ajoute le traitement final à la fin. Ou essayez de vous connecter à wp_get_attachment_link, comme le suggère Rarst .

1
Jan Fabry