ฉันจะเพิ่มแท็บ“ แทรกจาก 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" ที่คุณได้รับเมื่อคุณคลิกที่ปุ่ม "เพิ่มสื่อ" ในขณะที่แก้ไขโพสต์ /หน้า.

ป้อนคำอธิบายรูปภาพที่นี่

ฉันใช้เวลาสองสามชั่วโมงขุดหาข้อมูลในเว็บอ่านซอร์สโค้ดและดูการนำเสนอของ Daryl Koopersmith ในแบ็กเอนด์ของผู้อัปโหลดแต่ไม่สามารถเข้าใจได้

ใครบางคนชี้ให้ฉันในทิศทางที่ถูกต้อง? มีพารามิเตอร์ที่ฉันสามารถส่งไปยัง wp.media () เพื่อรวมมันไว้หรือฉันควรใช้หนึ่งในมุมมอง / รูปแบบในตัวที่รวมมันหรือไม่?


อาจเป็นเบาะแสในโซลูชันแฮ็ค แต่เมื่อคุณคลิก "เลือกไฟล์" คุณสามารถวาง url ลงในไฟล์ explorer ที่เปิดแทนตำแหน่งไฟล์
Wyck

คุณกำลังพูดถึงคำสั่ง Open File ของระบบปฏิบัติการหรือไม่? ไม่ได้ผลสำหรับฉันใน Fedora ดังนั้นอาจขึ้นอยู่กับระบบปฏิบัติการ สิ่งนี้มีไว้สำหรับปลั๊กอินแบบกระจายเช่นกันดังนั้น UI จึงจำเป็นต้องเข้าใจง่าย
Ian Dunn

ใช่ถูกต้องมันใช้งานได้กับระบบปฏิบัติการบางระบบ
Wyck

คำตอบ:


10

ฉันขุดผ่านซอร์สโค้ดด้วยเหตุผลที่คล้ายกัน; ฉันต้องการเพิ่ม "การตั้งค่าการแสดงผลไฟล์แนบ" ในเฟรม "เลือก" เริ่มต้น เท่าที่ฉันสามารถบอกได้สิ่งนี้ไม่สามารถทำได้โดยการส่งพารามิเตอร์ไปที่ wp.media () ตามที่เราต้องการ wp.media ปัจจุบันมีสองเฟรม ("โพสต์" และ "เลือก") และมุมมองที่มาพร้อมกับพวกเขาเป็นที่ตั้งไว้ล่วงหน้า

วิธีการที่ฉันดูในตอนนี้คือการขยาย media.view.mediaFrame เพื่อสร้างเฟรมใหม่ (ขึ้นอยู่กับกรอบ "เลือก") ที่มีส่วนต่างๆของมุมมองที่ฉันต้องการ ถ้าฉันได้งานนี้ฉันจะโพสต์รหัส

แก้ไข:

เอียนฉันได้รับคุณลักษณะที่ฉันต้องการใช้งานและใช้เวลาพอสมควรในการหาข้อมูลของคุณ wp.media () ไม่ได้เป็นแบบแยกส่วนเท่าที่ควรจะเป็น ยอมรับเฉพาะค่า 'select' และ 'โพสต์' สำหรับเฟรมโดยมี 'select' เป็นค่าเริ่มต้นดังนั้นคุณจึงไม่สามารถสร้างวัตถุเฟรมใหม่ได้ แต่คุณต้องขยายวัตถุเฟรมหนึ่งในสองรายการ (ทั้งหมดนี้อยู่ใน /wp-includes/js/media-views.js) ซึ่งเป็นประเภทที่ค่อนข้างเป็น clunky การเพิ่มส่วนหนึ่งของ UI เป็นกระบวนการที่มีหลายขั้นตอน คุณสามารถเริ่มต้นด้วยเลือกและเพิ่ม แต่สำหรับคุณฉันเลือกที่จะเริ่มต้นด้วยรหัสในโพสต์เฟรมและนำเนื้อหาแกลเลอรี่ออกไป นี่คือรหัสของฉันทำงานได้ แต่ไม่ผ่านการทดสอบอย่างมาก อาจเป็นห้องสำหรับเพรียวลมบางเกินไป

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 เลือกการปรับเพื่อดูว่ามีการดำเนินการนอกขอบเขตดั้งเดิม ค่าของข้อความคือปุ่มต่าง ๆ และคุณสามารถอ้างอิงวัตถุการแปลของคุณเองได้หากคุณต้องการ ค่า 'filterable' ในตัวสร้างไลบรารี (ใน createStates ()) กำหนดประเภทสื่อที่จะได้รับการสนับสนุน

