Risposta in ritardo e modifica. Dichiarazione di non responsabilità: il seguente non è un codice copia e incolla-togo.
Schizzo
Dato che non ho mai provato ad abusare del modale multimediale per qualcos'altro, ecco una breve panoramica, disegnata tracciando una parte da un progetto in cui mi trovo attualmente. E ' non è un pronto ad andare esempio, ma dovrebbe portare abbastanza vicino. Leggi i commenti attentamente e implementa il seguente PHP nei tuoi oggetti.
PHP
Nel nostro costruttore registriamo i nostri script, aggiungiamo meta box che contengono informazioni e un pulsante multimediale, filtriamo in altri tipi MIME (per esempio ZIP) e ci preoccupiamo di salvare i dati aggiuntivi:
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 );
}
Assicurati di interrompere se non hai bisogno di quello script in una determinata pagina. Ciò consente di risparmiare memoria, richiedere tempo e aiuta a mantenere pulita l'installazione.
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()
);
}
Quindi aggiungiamo la meta box. All'interno della funzione, possiamo fare affidamento sulla proprietà $post
objects post_type
, che verrà impostata anche per i nuovi post. Dato che abbiamo già registrato i callback nel costruttore negli hook contestuali appropriati, possiamo semplicemente prendere qualunque tipo di post.
public function add_meta_box( $post )
{
add_meta_box(
'wprd_upload',
__( 'Upload', 'our_textdomain' ),
array( $this, 'render_content' ),
$post->post_type,
'advanced',
'default',
array()
);
}
Tipi MIME aggiuntivi
È sufficiente inserire un array che sostituisce o aggiunge i tipi MIME predefiniti del Media Modale. Puoi anche aggiungere o sovrascrivere altre impostazioni. Solo var_dump( $settings );
per vedere cosa offre il callback. Assicurati inoltre di non intercettare il tipo di post errato.
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;
}
Rendering del contenuto
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']; ?>" />
}
Salva i dati
Finalmente ci assicuriamo che i nostri dati vengano salvati correttamente e saranno controllati. Usa tutte le esc_*()
funzioni, il typecasting, i nonces e cosa no.
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;
}
Nota finale, prima di passare all'esempio JS: il codice viene estratto da un progetto corrente. Quindi, come già accennato, non funzionerà di default! È solo una guida e nient'altro.
Javascript
Il javascript stesso è piuttosto semplice. Non. Ma come puoi vedere, sto iniettando sia jQuery come oggetto di script localizzato personalizzato nella funzione. Da lì in poi, dovrai aggiungere qualsiasi logica tu possa avere bisogno. Vengono forniti console.log()
i dintorni di base per diversi stati e richiamate e sono presenti.
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 );
Esercitazioni
Dominik Schilling - l'autore del WP 3.5 media manager - ha scritto una serie di demo per modali multimediali. Puoi vederli su GitHub .