Использование медиазагрузчика Wordpress 3.5 в метабоксе

12 дек. 2012 г., 02:37:57
Просмотры: 19.3K
Голосов: 16

Возможно ли это сделать?

Мне нравится, как работает новый загрузчик. Полагаю, это связано с вызовом 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;
    });
});
0
Все ответы на вопрос 5
4

Чтобы помочь вам начать, вот основные функции и переопределения, которые мне известны на данный момент. Возможно, есть более удачные решения, но я работаю с версией 3.5 всего два дня:

// открытие модального окна - привяжите это к вашей кнопке
    if ( typeof wp !== 'undefined' && wp.media && wp.media.editor )
        wp.media.editor.open( ##уникальный_идентификатор## );

// резервное копирование оригинальной функции отправки
   original_send = wp.media.editor.send.attachment;

// новая функция отправки
   wp.media.editor.send.attachment = function( a, b) {
       console.log(b); // b содержит всю информацию о вложении
       // или любые другие действия с данными на этом этапе
       // оригинальная функция делает ajax-запрос для получения html-тега изображения и выполняет дополнительные действия
    };

// wp.media.send.to.editor автоматически вызовет window.send_to_editor для обратной совместимости

// резервное копирование оригинального window.send_to_editor
   window.original_send_to_editor = window.send_to_editor; 

// переопределение window.send_to_editor
   window.send_to_editor = function(html) {
       // аргумент html может быть не полезен в этом случае
       // используйте данные из переменной b (вложение) для своего ajax-запроса или отправки данных в ваши поля ввода и т.д.
   }

Это не готовое рабочее решение. Вам нужно самостоятельно определять и отслеживать свои поля ввода и т.д. Это только отправная точка. Если у вас есть более конкретные вопросы, спрашивайте.

И не забудьте вернуть оригинальные функции после завершения работы вашего скрипта.


Взято из комментариев:

Как можно отслеживать событие закрытия лайтбокса?

// добавление слушателя: 
wp.media.view.Modal.prototype.on('close', function(){ console.log('триггер закрытия'); }
12 дек. 2012 г. 08:35:42
Комментарии

Спасибо! Но у меня всё равно не получается заставить это работать. Выше я вставил код, который использовал для старого загрузчика медиафайлов, если это поможет.

souporserious souporserious
12 дек. 2012 г. 20:16:30

Ipstenu и команда поддержки составили основной список проблем (http://wordpress.org/support/topic/troubleshooting-wordpress-35-master-list?replies=4), о которых сообщают в WordPress 3.5. Эта ветка не предназначена для отзывов пользователей, а является курируемым обсуждением, где кратко перечислены известные проблемы, а также даны инструкции по их устранению.

Tara Tara
12 дек. 2012 г. 22:24:13

Как я могу отслеживать событие закрытия лайтбокса? Мне нужно запустить пользовательскую функцию, если кто-то не выбирает новое изображение

Xaver Xaver
13 дек. 2012 г. 18:34:56

// добавляем слушатель: wp.media.view.Modal.prototype.on('close', function(){ console.log('triggered close'); }

ungestaltbar ungestaltbar
14 дек. 2012 г. 00:16:23
1

Вот небольшой руководство по использованию медиазагрузчика WP 3.5 в настройках темы. Вот что у меня получилось, и это отлично работает. Дайте знать, если у вас есть более удачное решение.

Вот как я реализовал этот код в настройках своей темы:

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

13 дек. 2012 г. 09:05:45
Комментарии

что если разрешить выбор только одного изображения, а не нескольких?

Mehul Kaklotar Mehul Kaklotar
6 мар. 2015 г. 17:06:21
2

Я делаю почти то же самое, это еще не готово, но уже работает:

В 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' ); // второй аргумент такой же, как id `<input>`

JavaScript:

jQuery('#default_featured_image_button').click(function () {
    var formfield = jQuery('#default_featured_image').attr('name');
    tb_show('', 'media-upload.php?type=image&amp;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);
    // устанавливаем URL как значение
    jQuery('#default_featured_image').val(imgurl);
    tb_remove();
};

Это позволит вам загружать и передавать URL изображения (любого размера) в элемент <input>.
Я пытаюсь сделать это как настройку, и это работает. Единственное, что мне сейчас нужно — это надежный способ передать ID вложения в <input>.

14 дек. 2012 г. 15:32:01
Комментарии

Огромное спасибо!!!!!!!! Это наконец-то сработало после 2 дней отчаянных поисков решения!!! Огромное вам спасибо!!!

Devner Devner
25 февр. 2013 г. 09:24:00

возможно, вам стоит взглянуть на исходный код этого в моем плагине: http://wordpress.org/extend/plugins/default-featured-image/

janw janw
25 февр. 2013 г. 11:35:19
0

Я думаю, что @janw полностью прав в этом вопросе, но мне не удалось заставить одну вещь работать. Ян добавляет кнопку медиатеки с помощью:

do_action( 'media_buttons', 'default_featured_image' );

и затем перехватывает стандартное действие с помощью:

jQuery('#default_featured_image_button').click(function () {...

Проблема, с которой я столкнулся, заключается в том, что при таком добавлении кнопки медиатеки ссылке не присваивается id "default_featured_image_button". Фактически, никакой id вообще не добавляется к вставленной ссылке. Вот что я сделал, чтобы заставить это работать.

Я добавил эту строку в свою функцию обратного вызова метабокса сразу после поля ввода:

<input id="upload_logo_button" type="button" value="Изображение из медиатеки" class="button-secondary" />

Затем я подключил свой пользовательский jQuery-файл и файл стилей thickbox, также в файле 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;
    });

    // пользователь вставляет файл в пост.
    // пользовательский код выполняется только если процесс был начат с помощью вышеуказанного кода
    // window.send_to_editor(html) — это стандартный способ обработки полученных данных в WordPress

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

Обратите внимание, что я использовал переменные для хранения имени и id поля ввода, которое находится непосредственно перед ссылкой, вызывающей jQuery. Таким образом, этот код можно использовать многократно на одной странице. Вам просто нужно присвоить класс всем кнопкам или использовать индивидуальные id для кнопок в вашем jQuery, как это сделал я. Надеюсь, это поможет кому-то так же, как ответ Яна помог мне.

13 мар. 2013 г. 21:48:56
0

Я знаю, что это старый пост, но просто хочу поделиться своими находками:

Чтобы открыть редактор медиафайлов, мы вызываем эту функцию:

wp.media.editor.open();

Редактор медиафайлов по сути проверяет наличие редактора tinyMCE (window.tinymce), затем Quicktags (window.QTags), чтобы передать им контент.

В моём подходе для получения контента я присвоил window.QTags пользовательский объект, который имеет метод insertContent():

var newObject = {
  insertContent: function(html){
    // извлекаем источник изображения
    $(html).find('img').attr('src');
  }
}

// присваиваем newObject в свойство window.QTags
window.QTags = newObject;

Ссылка: phpxref

28 нояб. 2015 г. 13:00:09