দেরিতে উত্তর এবং সম্পাদনা। দাবি অস্বীকার: নিম্নলিখিতটি কোনও অনুলিপি এবং পেস্ট-টোগো কোড নয়।
মোটামুটি নকশা
আমি অন্য যে কোনও কিছুর জন্য মিডিয়া মডেলটির অপব্যবহার করার চেষ্টা করি নি, এখানে আমি বর্তমানে করছি এমন একটি প্রকল্পের অংশ বিচ্ছিন্ন করে স্কেচ করা একটি সংক্ষিপ্ত বিবরণ। এটি উদাহরণস্বরূপ প্রস্তুত নয় , তবে এটি আপনাকে যথেষ্ট পরিমাণে কাছে এনে দেবে। কেবল মন্তব্যগুলি সাবধানে পড়ুন এবং আপনার অবজেক্টগুলিতে নিম্নলিখিত পিএইচপি বাস্তবায়ন করুন।
পিএইচপি
আমাদের কনস্ট্রাক্টরে আমরা আমাদের স্ক্রিপ্টগুলি নিবন্ধভুক্ত করি, তথ্য এবং একটি মিডিয়া বোতাম ধারণ করে এমন মেটা বাক্স যুক্ত করি, অতিরিক্ত মাইম টাইপগুলিতে ফিল্টার করি (যেমন জিপ) এবং অতিরিক্ত ডেটা সংরক্ষণের যত্ন নেওয়া:
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 );
টিউটোরিয়াল
ডব্লিউপি ৩.৩ মিডিয়া ম্যানেজারের লেখক - ডমিনিক শিলিং মিডিয়া মডেলগুলির জন্য একটি সেট ডেমো লিখেছেন। আপনি এগুলি গিটহাবে দেখতে পারেন ।