¿Cómo personalizar la salida del shortcode de la galería de imágenes de WP desde un plugin?

20 nov 2010, 15:57:31
Vistas: 44.7K
Votos: 17

Estamos construyendo un plugin que muestra entradas, y también queremos mostrar la galería de imágenes cuando se usa en una entrada. Sin embargo, ¿necesitamos limitar el número de fotos mostradas? ¿Es eso posible?

0
Todas las respuestas a la pregunta 2
2
37

Hay dos formas de abordar esto, pero ambas implican crear una función que hace básicamente lo mismo que la función existente del shortcode de galería...

Puedes:

  1. Enganchar (hook) al filtro post_gallery y manipular los datos entrantes (puedes usar la función del shortcode de galería como base para el filtro si es necesario)
  2. Desregistrar el shortcode de galería y registrar un nuevo shortcode de galería con modificaciones (de nuevo, puedes usar la función existente como base si es necesario)

Hice algo similar en este hilo, y solo lo menciono porque voy a tomar el mismo enfoque para el ejemplo que sigue.

Ejemplo de filtro para el shortcode de galería

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

    static $instance = 0;
    $instance++;

    // Confiamos en la entrada del autor, pero al menos asegurémonos de que parezca una declaración orderby válida
    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>
        <!-- ver gallery_shortcode() en 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;
}

Modifica esa función para imponer las restricciones que prefieras (es solo una base)...

Puedes encontrar el hook que estoy usando en wp-includes/media.php dentro de la función callback del shortcode de galería (ver línea 763).

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

Espero que ayude... :)

21 nov 2010 01:17:30
Comentarios

gracias por la pista. He estado buscando este filtro **** durante 2 horas. +1

kaiser kaiser
6 may 2011 03:33:31

Parece que en WP 4.2.2 el 'orderby' => 'menu_order ID' ya no funciona?

Peanuts Peanuts
13 may 2015 15:17:28
0
-2

Puedes especificar el número de imágenes por galería. Esto se puede configurar a través de la pestaña de galería en el cuadro de medios del editor de entradas. Después de haber insertado la galería, creo que puedes editarlo modificando la galería en el editor visual.

21 nov 2010 01:02:31