মিডিয়া ব্যতীত অন্য সংলাপগুলির জন্য কি wp.media.editor মডেলটিকে পুনরায় ব্যবহার করা সম্ভব?


30

সম্প্রসারণ করতে: আমি আমার নিজস্ব কাস্টম ডায়ালগের একটি মডেল খুলতে মিডিয়া সম্পাদক না হয়ে একই মডেল কোড / উপস্থিতি (ডাব্লুপি.মিডিয়া.মোডাল, ডাব্লুপি.মিডিয়া.ফোকাস ম্যানেজার হিসাবে ব্যবহৃত) ব্যবহার করতে চাই। অতীতে, আমি এই ধরণের জিনিসটির জন্য পুরুবাক্স ব্যবহার করেছি, তবে wp.media.Modal মডেলগুলির জন্য ভবিষ্যতের পথ হিসাবে উপস্থিত বলে মনে হচ্ছে - এটি দুর্দান্ত দেখাচ্ছে বলে উল্লেখ করা উচিত নয়।

আমি জেএস উত্সটি কিছুটা দেখেছি এবং কয়েকটি সম্ভাব্য সমাধান নিয়ে এসেছি:

  1. মিডিয়া-ভিউ.জেজেড কোডটি "ধার" করুন এবং এটি আমার প্লাগইনে ব্যবহার করুন।
  2. "প্রসারিত করুন" wp.media.Modal (এটি সর্বোপরি একটি ব্যাকবোন ভিউ)।
  3. একটি কাস্টম বাস্তবায়ন, jQueryUI, ইত্যাদি তৈরি করুন
  4. কেবল ছেড়ে দিন এবং পুরুবাক্স ব্যবহার করুন।

Pণ নেওয়া wp.media.Model.extend ({tend) ব্যবহারের চেয়ে কিছুটা কম বিপজ্জনক বলে মনে হয়, তবে অপচয়হীন। আমি jQueryUI এর মডেলগুলির একটি বড় অনুরাগী নই, তবে এটি কাজটি সম্পন্ন করবে। একই সময়ে, আমি মডেলগুলির একটি কাস্টম বাস্তবায়ন করতে পারি (বা এটিকে অন্য কোনও স্ত্রীর উপর ভিত্তি করে)।

মনে হচ্ছে আমি স্পষ্ট কিছু মিস করছি: অন্য কেউ কি এটিকে বন্ধ করে দিয়েছে বা নতুন মিডিয়া লাইব্রেরির মডেল কোডটি "পুনরায় ব্যবহারের অনুমতি দেওয়ার জন্য" খুব নতুন "?


3
দেখে মনে হচ্ছে আপনি এটি চেষ্টা করেই মিস করছেন। আমি # 2 এর জন্য যাবার পরামর্শ দিচ্ছি: সম্ভবত সবচেয়ে পরিষ্কার এবং সবচেয়ে চ্যালেঞ্জিং / মজাদার, এবং এটির মতো মনে হচ্ছে আপনি ব্যাকবোনকে ঘিরে আপনার উপায়টি জানেন।
মনট্রিলিস্ট

2
আপনার অনুসন্ধান ভাগ করুন!
পল

Github.com/ericandrewlewis/wp-media-javascript-guide এ আকর্ষণীয় প্লাগইন / টিউটোরিয়াল - জাভাস্ক্রিপ্ট শক্তিশালী WP মিডিয়া জন্য ইন্টারেক্টিভ ডকুমেন্টেশন
jgraup

উত্তর:


12

দেরিতে উত্তর এবং সম্পাদনা। দাবি অস্বীকার: নিম্নলিখিতটি কোনও অনুলিপি এবং পেস্ট-টোগো কোড নয়।

মোটামুটি নকশা

আমি অন্য যে কোনও কিছুর জন্য মিডিয়া মডেলটির অপব্যবহার করার চেষ্টা করি নি, এখানে আমি বর্তমানে করছি এমন একটি প্রকল্পের অংশ বিচ্ছিন্ন করে স্কেচ করা একটি সংক্ষিপ্ত বিবরণ। এটি উদাহরণস্বরূপ প্রস্তুত নয় , তবে এটি আপনাকে যথেষ্ট পরিমাণে কাছে এনে দেবে। কেবল মন্তব্যগুলি সাবধানে পড়ুন এবং আপনার অবজেক্টগুলিতে নিম্নলিখিত পিএইচপি বাস্তবায়ন করুন।

পিএইচপি

আমাদের কনস্ট্রাক্টরে আমরা আমাদের স্ক্রিপ্টগুলি নিবন্ধভুক্ত করি, তথ্য এবং একটি মিডিয়া বোতাম ধারণ করে এমন মেটা বাক্স যুক্ত করি, অতিরিক্ত মাইম টাইপগুলিতে ফিল্টার করি (যেমন জিপ) এবং অতিরিক্ত ডেটা সংরক্ষণের যত্ন নেওয়া:

public function __construct()
{
    add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );

    foreach( $this->post_types as $post_type )
        add_action( "add_meta_boxes_{$post_type}", array( $this, 'add_meta_box' ) );

    add_filter( 'media_view_settings', array( $this, 'filter_media_view_settings' ), 10, 2 );

    add_action( 'wp_insert_post_data', array( $this, 'wp_insert_post_data' ), 10, 2 );
}

