Bagaimana cara menyesuaikan output dari shortcode galeri gambar WP dari sebuah plugin?

17

Kami sedang membangun sebuah plugin yang menampilkan posting, dan kami juga ingin menampilkan galeri gambar ketika digunakan dalam sebuah posting. Namun, kita perlu membatasi jumlah foto yang ditampilkan? Apakah itu mungkin?

jnthnclrk
sumber

Jawaban:

36

Ada dua cara yang dapat Anda lakukan tentang hal ini, tetapi keduanya melibatkan pembuatan fungsi yang hampir sama dengan fungsi shortcode galeri yang ada ...

Anda juga bisa ..

  1. Kaitkan ke post_gallerydan manipulasi data yang masuk (Anda dapat menggunakan fungsi kode singkat galeri sebagai basis untuk filter jika perlu)
  2. Batalkan registrasi kode pendek galeri dan daftarkan kode pendek galeri baru dengan modifikasi (sekali lagi Anda dapat menggunakan fungsi yang ada sebagai basis jika perlu)

Saya melakukan sesuatu yang serupa di utas ini , dan saya hanya merujuknya karena saya akan mengambil pendekatan yang sama untuk contoh berikut.

Contoh filter untuk kode singkat galeri

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

Ubah fungsi itu untuk memaksakan pembatasan apa pun yang Anda suka (itu hanya basis) ..

Anda dapat menemukan hook yang saya gunakan di wp-includes/media.phpdalam fungsi panggilan balik kode galeri (lihat baris 763).

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

Semoga itu bisa membantu .. :)

t31os
sumber
terima kasih atas petunjuknya. Saya mencari filter **** ini sekarang selama 2 jam. +1
kaiser
Sepertinya di WP 4.2.2 'orderby' => 'menu_order ID' tidak berfungsi lagi?
Kacang
-2

Anda dapat menentukan jumlah gambar per galeri. Ini dapat dikonfigurasikan melalui tab galeri di kotak media di editor pos. Setelah Anda memasukkan galeri, saya pikir Anda dapat mengeditnya dengan mengedit galeri di editor visual.

hakre
sumber