Як я можу додати вкладку "Вставити з URL-адреси" на спеціальний завантажувач медіа-файлів 3,5?


17

Я вставив завантажувач медіа WP 3.5 у віджет, запустивши цей JavaScript, коли натиснути кнопку:

var frame = wp.media( {
    title       : 'Widget Uploader',
    multiple    : false,
    library     : { type : 'image' },
    button      : { text : 'Select Image' }
} );

frame.on( 'close', function() {
    var attachments = frame.state().get( 'selection' ).toJSON();
    imageWidget.render( widget_id, widget_id_string, attachments[0] );
} );

frame.open();
return false;

Це дає мені спосіб, який має вкладки "Завантажити файли" та "Медіатека", але я також хочу, щоб він мав вкладку "Вставити з URL", яку ви отримуєте, коли натискаєте кнопку "Додати медіа" під час редагування публікації. / сторінку.

введіть тут опис зображення

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

Чи може хтось вказати мені в правильному напрямку? Чи є параметр, який я можу передати wp.media (), щоб включити його, або я повинен використовувати один із вбудованих представлень / моделей, що включає його?


Можливо, підказка у хакі-рішенні, але натискаючи кнопку "Вибрати файли", ви можете вставити URL-адресу в провідник файлів, що відкриється, а не в файл.
— Вік

Ви говорите про режим відкритого файлу операційної системи? У Fedora це не працює для мене, тому це може залежати від ОС. Це також для розподіленого плагіна, тому інтерфейс користувача повинен бути інтуїтивно зрозумілим.
— Ян Данн

так правильно, він працює на деяких ОС.
— Вік

Відповіді:


10

Я копав вихідний код з аналогічної причини; Я хотів би додати "Налаштування відображення вкладень" до кадру "select" за замовчуванням. Наскільки я можу сказати, цього неможливо зробити, передавши параметри до wp.media (), як ми всі хотіли. На даний момент у wp.media є два кадри ("опублікувати" та "вибрати"), а представлення, що супроводжують їх, задані.

Я зараз розглядаю підхід - розширити media.view.mediaFrame для створення нового кадру (на основі кадру "select"), який включає частини потрібного мені подання. Якщо я працюю над цим, я опублікую код.

Редагувати:

Ian, я отримав функцію, яку я хотів працювати, і знадобився певний час, щоб розібратися у вашому. wp.media () не настільки модульний, як міг би бути. Він приймає лише значення "select" і "post" для кадру, за замовчуванням "select", тому ви не можете створити новий об'єкт кадру. Натомість вам потрібно розгорнути один із двох об'єктів кадру (усе це у /wp-includes/js/media-views.js), що також є своєрідним незграбним. Додавання частини інтерфейсу користувача - це етапний процес. Ви можете почати з Select і додати, але для вашого я вирішив почати з коду в кадрі Post і забрати галерею. Ось мій код, який працює, але не є дуже перевіреним. Напевно, також є місце для впорядкування.

wp.media.view.MediaFrame.Select = wp.media.view.MediaFrame.Select.extend({

            initialize: function() {
                wp.media.view.MediaFrame.prototype.initialize.apply( this, arguments );

                _.defaults( this.options, {
                    multiple:  true,
                    editing:   false,
                    state:    'insert'
                });

                this.createSelection();
                this.createStates();
                this.bindHandlers();
                this.createIframeStates();
            },

            createStates: function() {
                var options = this.options;

                // Add the default states.
                this.states.add([
                    // Main states.
                    new wp.media.controller.Library({
                        id:         'insert',
                        title:      'Insert Media',
                        priority:   20,
                        toolbar:    'main-insert',
                        filterable: 'image',
                        library:    wp.media.query( options.library ),
                        multiple:   options.multiple ? 'reset' : false,
                        editable:   true,

                        // If the user isn't allowed to edit fields,
                        // can they still edit it locally?
                        allowLocalEdits: true,

                        // Show the attachment display settings.
                        displaySettings: true,
                        // Update user settings when users adjust the
                        // attachment display settings.
                        displayUserSettings: true
                    }),

                    // Embed states.
                    new wp.media.controller.Embed(),
                ]);


                if ( wp.media.view.settings.post.featuredImageId ) {
                    this.states.add( new wp.media.controller.FeaturedImage() );
                }
            },

            bindHandlers: function() {
                // from Select
                this.on( 'router:create:browse', this.createRouter, this );
                this.on( 'router:render:browse', this.browseRouter, this );
                this.on( 'content:create:browse', this.browseContent, this );
                this.on( 'content:render:upload', this.uploadContent, this );
                this.on( 'toolbar:create:select', this.createSelectToolbar, this );
                //

                this.on( 'menu:create:gallery', this.createMenu, this );
                this.on( 'toolbar:create:main-insert', this.createToolbar, this );
                this.on( 'toolbar:create:main-gallery', this.createToolbar, this );
                this.on( 'toolbar:create:featured-image', this.featuredImageToolbar, this );
                this.on( 'toolbar:create:main-embed', this.mainEmbedToolbar, this );

                var handlers = {
                        menu: {
                            'default': 'mainMenu'
                        },

                        content: {
                            'embed':          'embedContent',
                            'edit-selection': 'editSelectionContent'
                        },

                        toolbar: {
                            'main-insert':      'mainInsertToolbar'
                        }
                    };

                _.each( handlers, function( regionHandlers, region ) {
                    _.each( regionHandlers, function( callback, handler ) {
                        this.on( region + ':render:' + handler, this[ callback ], this );
                    }, this );
                }, this );
            },

            // Menus
            mainMenu: function( view ) {
                view.set({
                    'library-separator': new wp.media.View({
                        className: 'separator',
                        priority: 100
                    })
                });
            },

            // Content
            embedContent: function() {
                var view = new wp.media.view.Embed({
                    controller: this,
                    model:      this.state()
                }).render();

                this.content.set( view );
                view.url.focus();
            },

            editSelectionContent: function() {
                var state = this.state(),
                    selection = state.get('selection'),
                    view;

                view = new wp.media.view.AttachmentsBrowser({
                    controller: this,
                    collection: selection,
                    selection:  selection,
                    model:      state,
                    sortable:   true,
                    search:     false,
                    dragInfo:   true,

                    AttachmentView: wp.media.view.Attachment.EditSelection
                }).render();

                view.toolbar.set( 'backToLibrary', {
                    text:     'Return to Library',
                    priority: -100,

                    click: function() {
                        this.controller.content.mode('browse');
                    }
                });

                // Browse our library of attachments.
                this.content.set( view );
            },

            // Toolbars
            selectionStatusToolbar: function( view ) {
                var editable = this.state().get('editable');

                view.set( 'selection', new wp.media.view.Selection({
                    controller: this,
                    collection: this.state().get('selection'),
                    priority:   -40,

                    // If the selection is editable, pass the callback to
                    // switch the content mode.
                    editable: editable && function() {
                        this.controller.content.mode('edit-selection');
                    }
                }).render() );
            },

            mainInsertToolbar: function( view ) {
                var controller = this;

                this.selectionStatusToolbar( view );

                view.set( 'insert', {
                    style:    'primary',
                    priority: 80,
                    text:     'Select Image',
                    requires: { selection: true },

                    click: function() {
                        var state = controller.state(),
                            selection = state.get('selection');

                        controller.close();
                        state.trigger( 'insert', selection ).reset();
                    }
                });
            },

            featuredImageToolbar: function( toolbar ) {
                this.createSelectToolbar( toolbar, {
                    text:  'Set Featured Image',
                    state: this.options.state || 'upload'
                });
            },

            mainEmbedToolbar: function( toolbar ) {
                toolbar.view = new wp.media.view.Toolbar.Embed({
                    controller: this,
                    text: 'Insert Image'
                });
            }

    });

