Làm cách nào để tùy chỉnh đầu ra của shortcode thư viện ảnh WP từ một plugin?


17

Chúng tôi đang xây dựng một plugin hiển thị các bài đăng và chúng tôi cũng muốn hiển thị thư viện hình ảnh khi nó được sử dụng trong một bài đăng. Tuy nhiên, chúng ta cần giới hạn số lượng ảnh hiển thị? Điều đó có thể không?

Câu trả lời:


36

Có hai cách bạn có thể thực hiện, nhưng cả hai đều liên quan đến việc tạo một chức năng gần giống như chức năng shortcode của bộ sưu tập hiện có ...

Bạn có thể ..

  1. Kết nối post_galleryvà thao tác dữ liệu đến (bạn có thể sử dụng chức năng shortcode của bộ sưu tập làm cơ sở cho bộ lọc nếu cần)
  2. Hủy đăng ký mã ngắn thư viện và đăng ký một mã ngắn thư viện mới với các sửa đổi (một lần nữa bạn có thể sử dụng chức năng hiện có làm cơ sở nếu cần thiết)

Tôi đã làm một cái gì đó tương tự trong chủ đề này , và tôi chỉ đề cập đến nó bởi vì tôi sẽ thực hiện cùng một cách tiếp cận cho ví dụ sau đây.

Bộ lọc ví dụ cho shortcode bộ sưu tập

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

Sửa đổi chức năng đó để áp đặt bất kỳ hạn chế nào bạn thích (nó chỉ là một cơ sở) ..

Bạn có thể tìm thấy hook mà tôi đang sử dụng wp-includes/media.phpbên trong hàm gọi lại shortcode của bộ sưu tập (xem dòng 763).

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

Mong rằng sẽ giúp .. :)


cảm ơn vì gợi ý Tôi đã tìm kiếm bộ lọc **** này trong 2 giờ. +1
kaiser

Có vẻ như trong WP 4.2.2, 'orderby' => 'menu_order ID' không hoạt động nữa?
Đậu phộng

-2

Bạn có thể chỉ định số lượng hình ảnh trên mỗi bộ sưu tập. Điều này có thể được cấu hình thông qua tab thư viện trong hộp dày phương tiện trong trình chỉnh sửa bài. Sau khi bạn đã chèn bộ sưu tập, tôi nghĩ bạn có thể chỉnh sửa bộ sưu tập đó bằng cách chỉnh sửa bộ sưu tập trong trình chỉnh sửa trực quan.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.