Comment personnaliser la sortie du shortcode de la galerie d'images WP à partir d'un plugin?


17

Nous construisons un plugin qui affiche les publications, et nous voulons également afficher la galerie d'images lorsqu'elle est utilisée dans une publication. Cependant, nous devons limiter le nombre de photos affichées? Est-ce possible?

Réponses:


36

Il y a deux façons de procéder, mais les deux impliquent la création d'une fonction qui fait à peu près la même chose que la fonction de shortcode de la galerie existante ...

Vous pouvez soit..

  1. Accrochez post_galleryet manipulez les données entrantes (vous pouvez utiliser la fonction shortcode de la galerie comme base pour le filtre si nécessaire)
  2. Désenregistrer le shortcode de la galerie et enregistrer un nouveau shortcode de la galerie avec des modifications (vous pouvez à nouveau utiliser la fonction existante comme base si nécessaire)

J'ai fait quelque chose de similaire dans ce fil , et je n'y fais référence que parce que je vais adopter la même approche pour l'exemple qui suit.

Exemple de filtre pour le shortcode de la galerie

add_filter( 'post_gallery', 'my_post_gallery', 10, 2 );
function my_post_gallery( $output, $attr) {
    global $post, $wp_locale;

    static $instance = 0;
    $instance++;

    // We're trusting author input, so let's at least make sure it looks like a valid orderby statement
    if ( isset( $attr['orderby'] ) ) {
        $attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] );
        if ( !$attr['orderby'] )
            unset( $attr['orderby'] );
    }

    extract(shortcode_atts(array(
        'order'      => 'ASC',
        'orderby'    => 'menu_order ID',
        'id'         => $post->ID,
        'itemtag'    => 'dl',
        'icontag'    => 'dt',
        'captiontag' => 'dd',
        'columns'    => 3,
        'size'       => 'thumbnail',
        'include'    => '',
        'exclude'    => ''
    ), $attr));

    $id = intval($id);
    if ( 'RAND' == $order )
        $orderby = 'none';

    if ( !empty($include) ) {
        $include = preg_replace( '/[^0-9,]+/', '', $include );
        $_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );

        $attachments = array();
        foreach ( $_attachments as $key => $val ) {
            $attachments[$val->ID] = $_attachments[$key];
        }
    } elseif ( !empty($exclude) ) {
        $exclude = preg_replace( '/[^0-9,]+/', '', $exclude );
        $attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    } else {
        $attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    }

    if ( empty($attachments) )
        return '';

    if ( is_feed() ) {
        $output = "\n";
        foreach ( $attachments as $att_id => $attachment )
            $output .= wp_get_attachment_link($att_id, $size, true) . "\n";
        return $output;
    }

    $itemtag = tag_escape($itemtag);
    $captiontag = tag_escape($captiontag);
    $columns = intval($columns);
    $itemwidth = $columns > 0 ? floor(100/$columns) : 100;
    $float = is_rtl() ? 'right' : 'left';

    $selector = "gallery-{$instance}";

    $output = apply_filters('gallery_style', "
        <style type='text/css'>
            #{$selector} {
                margin: auto;
            }
            #{$selector} .gallery-item {
                float: {$float};
                margin-top: 10px;
                text-align: center;
                width: {$itemwidth}%;           }
            #{$selector} img {
                border: 2px solid #cfcfcf;
            }
            #{$selector} .gallery-caption {
                margin-left: 0;
            }
        </style>
        <!-- see gallery_shortcode() in wp-includes/media.php -->
        <div id='$selector' class='gallery galleryid-{$id}'>");

    $i = 0;
    foreach ( $attachments as $id => $attachment ) {
        $link = isset($attr['link']) && 'file' == $attr['link'] ? wp_get_attachment_link($id, $size, false, false) : wp_get_attachment_link($id, $size, true, false);

        $output .= "<{$itemtag} class='gallery-item'>";
        $output .= "
            <{$icontag} class='gallery-icon'>
                $link
            </{$icontag}>";
        if ( $captiontag && trim($attachment->post_excerpt) ) {
            $output .= "
                <{$captiontag} class='gallery-caption'>
                " . wptexturize($attachment->post_excerpt) . "
                </{$captiontag}>";
        }
        $output .= "</{$itemtag}>";
        if ( $columns > 0 && ++$i % $columns == 0 )
            $output .= '<br style="clear: both" />';
    }

    $output .= "
            <br style='clear: both;' />
        </div>\n";

    return $output;
}

Modifiez cette fonction pour imposer les restrictions que vous souhaitez (c'est juste une base).

Vous pouvez trouver le crochet que wp-includes/media.phpj'utilise dans la fonction de rappel de shortcode de la galerie (voir ligne 763).

http://core.trac.wordpress.org/browser/tags/3.0.1/wp-includes/media.php#L745

J'espère que cela pourra aider.. :)


merci pour l'astuce. J'ai cherché ce filtre **** maintenant depuis 2 heures. +1
kaiser

On dirait que dans WP 4.2.2 le 'orderby' => 'menu_order ID' ne fonctionne plus?
Peanuts

-2

Vous pouvez spécifier le nombre d'images par galerie. Cela peut être configuré via l'onglet Galerie dans la boîte à outils multimédia de l'éditeur de publication. Une fois que vous avez déjà inséré la galerie, je pense que vous pouvez la modifier en modifiant la galerie dans l'éditeur visuel.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.