媒体管理器:在新选择后刷新库

时间:2015-02-04 作者:alex05

我在元数据库中创建了一个自定义字段,其中有一个按钮可以打开媒体管理器并允许选择多个图像。在“打开”事件中,画廊从触发媒体管理器的按钮的“数据ID”属性中检索当前保存选择的图像ID。图像已正确显示并已选定。

我遇到的问题是,在我再次打开媒体管理器并选择新图像后,虽然“数据ID”属性用新选择的图像的新ID更新,但除非我先保存自定义字段,否则库不会用新ID更新以前选择的图像。我做错了什么?我不知道如何“刷新”图像的选择。有人能猜出来吗?

这是我的密码

// Gallery Field Control
var wppf_gallery_ids,
    wppf_get_gallery_list,
    wppf_get_gallery_field;

GalleryControl = {
    // Initializes a new media manager or returns an existing frame.
    // @see wp.media.featuredImage.frame()
    frame: function() {
        if ( this._frame )
            return this._frame;

        this._frame = wp.media({
            title: \'something\',
            library: {
                type: \'image\'
            },
            button: {
                text: \'something\'
            },
            multiple: \'toggle\',
        });

        this._frame.on( \'open\', this.updateFrame ).state(\'library\').on( \'select\', this.select );

        return this._frame;
    },

    select: function() {

        var selection = GalleryControl._frame.state().get( "selection" ).toJSON();
        var wppf_new_ids = \'\';

        // Empty previous images 
        jQuery(wppf_get_gallery_list).empty();

        // Load all stuff up
        jQuery(selection).each(function(index) {
            jQuery(wppf_get_gallery_list).append(\'<li><input type="hidden" name="\'+ wppf_get_gallery_field +\'[\'+ index +\'][id]" value="\'+ this.id +\'"><input type="hidden" name="\'+ wppf_get_gallery_field +\'[\'+ index +\'][url]" value="\'+ this.url +\'"><img src="\'+ this.url +\'"/></li>\');
            wppf_new_ids += this.id + \',\';
        });

        // Remove last comma
        wppf_new_ids = wppf_new_ids.substr(0,wppf_new_ids.length-1);
        jQuery(\'#\' + wppf_get_gallery_field).attr(\'data-ids\',wppf_new_ids);

    },

    updateFrame: function() {

        var selection = GalleryControl.frame().state().get(\'selection\');
        selection.reset();

        // Grab all ids from gallery
        var all_ids = wppf_gallery_ids.split(\',\');

        // Add to selection
        if(all_ids !== \'\') {
            jQuery.each(all_ids, function(index, value) {
                var attachment = wp.media.attachment( value );
                attachment.fetch();
                selection.add( attachment ? [ attachment ] : [] );
            });
        }

    },

    init: function() {
        // Handle media manager
        jQuery(\'body\').on(\'click\', \'.wppf-open-gallery\', function(e) {
            e.preventDefault();
            // Get the gallery id and details
            wppf_get_gallery_field = jQuery(this).attr(\'id\');
            wppf_gallery_ids       = jQuery(this).data(\'ids\');
            wppf_get_gallery_list  = jQuery(this).data(\'list\');
            GalleryControl.frame().open();
        });
    }
};

// Run Gallery Editor
GalleryControl.init();
打开库的按钮如下所示

<a href="#" id="wppf-gallery-gallery" class="wppf-open-gallery button button-primary wppf-gallery" data-list="#wppf-gallery-thumbs-gallery" data-ids="597,596">Create Gallery</a>
当我打开图库并添加2个新图像时,数据ID属性会用新ID更新,如下所示

<a href="#" id="wppf-gallery-gallery" class="wppf-open-gallery button button-primary wppf-gallery" data-list="#wppf-gallery-thumbs-gallery" data-ids="597,596,381,280">Create Gallery</a>
但是,在我保存帖子之前,媒体管理器不会“预选”这4幅图像。有人知道如何解决这个问题吗?

非常感谢。

1 个回复
SO网友:kaiser

我猜你是从什么地方复制了那个代码。仅仅从阅读中,我不明白wppf_gallery_idsinit 函数,这意味着它不能更新任何内容,因为检查为空。我看到两个选项:在select 功能,或只按一下wppf_new_ids 进入wppf_gallery_ids 大堆

在我看来,这两个变量wppf_new_ids/_gallery_ids 具有几乎相同的功能,可能会被删除。

除此之外,您应该将整段代码包装在一个自动执行函数中,并将全局变量推入其中:

( function( $ ) {
    \'use strict\';
    // your code
} )( jQuery || {} );
这也意味着你可以使用$ 而不是jQuery.

我要避免的另一件事是污染全局名称空间。当您只需添加GalleryControl 就像你做的那样,那么你已经window.GalleryControl 设置使用这样一个通用名称,与其他代码的冲突可能会在昨天发生,而不是明天。更好的样式是在window 对象:wppf. 这意味着您的最终包装可能如下所示:

( function( $ ) {
    \'use strict\';

    var gallery;

    gallery.init = function() {
        //
    };

    gallery.frame = function() {
        //
    };

    gallery.select = function() {
        //
    };

    gallery.updateFrame = function() {
        //
    };

    window.wppf = window.wppf || {};
    window.wppf.gallery = window.wppf.gallery || {};
    window.wppf.gallery = new gallery();

} )( jQuery || {} );
有关该主题的更多信息,请参阅excellent article about JS Objects.

结束

相关推荐

如何最好地在Media.php中为字幕应用DO_SHORTED代码

我希望能够在图像标题中添加短代码。我通过修改媒体成功地做到了这一点。php文件,在返回之前包含以下内容。$atts[\'caption\']= do_shortcode($atts[\'caption\']); 它工作得很好,但我相信有更好的方法,因为我不想修改媒体。php每次我更新WP。