¿Cómo personalizar la salida del código corto de la galería de imágenes WP desde un complemento?

17

Estamos creando un complemento que muestra publicaciones, y también queremos mostrar la galería de imágenes cuando se usa en una publicación. Sin embargo, ¿debemos limitar la cantidad de fotos que se muestran? ¿Es eso posible?

jnthnclrk
fuente

Respuestas:

36

Hay dos formas de hacerlo, pero ambas implican crear una función que haga más o menos lo mismo que la función de shortcode de la galería existente ...

Tu también puedes..

  1. Enganche post_galleryy manipule los datos entrantes (puede usar la función de shortcode de la galería como base para el filtro si es necesario)
  2. Anule el registro del código abreviado de la galería y registre un nuevo código abreviado de la galería con modificaciones (de nuevo, puede usar la función existente como base si es necesario)

Hice algo similar en este hilo , y solo me estoy refiriendo a él porque voy a tomar el mismo enfoque para el ejemplo que sigue.

Ejemplo de filtro para el shortcode de la 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++;

    // 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;
}

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

Puede encontrar el gancho que estoy usando wp-includes/media.phpdentro de la función de devolución de llamada de código corto de la galería (consulte la línea 763).

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

Espero que ayude.. :)

t31os
fuente
gracias por la pista. Busqué este filtro **** ahora por 2 horas. +1
kaiser
¿Parece que en WP 4.2.2 el 'orderby' => 'menu_order ID' ya no funciona?
Peanuts
-2

Puede especificar el número de imágenes por galería. Esto se puede configurar a través de la pestaña de la galería en el cuadro de medios en el editor de publicaciones. Después de que ya haya insertado la galería, creo que puede editarla editando la galería en el editor visual.

hakre
fuente