“URL에서 삽입”탭을 사용자 지정 3.5 미디어 업 로더에 추가하려면 어떻게해야합니까?


17

버튼을 클릭 할 때이 JavaScript를 실행하여 WP 3.5 미디어 업 로더를 위젯에 삽입했습니다.

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에서 삽입"탭이 필요합니다. /페이지.

여기에 이미지 설명을 입력하십시오

나는 웹을 파고 소스 코드를 읽고 업 로더의 백엔드에 대한 Daryl Koopersmith의 프리젠 테이션을 보면서 몇 시간을 보냈지 만 이해할 수 없었습니다.

누군가 올바른 방향으로 나를 가리킬 수 있습니까? wp.media ()에 전달하여 포함시킬 수있는 매개 변수가 있습니까, 아니면 포함 된 내장 뷰 / 모델 중 하나를 사용해야합니까?


해키 솔루션에 대한 단서 일 수도 있지만 "파일 선택"을 클릭하면 파일 위치 대신 열리는 파일 탐색기에 URL을 붙여 넣을 수 있습니다.
Wyck

운영 체제의 Open File 모달에 대해 이야기하고 있습니까? Fedora에서는 작동하지 않으므로 OS에 따라 다를 수 있습니다. 이것은 분산 플러그인을위한 것이므로 UI는 직관적이어야합니다.
Ian Dunn

예, 일부 OS에서 작동합니다.
Wyck

답변:


10

비슷한 이유로 소스 코드를 파고 들었습니다. "첨부 파일 표시 설정"을 기본 "선택"프레임에 추가하고 싶습니다. 내가 알 수있는 한, 우리가 원하는 것처럼 wp.media ()에 매개 변수를 전달 하여이 작업을 수행 할 수 없습니다. wp.media에는 ​​현재 두 개의 프레임 ( "post"및 "select")이 있으며 그와 함께 제공되는보기는 사전 설정되어 있습니다.

지금보고있는 방법은 media.view.mediaFrame을 확장하여 필요한 뷰 부분이 포함 된 새 프레임 ( "선택"프레임 기반)을 만드는 것입니다. 이 작업을 수행하면 코드를 게시합니다.

편집하다:

이안, 나는 내가 일하고 싶었던 기능을 얻었고 당신의 것을 알아내는 데 시간이 걸렸다. wp.media ()는 모듈식이 아닙니다. 프레임의 경우 'select'및 'post'값만 허용하며 'select'가 기본값이므로 새 프레임 객체를 만들 수 없습니다. 대신 두 프레임 객체 중 하나 (/wp-includes/js/media-views.js에 있음)를 확장해야합니다. UI의 일부를 추가하는 것은 여러 단계 프로세스입니다. Select와 add로 시작할 수는 있지만 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의 코드를 결합하여 이것이 원래 범위 밖에서 실행된다는 사실을 조정합니다. 텍스트 값은 다양한 버튼이며 원하는 경우 고유 한 현지화 개체를 참조 할 수 있습니다. 라이브러리 생성자 (createStates ())의 'filterable'값은 지원할 미디어 유형을 결정합니다.

이 방법으로 Select 객체를 확장 한 후에는 현재와 같은 방식으로 인스턴스화하고 이미지를 선택할 때 사용자 지정 처리기를 추가하면됩니다. URL에서 삽입은 업로드 된 미디어에서 선택할 때와 다른 이벤트를 발생시킬 수 있습니다. 실제로 프레임을 먼저 인스턴스화 한 다음 확장하여 페이지의 다른 미디어 프레임에 영향을 미치지 않도록하는 것이 더 좋지만 시도하지는 않았습니다.

희망이 도움이


고마워요 Brendan, 그것은 내가했던 것과 같은 결론입니다. Post 프레임을 확장하려고 시도했지만 빠르게 작동하지 않아 다른 접근 방식을 취해야했습니다. 그래도 코드가 작동하면 코드를보고 싶습니다.
Ian Dunn

@IanDunn이 질문은 몇 살이지만 같은 해결책이 필요하다는 것을 알았습니다. 몇 년 동안 테스트를 거쳐 완성 된 솔루션을 유지 했습니까? 또는 귀하의 요구에 맞는 플러그인 또는 기타 솔루션을 찾으십니까? 최신 코드 나 솔루션이있는 경우 업데이트 된 답변으로 게시 할 수 있습니까? 감사!
user658182

1

examinig에서 소스 코드는 일반 미디어 모달이 "URL에서 삽입"을 지원하지 않는 것 같습니다. 해당 탭을 얻을 수있는 한 가지 방법은 "포스트"프레임 유형을 지정하는 것입니다.

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

단점은 지정된 모달의 제목이 무시된다는 것입니다.


그것은 부분적으로 작동하지만 버튼은 "포스트에 삽입"이라고 표시하고 실제로는 아무것도 제출하지 않습니다. 아마도 위젯 내부가 아니라 포스트에있을 것으로 예상되기 때문입니다. 또한 위젯에 삽입 할 수 없기 때문에 원하지 않는 갤러리 만들기 탭을 추가합니다.
Ian Dunn

0

요점은 해당 탭이 게시물에 직접 삽입되는 외부 URL을 반환하고 위젯은 미디어 ID를 반환해야한다는 것입니다. 기본적으로 외부 이미지는 서버로 트랜스 로딩되어야합니다.

플러그인 Grab & Save 가 원하는 것을 / 어떻게 수행하는지 확인 하십시오 . ( 를 통해 )


플러그인이 작동하든 그렇지 않든, 어떻게 작동 하는지 알고 싶을 것입니다 .
Tom J Nowell

미디어 라이브러리가 외부 이미지를 로컬 서버로 다운로드하는 것을 처리하지 않습니까? 그렇지 않은 경우에도 주요 질문은 탭을 처음에 표시하는 방법은 무엇입니까?
Ian Dunn

확인했는데 미디어 라이브러리가 URL에서 삽입 된 이미지를 다운로드 / 첨부하지 않습니다. 단지 그들에게 직접 연결됩니다. 그러나 실제로 질문과 관련이 없지만 URL에서 삽입 탭을 모달에 추가하는 방법과 관련이 있습니다.
Ian Dunn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.