আপনার যদি কোনও নির্দিষ্ট পৃষ্ঠায় সেই স্ক্রিপ্টের প্রয়োজন না হয় তবে আপনার গর্ভপাত বন্ধ রয়েছে তা নিশ্চিত করুন। এটি স্মৃতি সংরক্ষণ করে, অনুরোধের সময় এবং আপনার ইনস্টলেশন পরিষ্কার রাখতে সহায়তা করে।

public function enqueue_scripts( $page )
{
    if (
        ! in_array( $page, array( 'post.php', 'post-new.php' ) )
        # Assuming that there's a class property array that holds post types we want to add to
        # OR ! in_array( get_current_screen()->post_type, array_keys( $this->post_types ) )
    )
        return;

    wp_enqueue_media();
    wp_enqueue_script(
        'wpse_media_modal',
        plugins_url( 'assets/js/media-modal.js', dirname( __FILE__ ) ),
        array(
            # 'jquery',
            'media-views'
        ),
        null,
        true
    );
    wp_localize_script(
        'wpse_media_modal',
        'wpse_obj',
        $this->get_media_props()
    );
}

তারপরে আমরা মেটা বক্স যুক্ত করব। ফাংশনের অভ্যন্তরে আমরা $postঅবজেক্ট post_typeপ্রোপার্টিটির উপর নির্ভর করতে পারি , যা নতুন পোস্টের জন্যও সেট করা হবে। যেহেতু আমরা ইতিমধ্যে কনস্ট্রাক্টরে কলব্যাকগুলি যথাযথ প্রাসঙ্গিক হুকগুলিতে নিবন্ধভুক্ত করেছি, আমরা পোস্টের ধরণের যেই পোস্টের সাথে আসে তা কেবল গ্রহণ করতে পারি।

public function add_meta_box( $post )
{
    add_meta_box(
        'wprd_upload',
        __( 'Upload', 'our_textdomain' ),
        array( $this, 'render_content' ),
        $post->post_type,
        'advanced',
        'default',
        array()
    );
}

অতিরিক্ত মাইমির প্রকারগুলি

কেবল এমন একটি অ্যারে ফেলুন যা মিডিয়া মডেলের ডিফল্ট এমআইএমআই টাইপগুলিকে ওভাররাইড করে বা যুক্ত করে। আপনি পাশাপাশি অন্যান্য সেটিংস যুক্ত বা ওভাররাইড করতে পারেন। var_dump( $settings );কলব্যাক কী সরবরাহ করে তা দেখতে কেবল । এছাড়াও নিশ্চিত করুন যে আমরা ভুল পোস্টের ধরণে বাধা দিচ্ছি না।

public function filter_media_view_settings( $settings, $post )
{
    if ( ! in_array( $post->post_type, array_keys( $this->post_types ) ) )
        return $settings;

    $settings['mimeTypes'] += array( 'application/zip' );

    return $settings;
}

বিষয়বস্তু রেন্ডার

public function render_content()
{
    $props = array(
        'modalTitle'      => __( 'Select ZIP Archives', 'our_textdomain' ),

        // The following data is what we will access later
        // SomeIDfromLocalizedScriptOBJ
        'buttonID'        => 'open-media-lib',
        'buttonClass'     => 'open-media-button',
        'buttonText'      => __( 'Add ZIP', 'our_textdomain' ),
        'buttonDataText'  => __( 'Select', 'our_textdomain' ),
        'buttonDataTitle' => __( 'Select Whatever', 'our_textdomain' ),

        'mimeTypes'       => array(
            $zip => __( 'ZIP Archive', 'our_textdomain' ),
        ),
    );

    wp_nonce_field( plugin_basename( __FILE__ ), $this->nonce_name );
    ?>
    <input type="button"
           class="button <?php echo $props['buttonClass']; ?>"
           id="<?php echo $props['buttonID']; ?>"
           value="<?php echo $props['buttonText']; ?>"
           data-title="<?php echo $props['buttonDataTitle']; ?>"
           data-button-text="<?php echo $props['buttonDataText']; ?>" />
}

তথ্য সংরক্ষণ করুন

শেষ পর্যন্ত আমরা নিশ্চিত করি যে আমাদের ডেটা সঠিকভাবে সংরক্ষণ হয়েছে এবং তা পরীক্ষা করা হবে। সমস্ত esc_*()ফাংশন, টাইপকাস্টিং, ননসেস এবং কী না ব্যবহার করুন।

