ปรับปรุง Media Manager สำหรับคลังภาพ


29

ฉันต้องการปรับปรุง Media Editor หลังจาก WordPress 3.5 ในมุมมองแกลเลอรี
ฉันต้องการเพิ่มฟิลด์เลือกใหม่ทางด้านขวาและส่งค่าที่เลือกไปยังรหัสย่อของคลังภาพ

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

ฉันคิดว่าฟังก์ชั่นwp.media.galleryในwp-includes/js/media-editor.jsเป็นฟังก์ชั่นเริ่มต้นเพื่อแทรกรหัสย่อของแกลเลอรี่

ฉันต้องการเพิ่มพารามิเตอร์ใหม่และค่าของพารามิเตอร์มาจากฟิลด์เลือกภายใน Media Manager

ฉันเล่นกับแหล่งข้อมูลที่แตกต่างกันโดยเฉพาะจากคำถามนี้แต่ Backbone นั้นใหม่มากสำหรับฉันและฉันไม่เข้าใจว่ามันทำงานอย่างไร ฉันเล่นด้วยตะขอprint_media_templatesแล้ว แต่ไม่มีผลลัพธ์ในมุมมองสื่อ

ฉันควรใช้ตะขออะไร

คำตอบ:


21

แหล่งข้อมูลขนาดเล็กอาจเป็นปลั๊กอินสำหรับสร้างโซลูชัน ตอนแรกส่วน php มีจาวาสคริปต์สำหรับปุ่มที่อยู่ใน Media Manager เป็นคำตอบที่ใช้งานได้มากกว่า แต่คำตอบของ @One Trick Pony นั้นถูกสร้างขึ้นมาและทิศทางที่ถูกต้องและวิธีแก้ปัญหาของ JS

เห็นผลในภาพ: ป้อนคำอธิบายรูปภาพที่นี่

รหัสย่อที่ได้รับมาหากขนาดไม่ใช่ขนาดเริ่มต้น: ป้อนคำอธิบายรูปภาพที่นี่

Hook print_media_templatesเป็นสถานที่ที่เหมาะสมสำหรับการรวมปุ่มมาร์กอัป นอกจากนี้ยังจัดคิวสคริปต์มีโซลูชันสำหรับการผนวกส่วนควบคุม

class Custom_Gallery_Setting {
    /**
     * Stores the class instance.
     *
     * @var Custom_Gallery_Setting
     */
    private static $instance = null;


    /**
     * Returns the instance of this class.
     *
     * It's a singleton class.
     *
     * @return Custom_Gallery_Setting The instance
     */
    public static function get_instance() {

        if ( ! self::$instance )
            self::$instance = new self;

        return self::$instance;
    }

    /**
     * Initialises the plugin.
     */
    public function init_plugin() {

        $this->init_hooks();
    }

    /**
     * Initialises the WP actions.
     *  - admin_print_scripts
     */
    private function init_hooks() {

        add_action( 'wp_enqueue_media', array( $this, 'wp_enqueue_media' ) );
        add_action( 'print_media_templates', array( $this, 'print_media_templates' ) );
    }


    /**
     * Enqueues the script.
     */
    public function wp_enqueue_media() {

        if ( ! isset( get_current_screen()->id ) || get_current_screen()->base != 'post' )
            return;

        wp_enqueue_script(
            'custom-gallery-settings',
            plugins_url( 'js/custom-gallery-setting.js', __FILE__ ),
            array( 'media-views' )
        );

    }

    /**
     * Outputs the view template with the custom setting.
     */
    public function print_media_templates() {

        if ( ! isset( get_current_screen()->id ) || get_current_screen()->base != 'post' )
            return;

        ?>
        <script type="text/html" id="tmpl-custom-gallery-setting">
            <label class="setting">
                <span>Size</span>
                <select class="type" name="size" data-setting="size">
                    <?php

                    $sizes = apply_filters( 'image_size_names_choose', array(
                        'thumbnail' => __( 'Thumbnail' ),
                        'medium'    => __( 'Medium' ),
                        'large'     => __( 'Large' ),
                        'full'      => __( 'Full Size' ),
                    ) );

                    foreach ( $sizes as $value => $name ) { ?>
                        <option value="<?php echo esc_attr( $value ); ?>" <?php selected( $value, 'thumbnail' ); ?>>
                            <?php echo esc_html( $name ); ?>
                        </option>
                    <?php } ?>
                </select>
            </label>
        </script>
        <?php
    }

}

