Использование загрузки медиафайлов в пользовательском виджете WordPress 3.5
Я создаю небольшой виджет для WordPress 3.5, который позволяет загружать изображения.
Виджет корректно загружается WordPress. Когда я добавляю виджет в сайдбар, кнопка загрузки не работает. Если я обновлю страницу, оставив виджет в сайдбаре, кнопка начинает работать, и я могу загрузить и сохранить изображение.
Для создания виджета я вдохновлялся этими ссылками:
https://stackoverflow.com/questions/13863087/wordpress-custom-widget-image-upload
Код моего виджета:
<?php
add_action('widgets_init', 'ctUp_ads_widget');
function ctUp_ads_widget() {
register_widget( 'ctUp_ads' );
}
function ctUp_wdScript(){
wp_enqueue_media();
wp_enqueue_script('adsScript', get_template_directory_uri() . '/js/ads.js');
}
add_action('admin_enqueue_scripts', 'ctUp_wdScript');
class ctUp_ads extends WP_Widget{
function ctUp_ads() {
$widget_ops = array( 'classname' => 'ctUp-ads' );
$control_ops = array( 'width' => 250, 'height' => 350, 'id_base' => 'ctUp-ads-widget' );
$this->WP_Widget( 'ctUp-ads-widget',THEMENAME .' - Реклама', $widget_ops, $control_ops );
}
public function widget($args, $instance){
extract( $args );
?>
<a href="#"><img src="<?php echo esc_url($instance['image_uri']); ?>" /></a>
<?php }
function update($new_instance, $old_instance) {
$instance = $old_instance;
$instance['text'] = strip_tags( $new_instance['text'] );
$instance['image_uri'] = strip_tags( $new_instance['image_uri'] );
return $instance;
}
public function form($instance){ ?>
<p>
<label for="<?php echo $this->get_field_id('text'); ?>"><?php _e('Текст', THEMENAME); ?></label><br />
<input type="text" name="<?php echo $this->get_field_name('text'); ?>" id="<?php echo $this->get_field_id('text'); ?>" value="<?php echo $instance['text']; ?>" class="widefat" />
</p>
<p>
<label for="<?php echo $this->get_field_id('image_uri'); ?>">Изображение</label><br />
<img class="custom_media_image" src="<?php if(!empty($instance['image_uri'])){echo $instance['image_uri'];} ?>" style="margin:0;padding:0;max-width:100px;float:left;display:inline-block" />
<input type="text" class="widefat custom_media_url" name="<?php echo $this->get_field_name('image_uri'); ?>" id="<?php echo $this->get_field_id('image_uri'); ?>" value="<?php echo $instance['image_uri']; ?>">
<a href="#" class="button custom_media_upload"><?php _e('Загрузить', THEMENAME); ?></a>
</p>
<?php
}
}
Js код:
jQuery(function($){
$('.custom_media_upload').click(function(e) {
e.preventDefault();
var custom_uploader = wp.media({
title: 'Выберите изображение',
button: {
text: 'Выбрать',
},
multiple: false // Установите true для выбора нескольких файлов
})
.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();
});
});
Заранее спасибо за помощь!

Проверьте, подойдет ли вам это решение: Вставьте этот код
jQuery(document).ready( function(){
function media_upload( button_class) {
var _custom_media = true,
_orig_send_attachment = wp.media.editor.send.attachment;
jQuery('body').on('click',button_class, function(e) {
var button_id ='#'+jQuery(this).attr('id');
/* console.log(button_id); */
var self = jQuery(button_id);
var send_attachment_bkp = wp.media.editor.send.attachment;
var button = jQuery(button_id);
var id = button.attr('id').replace('_button', '');
_custom_media = true;
wp.media.editor.send.attachment = function(props, attachment){
if ( _custom_media ) {
jQuery('.custom_media_id').val(attachment.id);
jQuery('.custom_media_url').val(attachment.url);
jQuery('.custom_media_image').attr('src',attachment.url).css('display','block');
} else {
return _orig_send_attachment.apply( button_id, [props, attachment] );
}
}
wp.media.editor.open(button);
return false;
});
}
media_upload( '.custom_media_upload');
});
Вместо ссылки для загрузки можно использовать кнопку
<input type="button" value="<?php _e( 'Загрузить изображение', 'название темы' ); ?>" class="button custom_media_upload" id="custom_image_uploader"/>
Обновление:
Небольшие изменения в вашем JS, и проблема будет решена. Вместо
jQuery(button_class).click(function(e) {
используйте
jQuery('body').on('click',button_class, function(e) {
так как виджет добавляется с помощью AJAX. Даже ваш предыдущий код должен работать, если внести аналогичные изменения в JS.
$('body').on('click','.custom_media_upload',function(e) {

Спасибо Dot1 за ответ!
Я попытался заменить код виджета, но, к сожалению, он по-прежнему не работает. Это работает только при перезагрузке страницы с активированным виджетом.
Я не понимаю, что не так!

В данный момент я разрабатываю локально с помощью XAMPP. Если хотите, я могу создать zip-файл с виджетом, и вы загрузите его на Dropbox

https://dl.dropboxusercontent.com/u/5490925/wpads.zip Я разместил виджет внутри темы, вызывая его из файла functions.php - Спасибо!

Я попробовал изменения, которые вы мне показали, но, к сожалению, у меня всё ещё не работает.
Если я добавляю виджет, кнопка не работает. Если я оставляю виджет активным и обновляю страницу, тогда кнопка работает.
Я изменил название скрипта на custom-upload.js

WP_Debug отключен. Путь к файлу указан правильно, и он загружается корректно в административной области. Я загрузил виджет в стандартную тему WordPress для тестирования.

Привет. Извини, что не ответил раньше, но я был на работе. Я устанавливаю демо-версию WordPress на сервер, который у меня есть. Когда закончу установку WordPress, я пришлю тебе ссылку.

Огромное спасибо!!! Теперь все работает отлично! Я даже не знаю, как тебя отблагодарить! Спасибо большое за твое время!
