Phổ biến phương thức WordPress wp_media với lựa chọn hình ảnh


32

Tôi là nhà phát triển plugin Advanced Custom Field và tôi hy vọng bạn có thể giúp tôi giải quyết vấn đề mà tôi đang gặp phải.

Tôi có một nút nơi bạn có thể chỉnh sửa một hình ảnh. Nút này sẽ khởi chạy một phương thức truyền thông WP 3.5 thông qua chức năng wp_media ().

Vấn đề là tôi muốn chọn trước một hình ảnh để các chi tiết của nó được tải trong bảng điều khiển bên.

Hiện tại tôi đang tham gia vào cuộc gọi lại 'mở' và chạy một số mã nằm trong lựa chọn này, tuy nhiên, nó rất khó hiểu và hiệu quả. Đây là những gì nó trông giống như:

// _media is an object I am using

_media.frame = wp.media({
    title       :   'title',
    multiple    :   false,
    button      :   { text : 'button' }
});


// open
_media.frame.on('open',function() {


    // add class
    _media.frame.$el.closest('.media-modal').addClass('acf-media-modal acf-expanded');


    // set selection
    var selection   =   _media.frame.state().get('selection'),
        attachment  =   wp.media.attachment( id );


    attachment.fetch();
    selection.add( attachment );

});


// Finally, open the modal
_media.frame.open();

Điều này đang hoạt động tốt, cho đến khi người dùng mở một cửa sổ phương thức khác, chọn tab tải lên, sau đó sử dụng nút chỉnh sửa mà tôi đã tạo. Bây giờ mã không hoàn toàn vì mã của tôi phụ thuộc vào phương thức ở chế độ 'duyệt'.

Tôi tìm thấy một số mã sẽ hoán đổi khung sang chế độ duyệt, nó trông như thế này:

_media.frame.content.mode('browse');

Điều này hoạt động một số thời gian, nhưng sau đó mã sau thất bại. Giống như nó cần một chút thời gian để hiển thị trước khi tệp đính kèm có thể được thêm vào lựa chọn ....

Chắc chắn có một cách tốt hơn.

Cảm ơn bạn đã giúp đỡ. Elliot


Do sự phức tạp của câu hỏi này, có lẽ tốt nhất nếu bạn gói nó dưới dạng một plugin đơn giản mà người dùng WPSE có thể cài đặt tốt nhất thông qua github, meta.wordpress.stackexchange.com/questions/2572/
Wyck

Câu trả lời:


3

Đây là kịch bản:

Tôi đang sử dụng chức năng loadImagestrong tập lệnh sau để tải các hình ảnh đính kèm hiện có thông qua AJAX và sau đó chỉ cần truyền chức năng với ID hình ảnh và nó sẽ mở ra một phương thức được điền trước.

var frame,
selection = loadImages(images);

$('#stag_images_upload').on('click', function(e) {
    e.preventDefault();

var options = {
    title: '<?php _e("Create Featured Gallery", "stag"); ?>',
    state: 'gallery-edit',
    frame: 'post',
    selection: selection
};

frame = wp.media(options).open();

frame.menu.get('view').unset('cancel');
frame.menu.get('view').unset('separateCancel');
frame.menu.get('view').get('gallery-edit').el.innerHTML = '<?php _e("Edit Featured Gallery", "stag"); ?>';
frame.content.get('view').sidebar.unset('gallery'); // Hide Gallery Settings in sidebar

// when editing a gallery
overrideGalleryInsert();
frame.on( 'toolbar:render:gallery-edit', function() {
    overrideGalleryInsert();
});

frame.on( 'content:render:browse', function( browser ) {
    if ( !browser ) return;
    // Hide Gallery Settings in sidebar
    browser.sidebar.on('ready', function(){
        browser.sidebar.unset('gallery');
    });

    // Hide filter/search as they don't work
    browser.toolbar.on('ready', function(){
        if(browser.toolbar.controller._state == 'gallery-library'){
            browser.toolbar.$el.hide();
        }
    });
});

// All images removed
frame.state().get('library').on( 'remove', function() {
    var models = frame.state().get('library');
    if(models.length == 0){
        selection = false;
        $.post(ajaxurl, { ids: '', action: 'stag_save_images', post_id: stag_ajax.post_id, nonce: stag_ajax.nonce });
    }
});

function overrideGalleryInsert(){
    frame.toolbar.get('view').set({
        insert: {
            style: 'primary',
            text: '<?php _e("Save Featured Gallery", "stag"); ?>',
            click: function(){
                var models = frame.state().get('library'),
                    ids = '';

                models.each( function( attachment ) {
                    ids += attachment.id + ','
                });

                this.el.innerHTML = '<?php _e("Saving...", "stag"); ?>';

                $.ajax({
                    type: 'POST',
                    url: ajaxurl,
                    data: { 
                        ids: ids, 
                        action: 'stag_save_images', 
                        post_id: stag_ajax.post_id, 
                        nonce: stag_ajax.nonce 
                    },
                    success: function(){
                        selection = loadImages(ids);
                        $('#_stag_image_ids').val( ids );
                        frame.close();
                    },
                    dataType: 'html'
                }).done( function( data ) {
                    $('.stag-gallery-thumbs').html( data );
                    console.log(data);
                });
            }
        }
    });
}

function loadImages(images){
    if (images){
        var shortcode = new wp.shortcode({
            tag:      'gallery',
            attrs:    { ids: images },
            type:     'single'
        });

        var attachments = wp.media.gallery.attachments( shortcode );

        var selection = new wp.media.model.Selection( attachments.models, {
            props:    attachments.props.toJSON(),
            multiple: true
        });

        selection.gallery = attachments.gallery;

        selection.more().done( function() {
            // Break ties with the query.
            selection.props.set({ query: false });
            selection.unmirror();
            selection.props.unset('orderby');
        });

        return selection;
    }
    return false;
}

});

Và đây là hàm php xử lý yêu cầu AJAX:

function stag_save_images(){
    if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ){
        return;
    }

    if ( !isset($_POST['ids']) || !isset($_POST['nonce']) || !wp_verify_nonce( $_POST['nonce'], 'stag-ajax' ) ){
        return;
    }

    if ( !current_user_can( 'edit_posts' ) ) return;

    $ids = strip_tags(rtrim($_POST['ids'], ','));
    update_post_meta($_POST['post_id'], '_stag_image_ids', $ids);

    $thumbs = explode(',', $ids);
    $thumbs_output = '';
    foreach( $thumbs as $thumb ) {
        $thumbs_output .= '<li>' . wp_get_attachment_image( $thumb, array(75,75) ) . '</li>';
    }

    echo $thumbs_output;

    die();
}
add_action( 'wp_ajax_stag_save_images', 'stag_save_images' );

function stag_metabox_scripts(){
    global $post;
    if( isset($post) ) {
        wp_localize_script( 'jquery', 'stag_ajax', array(
            'post_id' => $post->ID,
            'nonce' => wp_create_nonce( 'stag-ajax' )
        ) );
    }
}

add_action( 'admin_enqueue_scripts', 'stag_metabox_scripts' );

Tôi vừa sao chép đoạn trích từ khung WordPress của mình, hy vọng nó có ý nghĩa.

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.