Использование загрузки медиафайлов в пользовательском виджете WordPress 3.5

5 мая 2013 г., 23:11:55
Просмотры: 15.6K
Голосов: 4

Я создаю небольшой виджет для WordPress 3.5, который позволяет загружать изображения.

Виджет корректно загружается WordPress. Когда я добавляю виджет в сайдбар, кнопка загрузки не работает. Если я обновлю страницу, оставив виджет в сайдбаре, кнопка начинает работать, и я могу загрузить и сохранить изображение.

Для создания виджета я вдохновлялся этими ссылками:

https://stackoverflow.com/questions/13863087/wordpress-custom-widget-image-upload

https://stackoverflow.com/questions/13847714/wordpress-3-5-custom-media-upload-for-your-theme-options/13901303#13901303

Код моего виджета:

<?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();
    });
});

Заранее спасибо за помощь!

0
Все ответы на вопрос 1
10

Проверьте, подойдет ли вам это решение: Вставьте этот код

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) {
6 мая 2013 г. 12:41:59
Комментарии

Спасибо Dot1 за ответ!

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

Я не понимаю, что не так!

Danilo Danilo
6 мая 2013 г. 18:49:22

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

Danilo Danilo
6 мая 2013 г. 19:13:18

Да, так сойдет, только часть плагина, а не весь WordPress.

Kumar Kumar
6 мая 2013 г. 19:15:40

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

Danilo Danilo
6 мая 2013 г. 19:29:01

Я попробовал изменения, которые вы мне показали, но, к сожалению, у меня всё ещё не работает.

Если я добавляю виджет, кнопка не работает. Если я оставляю виджет активным и обновляю страницу, тогда кнопка работает.

Я изменил название скрипта на custom-upload.js

Danilo Danilo
6 мая 2013 г. 22:29:21

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

Danilo Danilo
7 мая 2013 г. 11:28:27

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

Danilo Danilo
7 мая 2013 г. 20:35:02

Ок. Пароль изменен и письмо отправлено

Danilo Danilo
7 мая 2013 г. 21:18:29

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

Danilo Danilo
7 мая 2013 г. 22:16:58

Рады помочь :)

Kumar Kumar
7 мая 2013 г. 22:18:15
Показать остальные 5 комментариев