问题描述
这可以做吗
我喜欢新上传者的工作原理。我猜测它与 jQuery 调用有关,就像其他方式一样。
编辑
这是我目前使用的代码
jQuery(document).ready(function($) {
$('.custom_upload_image_button').click(function() {
imageField = $(this).prev('input');
tb_show('', 'media-upload.php?type=image&TB_iframe=true');
});
window.send_to_editor = function(html) {
imgurl = $(html).attr('href');
$(imageField).val(imgurl);
tb_remove();
};
$('.clear_field').click(function() {
var defaultImage = jQuery(this).parent().siblings('.custom_default_image').text();
jQuery(this).parent().siblings('.custom_upload_image').val('');
return false;
});
});
最佳解决方案
为了让你开始,基本的功能和覆盖,据我所知,目前可能会有更好的解决方案,但我只有两天与 3.5 还:
// open modal - bind this to your button
if ( typeof wp !== 'undefined' && wp.media && wp.media.editor )
wp.media.editor.open( ##unique_id_here## );
// backup of original send function
original_send = wp.media.editor.send.attachment;
// new send function
wp.media.editor.send.attachment = function( a, b) {
console.log(b); // b has all informations about the attachment
// or whatever you want to do with the data at this point
// original function makes an ajax call to retrieve the image html tag and does a little more
};
// wp.media.send.to.editor will automatically trigger window.send_to_editor for backwards compatibility
// backup original window.send_to_editor
window.original_send_to_editor = window.send_to_editor;
// override window.send_to_editor
window.send_to_editor = function(html) {
// html argument might not be useful in this case
// use the data from var b (attachment) here to make your own ajax call or use data from b and send it back to your defined input fields etc.
}
这不是完整的工作答案。你必须自己定义和跟踪您的输入字段等。这只是让你开始。如果你有更具体的问题,请问。
并确保在脚本完成时重新分配原来的功能。
从评论中提取:
How can I listen to the close event of the lightbox?
// add listener:
wp.media.view.Modal.prototype.on('close', function(){ console.log('triggered close'); }
次佳解决方案
这是一个关于如何在主题选项中使用 WP 3.5 媒体上传器的小型 tutorial 。这是我想出来的,它对我来说是完美的。让我知道如果你想出了更好的解决方案。
这是我如何在主题选项中实现代码:
jQuery(document).ready(function($){
$('.stag-metabox-table .button').click(function(e){
var send_attachment_bkp = wp.media.editor.send.attachment;
var button = $(this);
var id = button.attr('id').replace('_button', '');
wp.media.editor.send.attachment = function(props, attachment){
$("#"+id).val(attachment.url);
wp.media.editor.send.attachment = send_attachment_bkp;
}
wp.media.editor.open(button);
return false;
});
});
更新
此代码仅适用于帖子编辑页面。要使其在主题选项页面上工作,您需要添加 wp_enqueue_media();
第三种解决方案
我做的几乎一样,它还没有准备好但它的作品:
在 php 中:
<input id="default_featured_image" type="text" size="100" name="default_featured_image" value="<?php echo esc_attr( $value ); ?>" />
<?php
do_action( 'media_buttons', 'default_featured_image' ); // second argument is the same as the `<input>` id
javascript:
jQuery('#default_featured_image_button').click(function () {
var formfield = jQuery('#default_featured_image').attr('name');
tb_show('', 'media-upload.php?type=image&TB_iframe=true');
return false;
});
window.send_to_editor = function (html) {
var imgurl = jQuery('img', html).attr('src');
console.log(jQuery('img', html));
console.log(html);
console.log(imgurl);
// set the url as the value
jQuery('#default_featured_image').val(imgurl);
tb_remove();
};
这将使您能够将图像 url(任意大小) 上传并发送到<input>
元素。我试图做一个设置它,它的工作原理,只有我现在需要的是一个可靠的方式发送附件 ID 到<input>
第四种方案
我认为 @janw 有一个完全正确的,但我无法做一件事情。 Jan 插入媒体库按钮:
do_action( 'media_buttons', 'default_featured_image' );
然后 pre-empts 的默认动作使用:
jQuery('#default_featured_image_button').click(function () {...
我遇到的问题是以这种方式插入媒体按钮不会将一个”default_featured_image_button” 的 ID 分配给该链接。实际上它不会在插入的链接上添加任何 ID 。所以这是我做的,让它上班。
我在我的输入字段之后添加了这个行到我的元框回调函数:
<input id="upload_logo_button" type="button" value="Media Library Image" class="button-secondary" />
然后我排队我的自定义 jquery 文件和 thickbox css 文件,也在我的 functions.php 文件中,使用:
add_action('admin_enqueue_scripts', 'jhsir_load_image_set_js');
function jhsir_load_image_set_js() {
wp_enqueue_script( 'jhsir_image_set_script', get_stylesheet_directory_uri() . '/js/image-set.js', array('jquery','media-upload','thickbox') );
wp_enqueue_style( 'thickbox' );
}
最后我的 image-set.js 文件包含以下内容:
jQuery(document).ready(function($) {
var formfield = null;
$('#upload_logo_button, #upload_background_button').click(function() {
$('html').addClass('Image');
formfield = $(this).prev('input').attr('name');
formfield_id = $(this).prev('input').attr('id');
tb_show( '', 'media-upload.php?type=image&TB_iframe=true' );
return false;
});
// user inserts file into post.
// only run custom if user started process using the above process
// window.send_to_editor(html) is how wp normally handles the received data
window.original_send_to_editor = window.send_to_editor;
window.send_to_editor = function( html ) {
var fileurl;
if(formfield != null) {
fileurl = $( 'img', html).attr('src');
$( "#" + formfield_id ).val(fileurl);
tb_remove();
$('html').removeClass('Image');
formfield = null;
} else {
window.original_send_to_editor(html);
}
};
});
您将注意到,我使用变量存储刚刚在调用 jQuery 的链接之前的输入字段的名称和 ID 。这样就可以在同一页上重复使用这个代码。您只需要为所有按钮分配一个类,或者像我一样为 jquery 中的按钮使用个别 ID 。我希望这可以帮助一个人,因为我的答案是我的。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。