web-dev-qa-db-fra.com

Un moyen de "combiner" des galeries ou de montrer plusieurs galeries comme une seule?

Alors disons que je dirige un blog d’émission de télévision. Un jour, l’émission diffuse au public une série de 10 captures d’un épisode à venir. Je poste cela sur mon blog, sous forme de publication avec plusieurs images, ou plus précisément sous forme de "galerie" - les lecteurs peuvent visualiser l’ensemble des images attachées à cette publication sous forme de galerie.

Ensuite, plusieurs jours et plusieurs publications plus tard, ils publient 10 autres captures d'écran de ce même épisode à venir. Je veux faire un article séparé plutôt que de remplacer l'ancien, mais je veux aussi pouvoir afficher toutes les captures d'écran (20) de cet épisode particulier dans une seule galerie. Ou du moins ce qui ressemblerait à une galerie unique.

Possible? (De préférence sans NextGEN ou d'autres plugins ... essayant d'accomplir le plus possible en utilisant les capacités natives de WordPress avant d'empiler les plugins.)

2
Chris

Avec le shortcode [gallery] par défaut, il n’existe aucun moyen simple de combiner différentes galeries en une seule. Vous pouvez soit spécifier deux galeries différentes: l'une du message actuel et l'autre d'un autre, spécifiées par l'ID du message:

[gallery]
[gallery id=42]

Ou vous pouvez créer une galerie en spécifiant explicitement tous les ID attachés :

[gallery include="23,39,45"]

La spécification de plusieurs ID de publication ne fonctionnera pas car gallery_shortcode() utilise get_children() pour obtenir les pièces jointes, qui utilise get_posts(), qui utilise la classe WP_Query standard, et ceci ne permet qu'une valeur numérique post_parent .

Cependant , nous pouvons exploiter le fait qu'il existe un filtre en haut de gallery_shortcode(), qui permet aux plug-ins de remplacer la mise en page par défaut de la galerie. L'exemple suivant recherche un paramètre id avec plusieurs ID (ou le mot clé spécial this), récupère toutes les pièces jointes de ces publications et les place dans un attribut explicite include qui est utilisé pour appeler à nouveau la fonction gallery. Cela vous permet de combiner différentes galeries comme ceci: [gallery id=this,8]. Vous pouvez également étendre cette idée pour prendre en charge d’autres attributs.

add_filter( 'post_gallery', 'wpse18689_post_gallery', 5, 2 );
function wpse18689_post_gallery( $gallery, $attr )
{
    if ( ! is_array( $attr ) || array_key_exists( 'wpse18689_passed', $attr ) ) {
        return '';
    }
    $attr['wpse18689_passed'] = true;

    if ( false !== strpos( $attr['id'], ',' ) ) {
        $id_attr = shortcode_atts( array(
            'id' => 'this',
            'order' => 'ASC',
            'orderby'    => 'menu_order ID',
        ), $attr );
        $all_attachment_ids = array();
        $post_ids = explode( ',', $id_attr['id'] );
        foreach ( $post_ids as $post_id ) {
            if ( 'this' == $post_id ) {
                $post_id = $GLOBALS['post']->ID;
            }
            $post_attachments = get_children( array(
                'post_parent' => $post_id,
                'post_status' => 'inherit',
                'post_type' => 'attachment',
                'post_mime_type' => 'image',
                'order' => $id_attr['order'],
                'orderby' => $id_attr['orderby'],
            ), ARRAY_A );
            $all_attachment_ids = array_merge( $all_attachment_ids, array_keys( $post_attachments ) );
        }
        $attr['include'] = implode( ',', $all_attachment_ids );
        $attr['id'] = null;
    }

    return gallery_shortcode( $attr );
}
1
Jan Fabry