Cum se personalizează rezultatul shortcode-ului pentru galeria de imagini WP dintr-un plugin?

20 nov. 2010, 15:57:31
Vizualizări: 44.7K
Voturi: 17

Construim un plugin care afișează articole și dorim să afișăm și galeria de imagini atunci când aceasta este utilizată într-un articol. Totuși, avem nevoie să limităm numărul de fotografii afișate. Este posibil acest lucru?

0
Toate răspunsurile la întrebare 2
2
37

Există două modalități prin care poți aborda această problemă, dar ambele implică crearea unei funcții care face practic același lucru ca funcția shortcode-ului pentru galerie existent...

Poți fie să..

  1. Te conectezi la post_gallery și să manipulezi datele primite (poți folosi funcția shortcode-ului pentru galerie ca bază pentru filtrul dacă este necesar)
  2. Anulezi înregistrarea shortcode-ului pentru galerie și să înregistrezi un nou shortcode pentru galerie cu modificări (din nou, poți folosi funcția existentă ca bază dacă este necesar)

Am făcut ceva similar în acest thread, și mă refer la el doar pentru că voi folosi aceeași abordare pentru exemplul care urmează.

Exemplu de filtru pentru shortcode-ul galerie

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

    static $instance = 0;
    $instance++;

    // Avem încredere în inputul autorului, dar să ne asigurăm că arată ca o comandă orderby validă
    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;
}

Modifică acea funcție pentru a impune orice restricții dorești (este doar o bază)..

Poți găsi hook-ul pe care îl folosesc în wp-includes/media.php în interiorul funcției de callback a shortcode-ului pentru galerie (vezi linia 763).

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

Sper că te ajută.. :)

21 nov. 2010 01:17:30
Comentarii

mulțumesc pentru indiciu. Am căutat acest filtru **** timp de 2 ore. +1

kaiser kaiser
6 mai 2011 03:33:31

Se pare că în WP 4.2.2 'orderby' => 'menu_order ID' nu mai funcționează?

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

Puteți specifica numărul de imagini pe galerie. Această setare poate fi configurată prin fila galerie din caseta media în editorul de articole. După ce ați inserat deja galeria, cred că o puteți edita prin modificarea galeriei în editorul vizual.

21 nov. 2010 01:02:31