Це поєднує код з wp.media.view.MediaFrame.Post з кодом від media.view.MediaFrame.Select, регулюючи той факт, що він виконується поза вихідної області застосування. Значення тексту - це різні кнопки, і ви можете посилатися на власний об’єкт локалізації, якщо хочете. Значення 'filterable' у конструкторі Бібліотеки (у createStates ()) визначає, які типи носіїв підтримуватимуться.

Після того, як ви розширили об’єкт Select за допомогою цього підходу, просто інстанціруйте його таким же чином, як ви є зараз, і додайте свій власний обробник, коли вибрано зображення. Вставка з URL-адреси може призвести до іншої події, ніж під час вибору із завантаженого носія. Напевно, краще було б спочатку створити свій кадр, а потім розширити його, щоб будь-які інші медіакадри на сторінці не вплинули, але я цього не пробував.

Сподіваюся, що це допомагає-


Дякую Брендан, це той самий висновок, до якого я прийшов. Я спробував розширити рамку "Пост", але не зміг швидко працювати, і мені довелося застосувати інший підхід. Я хотів би побачити код, якщо ви працюєте.
— Ian Dunn

@IanDunn Це питання вже кілька років, але я знаходжу, що мені потрібно таке саме рішення. Чи підтримували ви рішення протягом років, які перевірені та зрілі? Або знайти плагін або інше рішення, яке відповідало б вашим потребам? Якщо у вас є поточний код або рішення, чи можете ви розмістити його як оновлену відповідь? Спасибі!
— користувач658182

1

З огляду вихідного коду, схоже, що загальний модальний носій не підтримує "Вставити з URL". Один із способів мені вдалося отримати цю вкладку - вказати тип кадру "повідомлення":

var frame = wp.media( {
                            title       : 'Widget Uploader',
                            multiple    : false,
                            library     : { type : 'image' },
                            button      : { text : 'Select Image' },
                            frame      : 'post'
                        } );

Мінус - вказаний заголовок модалу ігнорується.


Це частково працює, але кнопка пише "Вставити в пост" і насправді нічого не надсилає, ймовірно, тому, що очікує бути на посаді, а не у віджеті. Він також додає вкладку Створити галерею, яку я не хочу, тому що їх не можна вставити у віджет.
— Ian Dunn

0

Справа в тому, що на цій вкладці повертається зовнішня URL-адреса, яку слід безпосередньо вставити в допис, тоді як віджет повинен повертати ідентифікатор медіа. В основному зовнішнє зображення потрібно перенести на сервер.

Подивіться, як / чи плагін Grab & Save робить те, що ви хочете. ( через )


Незалежно від того, плагін робить це чи ні, мені було б цікаво подивитися, як це робить, чи можете ви допрацювати?
— Tom J Nowell

Чи не спрацьовує медіатека завантаження зовнішнього зображення на локальний сервер для вас? Навіть якщо це не так, головне питання: Як змусити вкладку навіть відображатися в першу чергу?
— Ян Данн

Я перевірив, і медіатека не завантажує / не додає зображення, вставлені з URL-адрес; вона просто посилається безпосередньо на них. Це не дуже стосується питання, однак я просто переймаюся тим, як додати вкладку "Вставити з URL" в модальну.
— Ян Данн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.