// Put your hands up...
add_action( 'admin_init', array( Custom_Gallery_Setting::get_instance(), 'init_plugin' ), 20 );

แหล่งที่มาของการติดตามคือ javascript บนไฟล์ตัวอย่างใน php ซึ่งเป็นไฟล์ custom-gallery-setting.js

/**
 * Custom Gallery Setting
 */
( function( $ ) {
    var media = wp.media;

    // Wrap the render() function to append controls
    media.view.Settings.Gallery = media.view.Settings.Gallery.extend({
        render: function() {
            media.view.Settings.prototype.render.apply( this, arguments );

            // Append the custom template
            this.$el.append( media.template( 'custom-gallery-setting' ) );

            // Save the setting
            media.gallery.defaults.size = 'thumbnail';
            this.update.apply( this, ['size'] );
            return this;
        }
    } );
} )( jQuery );

4
ไชโย! ดูเหมือนว่าการพัฒนา WordPressกำลังสร้างฐานความรู้เกี่ยวกับ Media Library ใหม่ในอัตราที่เร็วกว่าผู้พัฒนาหลัก) และไม่เช่นนั้น @OneTrickPony อีกครั้งก็แสดงให้เห็นถึงเทคนิคกระเป๋าวิเศษของเขาอีกครั้ง!
brasofilo

น่าอัศจรรย์ คำถามติดตามผล: มีวิธีง่าย ๆ ในการระงับแอททริบิวต์เริ่มต้นในรหัสย่อหรือไม่ ดังนั้น[gallery type="thumbnail" ids="1,2"]จะกลายเป็น[gallery ids="1,2"]? ฉันกำลังเพิ่มแอตทริบิวต์ที่กำหนดเองสำหรับปลั๊กอินเพื่อเลือกที่จะเปลี่ยนแกลเลอรี่เป็นสไลด์โชว์ ฉันต้องการที่จะระงับคุณลักษณะเมื่อมันแค่บอกว่าจะแสดงแกลลอรี่ WP ปกติ ดังนั้นในการยกเลิกการใช้งานของปลั๊กอินมันจะทิ้งการ cruft น้อยลง
kitchin

ฉันคิดว่าเป็นวิธีที่ดีกว่าในการเพิ่มคำถามใหม่เกี่ยวกับหัวข้อนี้ รหัสย่ออยู่นอก q / a ที่นี่
bueltge

ความคิดที่ดี. wordpress.stackexchange.com/questions/165369/…
kitchin

@bueltge ฉันขอให้คุณดูคำถามที่เกี่ยวข้องกับฟิลด์ที่กำหนดเองได้ที่นี่: wordpress.stackexchange.com/questions/265852/ ...... ?
Istiaque Ahmed

19

หากคุณต้องการใช้เทมเพลต Backbone จริงๆแสดงว่าตะขอของคุณถูกต้อง

ฉันจะใช้ jQuery เพื่อแทรกเทมเพลต HTML แทนที่จะแทนที่template()ฟังก์ชันสำหรับมุมมองการตั้งค่าแกลเลอรี แต่ฉันเดาว่าคุณรู้อยู่แล้วดังนั้นฉันจะโพสต์เวอร์ชัน Backbone:

add_action('print_media_templates', function(){

  // define your backbone template;
  // the "tmpl-" prefix is required,
  // and your input field should have a data-setting attribute
  // matching the shortcode name
  ?>
  <script type="text/html" id="tmpl-my-custom-gallery-setting">
    <label class="setting">
      <span><?php _e('My setting'); ?></span>
      <select data-setting="my_custom_attr">
        <option value="foo"> Foo </option>
        <option value="bar"> Bar </option>        
        <option value="default_val"> Default Value </option>        
      </select>
    </label>
  </script>

  <script>

    jQuery(document).ready(function(){

      // add your shortcode attribute and its default value to the
      // gallery settings list; $.extend should work as well...
      _.extend(wp.media.gallery.defaults, {
        my_custom_attr: 'default_val'
      });

      // merge default gallery settings template with yours
      wp.media.view.Settings.Gallery = wp.media.view.Settings.Gallery.extend({
        template: function(view){
          return wp.media.template('gallery-settings')(view)
               + wp.media.template('my-custom-gallery-setting')(view);
        }
      });

    });

  </script>
  <?php

});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.