เมื่อคุณขยายวัตถุ Select ด้วยวิธีนี้เพียงแค่สร้างอินสแตนซ์แบบเดียวกับที่คุณอยู่ในปัจจุบันและเพิ่มตัวจัดการแบบกำหนดเองของคุณเมื่อเลือกรูปภาพ ส่วนแทรกจาก URL อาจเริ่มต้นเหตุการณ์ที่แตกต่างจากเมื่อเลือกจากสื่อที่อัปโหลด มันน่าจะดีกว่าถ้าคุณสร้างอินสแตนซ์ของเฟรมก่อนแล้วค่อยขยายเพื่อให้เฟรมสื่ออื่น ๆ ในหน้านั้นไม่ได้รับผลกระทบ แต่ฉันไม่ได้ลองเลย

หวังว่าจะช่วย -


ขอบคุณเบรนแดนนั่นเป็นข้อสรุปเดียวกับที่ฉันได้มา ฉันพยายามขยายกรอบโพสต์ แต่ไม่สามารถทำงานได้อย่างรวดเร็วและต้องใช้วิธีการอื่น ฉันชอบที่จะเห็นรหัสถ้าคุณทำให้มันทำงานได้
Ian Dunn

@IanDunn คำถามนี้มีอายุหลายปี แต่ฉันพบว่าฉันต้องการโซลูชันเดียวกัน คุณรักษาวิธีการแก้ปัญหาในช่วงหลายปีที่ผ่านการทดสอบและเป็นผู้ใหญ่หรือไม่ หรือค้นหาปลั๊กอินหรือโซลูชันอื่นที่ตรงกับความต้องการของคุณ หากคุณมีรหัสปัจจุบันหรือวิธีแก้ไขคุณสามารถโพสต์เป็นคำตอบที่อัพเดตได้หรือไม่? ขอบคุณ!
user658182

1

จากการตรวจสอบซอร์สโค้ดดูเหมือนว่า modal media ทั่วไปไม่สนับสนุน "Insert from URL" วิธีหนึ่งที่ฉันสามารถรับแท็บนั้นได้คือการระบุประเภทเฟรม "โพสต์":

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

ข้อเสียคือชื่อของ modal ที่ระบุจะถูกละเว้น


บางส่วนใช้งานได้ แต่ปุ่มแจ้งว่า "แทรกลงในโพสต์" และไม่ได้ส่งอะไรเลยอาจเป็นเพราะคาดว่าจะอยู่ในโพสต์แทนที่จะอยู่ในวิดเจ็ต นอกจากนี้ยังเพิ่มแท็บสร้างคลังภาพซึ่งฉันไม่ต้องการเพราะไม่สามารถแทรกเข้าไปในวิดเจ็ต
Ian Dunn

0

ประเด็นก็คือแท็บนั้นจะคืนค่า URL ภายนอกที่จะแทรกในโพสต์โดยตรงในขณะที่วิดเจ็ตควรจะส่งคืนรหัสสื่อ โดยทั่วไปภาพภายนอกจะต้องมีการถ่ายโอนไปยังเซิร์ฟเวอร์

ดูว่าปลั๊กอินGrab & Saveทำในสิ่งที่คุณต้องการหรือไม่ ( ผ่าน )


ไม่ว่าปลั๊กอินจะทำหรือไม่ฉันสนใจที่จะดูว่ามันทำงานอย่างไร
Tom J Nowell

ไลบรารีสื่อจัดการการดาวน์โหลดอิมเมจภายนอกไปยังเซิร์ฟเวอร์ภายในเครื่องสำหรับคุณหรือไม่ แม้ว่ามันจะไม่เป็นเช่นนั้นคำถามหลักก็คือ: คุณจะทำให้แท็บปรากฏตัวได้อย่างไรตั้งแต่แรก?
Ian Dunn

ฉันตรวจสอบแล้วและไลบรารีสื่อไม่ดาวน์โหลด / แนบรูปภาพที่แทรกจาก URL มันเพียงเชื่อมโยงโดยตรงกับพวกเขา นั่นไม่เกี่ยวข้องกับคำถามจริงๆ แต่ฉันแค่กังวลเกี่ยวกับวิธีเพิ่มแท็บแทรกจาก URL เข้ากับโมดอล
Ian Dunn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.