问题描述

WordPress 3.5 最近发布,我使用 WordPress Media Upload 系统通过 thickbox 和 window.send_to_editor 在我的 WordPress 主题 (背景,标志等) 的一些选项。

但是,如您所知,Wordpress 已经集成了一个新的媒体管理器,我想使用这个新功能将图像/文件上传为自定义字段。所以我花了早晨找到一种方法来获得希望的结果。

我找到了这个解决方案,这对你们中的一些有用。感谢您提供有关您的代码或任何改进您的想法的反馈意见!

HTML 示例:

<a href="#" class="custom_media_upload">Upload</a>
<img class="custom_media_image" src="" />
<input class="custom_media_url" type="text" name="attachment_url" value="">
<input class="custom_media_id" type="text" name="attachment_id" value="">

jQuery 代码:

$('.custom_media_upload').click(function() {

    var send_attachment_bkp = wp.media.editor.send.attachment;

    wp.media.editor.send.attachment = function(props, attachment) {

        $('.custom_media_image').attr('src', attachment.url);
        $('.custom_media_url').val(attachment.url);
        $('.custom_media_id').val(attachment.id);

        wp.media.editor.send.attachment = send_attachment_bkp;
    }

    wp.media.editor.open();

    return false;
});

如果要查看 attachment 变量中包含的每个设置,都可以使用 console.log(attachment)alert(attachment)

祝你有美好的一天!

最佳解决方案

不要忘记使用 wp_enqueue_media(3.5 中的新功能),如果您不在发布编辑页面

要使用旧媒体上传框,您可以这样做:

if(function_exists( 'wp_enqueue_media' )){
    wp_enqueue_media();
}else{
    wp_enqueue_style('thickbox');
    wp_enqueue_script('media-upload');
    wp_enqueue_script('thickbox');
}

次佳解决方案

你以这种无意的方式去做。您的 JavaScript 代码应该看起来像这样:

$('.custom_media_upload').click(function(e) {
    e.preventDefault();

    var custom_uploader = wp.media({
        title: 'Custom Title',
        button: {
            text: 'Custom Button Text'
        },
        multiple: false  // Set this to true to allow multiple files to be selected
    })
    .on('select', function() {
        var attachment = custom_uploader.state().get('selection').first().toJSON();
        $('.custom_media_image').attr('src', attachment.url);
        $('.custom_media_url').val(attachment.url);
        $('.custom_media_id').val(attachment.id);
    })
    .open();
});

第三种解决方案

我修改了这个代码,使其可以一次性用于多个字段:

HTML:

<!-- Image Thumbnail -->
<img class="custom_media_image" src="" style="max-width:100px; float:left; margin: 0px     10px 0px 0px; display:inline-block;" />

<!-- Upload button and text field -->
<input class="custom_media_url" id="" type="text" name="" value="" style="margin-bottom:10px; clear:right;">
<a href="#" class="button custom_media_upload">Upload</a>

jQuery 的:

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

$('.custom_media_upload').click(function() {

        var send_attachment_bkp = wp.media.editor.send.attachment;
        var button = $(this);

        wp.media.editor.send.attachment = function(props, attachment) {

            $(button).prev().prev().attr('src', attachment.url);
            $(button).prev().val(attachment.url);

            wp.media.editor.send.attachment = send_attachment_bkp;
        }

        wp.media.editor.open(button);

        return false;       
    });

});

第四种方案

如果编辑器关闭,我没有发现任何触发自定义功能的内容。我用这个:

wp.media.editor.open();
$('.media-modal-close, .media-modal-backdrop').one('click', function(){
    //do some stuff
});

或更好:

var id = wp.media.editor.id();
var editor = wp.media.editor.get( id );
if('undefined' != typeof( editor )) editor = wp.media.editor.add( id );

if ( editor ) {
    editor.on('close', function(){
        //do some stuff
    });
}

第五种方案

我没有太多的机会玩这个,但是对于那些想要利用图库元素的人来说,这段代码应该让你有所进步。

它只是一个起点 – 它只提供一个逗号分隔的图像 ID 列表,但这应该足以开始创意。

<input id="custom_media_id" type="text" name="attachment_id" value="">
<a href="#" class="button custom_media_upload" title="Add Media">Add Media</a>

<script type="text/javascript">
  jQuery('.custom_media_upload').click(function() {
    var clone = wp.media.gallery.shortcode;
    wp.media.gallery.shortcode = function(attachments) {
    images = attachments.pluck('id');
    jQuery('#custom_media_id').val(images);
    wp.media.gallery.shortcode = clone;
    var shortcode= new Object();
    shortcode.string = function() {return ''};
    return shortcode;
  }
jQuery(this).blur(); // For Opera. See: http://core.trac.wordpress.org/ticket/22445
wp.media.editor.open();
return false;       
});
</script>

这将按照编辑器中设置的顺序 (使用新的拖放功能),以逗号分隔的图像 ID 列表填充输入字段。

该函数希望将短代码发送回主编辑器中放置,但我们不想这样做,因此我们创建一个新对象,返回一个空白字符串进行插入。

另请注意,这不会像上述那样处理插入一个图像 – 它只是将它放入后编辑器。所以尝试组合两个监听器,或删除相应的选项卡。

编辑

花了一些时间看核心,我认为这个整个过程实际上可以使用 here 设计的技术变得更加简单,但正如你所看到的,当我重新打开媒体管理器时,我还没有想到如何使用 pre-select 。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。