将jQuery传递到WordPress媒体上载程序

时间:2014-09-18 作者:ndiego

在我正在开发的Wordpress插件中,我使用内置的Wordpress媒体上传器功能(wp.media)添加照片。我正在使用selection 打开模式后,可在媒体库中预选图像的选项。我认为在这些项目上附加一个新的CSS类,并将它们的样式与用户选择的其他新图像不同,这将是一个很酷的想法。

我在将jQuery传递到模式中时遇到了一个问题,我似乎无法正确处理事件。问题是,一旦打开模式,媒体上传器中的图像就会动态生成。我已尝试将脚本添加到on 事件(打开模式时),但这似乎为时过早。将它们添加到selectclose 事件显然为时已晚。

目标是在模式打开后,将自定义CSS类添加到预先选择的所有图像中。有没有人有过将jQuery传递到媒体上传器模式的经验?

下面是我使用的jQuery:

//Image Uploader function                  
odp_slideshowImageUpload = {

    // Call this from the upload button to initiate the upload frame.
    uploader : function() {
        var frame = wp.media({
            title : \'Choose or Upload an Image(s)\',
            multiple : true,
            library : { type : \'image\' }, //only can upload images
            button : { text : \'Insert Image(s)\' }
        });

        frame.on( \'open\', function() {
            var selection = frame.state().get(\'selection\');

            // Get the id of all the images already in the slideshow
            var ids = $( \'#odp_slider_container li[id]\' ).map(function() { return this.id; }).get();
            // When our modal opens, make all of the images "selected"
            ids.forEach( function(id) {
                attachment = wp.media.attachment(id);
                attachment.fetch();
                selection.add( attachment ? [ attachment ] : [] );
            });


            $(\'.media-modal-content li.selected\').addClass(\'testing\'); //does not work

        });

        // Handle results from media manager
        frame.on( \'select\', function() {
            var selection = frame.state().get( \'selection\' );
            selection.map( function( attachment ) {
                attachment = attachment.toJSON();
                $( \'#odp_slider_container\' ).append( function() {
                    var output = \'\';

                    output += \'<li id="\' + attachment.id + \'" class="odp-slideshow-item" >\';
                    output += \'<div class="slide-container"><image  src="\' + attachment.sizes.thumbnail.url + \'" alt="\' + attachment.alt + \'" /></div>\';
                    output += \'<input type="text" class="slide-id odp-force-hidden" name="slide_id[]" value="\' + attachment.id + \'" />\';
                    output += \'<input type="text" class="slide-image odp-force-hidden" name="slide_image[]" value="\' + attachment.url + \'" />\';
                    output += \'<input type="text" class="slide-title odp-force-hidden" name="slide_title[]" value="\' + attachment.title + \'" />\';
                    output += \'<input type="text" class="slide-alt odp-force-hidden" name="slide_alt[]" value="\' + attachment.alt + \'" />\';
                    output += \'<input type="text" class="slide-caption odp-force-hidden" name="slide_caption[]" value="\' + attachment.caption + \'" />\';
                    output += \'<div class="details-container"><a class="details" href="#">Details</a><a class="remove" href="#">Remove</a></div>\';
                    output += \'</li>\';

                    return output;
                });
            });
        });

        frame.open();
        return false;

    },

};
我理解这是一个复杂的问题,所以请告诉我是否可以在某些方面更清楚。

1 个回复
最合适的回答,由SO网友:bonger 整理而成

正如您所提到的,媒体上传程序“按需”动态呈现图像,并且似乎没有可以添加类的目标事件。总的来说,这样做的方法是覆盖wp.media.view.Attachment.Library.className 属性(在创建框架之前),如果模型id位于初始选择中,则返回额外的类。这意味着将ids select移动到开放的外部,例如

//Image Uploader function                  
odp_slideshowImageUpload = {

    // Call this from the upload button to initiate the upload frame.
    uploader : function() {
        // Get the id of all the images already in the slideshow
        var ids = $( \'#odp_slider_container li[id]\' ).map(function() { return this.id; }).get();
        wp.media.view.Attachment.Library = wp.media.view.Attachment.Library.extend({
            className: function () { return $.inArray(this.model.get(\'id\').toString(), ids ) !== -1 ? \'attachment testing\' : \'attachment\'; }
        });
        var frame = wp.media({
            // etc

结束