public function wp_insert_post_data( $data, $post_array )
{
    if (
        ! in_array( $post_array['post_type'], array_keys( $this->post_types ) )
        # OR ( defined( 'DOING_AUTOSAVE' ) AND DOING_AUTOSAVE )
        OR ! isset( $_POST[ $this->nonce_name ] )
        OR ! wp_verify_nonce( $_POST[ $this->nonce_name ], plugin_basename( __FILE__ ) )
    )
        return $data;

    $post_array['zip'] = array_map( 'array_filter', $post_array['zip'] );

    $id = $post_array['ID'];
    update_post_meta(
        $id,
        'zip',
        $post_array['zip'],
        get_post_meta( $id, 'zip' )
    );

    return $data;
}

চূড়ান্ত নোট, জেএস উদাহরণ শুরুর আগে: কোডটি একটি বর্তমান প্রকল্পের বাইরে বিচ্ছিন্ন । সুতরাং এটি যেমন - ইতিমধ্যে উল্লিখিত হয়েছে - ডিফল্টরূপে কাজ করবে না! এটি কেবল গাইড এবং অন্য কিছু নয়।

জাভাস্ক্রিপ্ট

জাভাস্ক্রিপ্ট নিজেই বেশ সোজা এগিয়ে। না. তবে আপনি দেখতে পাচ্ছেন, আমি ফাংশনটিতে কাস্টম লোকালাইজড স্ক্রিপ্ট অবজেক্ট হিসাবে jQuery উভয়ই ইনজেক্ট করছি। সেখান থেকে, আপনার যা প্রয়োজন যুক্তি যুক্ত করতে হবে। বিভিন্ন রাজ্য এবং কলব্যাকের জন্য প্রাথমিক পরিবেশ এবং সরবরাহ console.log()রয়েছে।

var ds = ds || {};

( function( $, obj ) {
    var media;

    ds.media = media = {};

    _.extend( media, {
        view: {},
        controller: {}
    } );

    media.buttonID    = '#' + obj.buttonID,

    _.extend( media, {
        frame: function() {
            if ( this._frame )
                return this._frame;

            var states = [
                new wp.media.controller.Library(),
                new wp.media.controller.Library( {
                    id:                 'image',
                    title:              'Images',
                    priority:           20,
                    searchable:         false,
                    library:            wp.media.query( { type: 'image' } ),
                    multiple:           true
                } ),
                /*new wp.media.controller.Library( {
                    id:                 'video',
                    title:              'Video',
                    priority:           40,
                    library:            wp.media.query( { type: 'video' } ),
                    multiple:           false,
                    contentUserSetting: false // Show the Upload Files tab.
                } ),*/
                new wp.media.controller.Library( {
                    id:                 obj.SomeIDfromLocalizedScriptOBJ,
                    title:              obj.SomeTitlefromLocalizedScriptOBJ,
                    priority:           30,
                    searchable:         true,
                    // filterable:         'uploaded',
                    library:            wp.media.query( { type: obj.SomeMIMETypesfromLocalizedScriptOBJ } ),
                    multiple:           true
                    // contentUserSetting: true
                } ),
            ];

            this._frame = wp.media( {
                // className: 'media-frame no-sidebar',
                states: states
                // frame: 'post'
            } );

            this._frame.on( 'open', this.open );

            this._frame.on( 'ready', this.ready );

            this._frame.on( 'close', this.close );

            this._frame.on( 'menu:render:default', this.menuRender );

            this._frame.state( 'library' ).on( 'select', this.select );
            this._frame.state( 'image' ).on( 'select', this.select );
            this._frame.state( obj.ZIPTabID ).on( 'select', this.select );

            return this._frame;
        },

        open: function() {
            console.log( 'Frame opened' );
        },

        ready: function() {
            console.log( 'Frame ready' );
        },

        close: function() {
            console.log( 'Frame closed' );
        },

        menuRender: function( view ) {
            /* view.unset( 'library-separator' );
            view.unset( 'embed' );
            view.unset( 'gallery' ); */
        },

        select: function() {
            var settings = wp.media.view.settings,
                selection = this.get( 'selection' );

            selection.map( media.showAttachmentDetails );
        },

        showAttachmentDetails: function( attachment ) {
            // This function normally is used to display attachments
            // Handle removal of rows
            media.removeAttachmentRow( /* some var */ );
        },

        removeAttachmentRow: function( row ) {
            // Remove stuff callback
        },

        init: function() {
            // Open media frame
            $( media.buttonID ).on( 'click.media_frame_open', function( e ) {
                e.preventDefault();

                media.frame().open();
            } );
        }
    } );

    $( media.init );
} )( jQuery, wpse_obj );

টিউটোরিয়াল

ডব্লিউপি ৩.৩ মিডিয়া ম্যানেজারের লেখক - ডমিনিক শিলিং মিডিয়া মডেলগুলির জন্য একটি সেট ডেমো লিখেছেন। আপনি এগুলি গিটহাবে দেখতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.