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

15

Nous construisons un plugin qui affiche les messages et nous souhaitons également afficher la galerie d'images lorsqu'elle est utilisée dans un message. Cependant, il faut limiter le nombre de photos affichées? Est-ce possible?

    
posée jnthnclrk 20.11.2010 - 14:57

2 réponses

34

Vous pouvez vous y prendre de deux manières, mais toutes deux impliquent de créer une fonction qui a pratiquement la même fonction que la fonction de shortcode de la galerie existante ...

Vous pouvez soit ..

  1. Accrochez-vous sur post_gallery et manipulez les données entrantes (vous pouvez utiliser la fonction de shortcode de la galerie comme base du filtre si nécessaire)
  2. Annulez l'enregistrement du shortcode de la galerie et enregistrez un nouveau shortcode de la galerie avec 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 ne fais que s'y référer, car 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 de votre choix (il ne s'agit que d'une base).

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

enlace

Espérons que cela aide ..:)

    
réponse donnée t31os 21.11.2010 - 00:17
-2

Vous pouvez spécifier le nombre d'images par galerie. Cela peut être configuré via l'onglet de la galerie dans la boîte à médias épais de l'éditeur de publication. Une fois que vous avez déjà inséré la galerie, vous pouvez l'éditer en modifiant la galerie dans l'éditeur visuel.

    
réponse donnée hakre 21.11.2010 - 00:02

Lire d'autres questions sur les étiquettes