Ulepsz Media Manager for Gallery

29

Chciałbym ulepszyć Media Editor, po WordPress 3.5, w widoku galerii.
Chcę dodać nowe pole wyboru po prawej stronie i wysłać wybrane wartości do shortcode galerii.

wprowadź opis zdjęcia tutaj

Myślę, że funkcja wp.media.gallerywwp-includes/js/media-editor.js jest domyślną funkcją wstawiania krótkiego kodu galerii.

Chcę dodać nowy parametr, a wartości parametru pochodzą z pola wyboru w Menedżerze multimediów.

Grałem z różnych źródeł, szczególnie z tego pytania , ale Backbone jest dla mnie bardzo nowy i nie rozumiem, jak to działa. Grałem też z hakiem print_media_templates, ale brak widoku w widoku Media.

Jakich haków powinienem użyć?

bueltge
źródło

Odpowiedzi:

21

Małe źródło, być może wtyczka do stworzenia rozwiązania. Na początku część php zawiera javascript dla przycisku wewnątrz Media Managera. Jest bardziej użyteczną odpowiedzią, ale odpowiedź @One Trick Pony została stworzona, a właściwy kierunek i rozwiązanie JS.

Zobacz wynik na obrazku: wprowadź opis zdjęcia tutaj

Wynikowy kod krótki, jeśli rozmiar nie jest domyślny: wprowadź opis zdjęcia tutaj

Hak print_media_templatesto właściwe miejsce na włączenie przycisku, znaczników. Został także skolejkowany skrypt, istnieje rozwiązanie do dodania kontrolek.

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 );

Następującym źródłem jest javascript, na przykładowym źródle pliku php, plik 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 );
bueltge
źródło
4
Brawo! Wygląda na to, że WordPress Development buduje bazę wiedzy o nowej Bibliotece Mediów w szybszym tempie niż główni programiści;) A jak nie, @OneTrickPony po raz kolejny ujawnia kolejny ze swoich sztuczek magicznych toreb, wyrazy uznania dla obu!
brasofilo
Fantastyczny. Dalsze pytanie: czy istnieje prosty sposób na ukrycie domyślnych atrybutów w krótkim kodzie? Więc[gallery type="thumbnail" ids="1,2"] staje [gallery ids="1,2"]? Dodaję niestandardowy atrybut wtyczki, aby opcjonalnie zmienić galerię w pokaz slajdów. Chciałbym ukryć ten atrybut, gdy mówi tylko o pokazaniu normalnej galerii WP. Więc po dezaktywacji wtyczki pozostawia mniej cruft.
kitchin
Myślę, że to lepszy sposób na dodanie nowego pytania na ten temat. Krótki kod znajduje się poza q / a tutaj.
bueltge
@bueltge, czy mogę prosić o spojrzenie na niestandardowe pytanie związane z polem tutaj: wordpress.stackexchange.com/questions/265852/... ?
Istiaque Ahmed
19

Jeśli naprawdę chcesz używać szablonów kręgosłupa, Twój hak jest poprawny.

Używałbym jQuery do wstawienia szablonu HTML zamiast zastępowania template()funkcji widoku ustawień galerii. Ale chyba już to wiesz, więc opublikuję wersję 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

});
onetrickpony
źródło