Як я можу додати вкладку "Вставити з 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.