如何修改wp.media以获取和显示多个图像

时间:2017-01-05 作者:CK MacLeod

我的jQuery脚本可以很好地打开wp。media uploader,选择或上载单个图像,同时显示图像并通过隐藏输入将其附件ID添加到现有选项阵列(在“我的插件设置”页面上)。我的目标是重新产生相同的结果,but for multiple images at a time.

像我之前的许多人一样,我在使用wp方面遇到了障碍。用于此类目的的媒体。

首先,我将展示完整的工作脚本:它打开媒体框,允许我选择图像,捕获隐藏输入的图像附件ID(最关键的功能),并在保存操作之前提供预览图像,在页面刷新时,通过其附件ID将图像显示在我想要的位置。对于任何研究和编写了使用wp的例程的人来说,大多数都是熟悉的。这种特殊的用法(撇开插件设置的特殊性不谈)到目前为止已经有了很好的记录,至少与多个文件的用法相比是这样的。

工作单映像代码

jQuery(document).ready( function($) {

    var myplugin_media_upload;

    $(\'#myplugin-change-image\').click(function(e) {
        e.preventDefault();

    // If the uploader object has already been created, reopen the dialog
        if( myplugin_media_upload ) {
            myplugin_media_upload.open();
            return;
        }

    // Extend the wp.media object
        myplugin_media_upload = wp.media.frames.file_frame = wp.media({
            title: button_text.title,
            button: { text: button_text.button },
            multiple: false
        });

    //When a file is selected, grab the URL and set it as the text field\'s value
        myplugin_media_upload.on( \'select\', function() {
            attachment = myplugin_media_upload.state().get( 
                 \'selection\' ).first().toJSON();
            console.log(attachment); //irrelevant to functionality but useful
            //adds the ID to the hidden input
            $(\'#myplugin-featured-image\').val( attachment.id );
            //provides the preview image
            $(\'#myplugin-thumbnail\').empty();
            $(\'#myplugin-thumbnail\').append( 
                \'<img src="\' + attachment.url + 
                \'" class="attachment-thumbnail myplugin-preview" />\' );
            $(\'#myplugin-new-global\').show();
        });

    //Open the uploader dialog
        myplugin_media_upload.open();
    });

});
大部分功能失调的多幅图像尝试结合各处的多个选择例程片段,我尝试了各种改编。下面这一部分将重点介绍关键序列。我之所以提出它,并不是因为它有一个完全成功的机会,而是因为它部分成功,并确实产生了一些可能有用和有趣的信息:

// Extend the wp.media object
    myplugin_media_upload = wp.media.frames.file_frame = wp.media({
        title: button_text.title,
        button: { text: button_text.button },
        multiple: true //get multiple images
    });

//When a file is selected, grab the URL and set it as the text field\'s value
    myplugin_media_upload.on( \'select\', function() {
        var selection = myplugin_media_upload.state().get( \'selection\' );
        selection.map( function( attachment ) {
            attachment.toJSON();

            //shows each attachment ID:
            console.log(attachment.id);
            //last is captured for:
            $(\'#myplugin-featured-image\').val( attachment.id );

            //captures code fragment (see notes)
            console.log(attachment.url);

        });

    });
虽然上一个示例中最后一个“附件缩略图”相关的内容根本不起作用,因此未包含在内,但此代码确实捕获了所选图像的最后一个附件ID,并将其作为隐藏输入所需的“val”附加。

查看控制台,我发现无论选择了多少图像,实际上都是按ID收集的,attachment.url 结果是注册为一段功能异常的URL,其派生代码显然来自wp-includes/js/backbone.min.js. 也许有人会在这里找到线索,或者至少觉得有点有趣(!?)。

我想我想在ID暴露时捕获它们,将它们组装在一个数组中,然后foreach将它们循环到不同类型的图像显示中,可能是使用递增的html ID,同样,我需要能够捕获用于PHP处理的数组。

我很确定,一旦处理了“组装和访问数组”部分,我就可以处理最后两个部分(显示和PHP处理),但此时,我的jQuery功能变得非常不足。这导致了数小时糟糕的尝试和错误,当我尝试访问我认为应该是ID数组的变量时,会出现很多“未定义”的通知。到目前为止,我所做的只是装饰控制台,充其量只能给我一个可用的值,正如前面所描述的。

我希望有人能提供一个答案,除了解决这个特定的问题,这将相当于一个工作模板,用于获取和使用插件、主题和函数中的多个图像选择。

PPS:请别挂断电话,我想我几乎得到了一个答案,令人震惊

虽然我仍然很好奇,想看看真正的jQuery大师想出了什么……;)

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

所以,这是可行的。我很乐意实施和信用改善!

/**
 * @Script: WordPress Multiple Image Selection in jQuery
 * @Version: 0.1
 * @Author: CK MacLeod
 * @Author URI: http://ckmacleod.com
 * @License: GPL3
 */

jQuery(document).ready( function( $ ) {

    var myplugin_media_upload;

    $(\'#myplugin-change-image\').click(function(e) {

        e.preventDefault();

        // If the uploader object has already been created, reopen the dialog
        if( myplugin_media_upload ) {

            myplugin_media_upload.open();
            return;

        }

        // Extend the wp.media object
        myplugin_media_upload = wp.media.frames.file_frame = wp.media({

            //button_text set by wp_localize_script()
            title: button_text.title,
            button: { text: button_text.button },
            multiple: true //allowing for multiple image selection

        });

        /**
         *THE KEY BUSINESS
         *When multiple images are selected, get the multiple attachment objects
         *and convert them into a usable array of attachments
         */
        myplugin_media_upload.on( \'select\', function(){

            var attachments = myplugin_media_upload.state().get(\'selection\').map( 

                function( attachment ) {

                    attachment.toJSON();
                    return attachment;

            });

            //loop through the array and do things with each attachment

           var i;

           for (i = 0; i < attachments.length; ++i) {

                //sample function 1: add image preview
                $(\'#myplugin-placeholder\').after(
                    \'<div class="myplugin-image-preview"><img src="\' + 
                    attachments[i].attributes.url + \'" ></div>\'
                    );

                //sample function 2: add hidden input for each image
                $(\'#myplugin-placeholder\').after(
                    \'<input id="myplugin-image-input\' +
                    attachments[i].id \'" type="hidden" 
                    name="myplugin_attachment_id_array[]"  value="\' + 
                    attachments[i].id + \'">\'
                    );

            }

        });

    myplugin_media_upload.open();

    });

});