Utilizzare il caricatore multimediale di Wordpress 3.5 in una meta box?

12 dic 2012, 02:37:57
Visualizzazioni: 19.3K
Voti: 16

È possibile farlo?

Mi piace molto come funziona il nuovo caricatore. Immagino che abbia a che fare con una chiamata jQuery come faceva il metodo precedente.

MODIFICA

Questo è il codice che sto attualmente utilizzando

jQuery(document).ready(function($) {
$('.custom_upload_image_button').click(function() {
    imageField = $(this).prev('input');
    tb_show('', 'media-upload.php?type=image&TB_iframe=true');
});
window.send_to_editor = function(html) {
    imgurl = $(html).attr('href');
    $(imageField).val(imgurl);
    tb_remove();
};
$('.clear_field').click(function() {
    var defaultImage = jQuery(this).parent().siblings('.custom_default_image').text();
    jQuery(this).parent().siblings('.custom_upload_image').val('');
    return false;
});
});
0
Tutte le risposte alla domanda 5
4

Per iniziare, ecco le funzioni di base e le override che conosco attualmente. Potrebbero esserci soluzioni migliori, ma ho avuto solo due giorni con la versione 3.5:

// apri modal - collega questo al tuo pulsante
    if ( typeof wp !== 'undefined' && wp.media && wp.media.editor )
        wp.media.editor.open( ##unique_id_here## );

// backup della funzione send originale
   original_send = wp.media.editor.send.attachment;

// nuova funzione send
   wp.media.editor.send.attachment = function( a, b) {
       console.log(b); // b contiene tutte le informazioni sull'allegato
       // o qualunque cosa tu voglia fare con i dati a questo punto
       // la funzione originale effettua una chiamata ajax per recuperare il tag html dell'immagine e fa qualcos'altro
    };

// wp.media.send.to.editor attiverà automaticamente window.send_to_editor per compatibilità all'indietro

// backup originale di window.send_to_editor
   window.original_send_to_editor = window.send_to_editor; 

// override di window.send_to_editor
   window.send_to_editor = function(html) {
       // l'argomento html potrebbe non essere utile in questo caso
       // usa i dati da var b (allegato) qui per fare la tua chiamata ajax o inviare i dati ai campi di input definiti, ecc.
   }

Questa non è una risposta completa e funzionante. Devi definire e tenere traccia dei tuoi campi di input da solo, ecc. Questo è solo per farti iniziare. Se hai domande più specifiche, chiedi pure.

E assicurati di riassegnare le funzioni originali quando il tuo script è terminato.


Estratto dai commenti:

Come posso ascoltare l'evento di chiusura della lightbox?

// aggiungi listener: 
wp.media.view.Modal.prototype.on('close', function(){ console.log('triggered close'); }
12 dic 2012 08:35:42
Commenti

Grazie! Tuttavia, non riesco a farlo funzionare. Ho incollato sopra quello che stavo usando per il vecchio caricatore multimediale, nel caso possa aiutare.

souporserious souporserious
12 dic 2012 20:16:30

Ipstenu e il team di supporto hanno creato una lista principale dei problemi (http://wordpress.org/support/topic/troubleshooting-wordpress-35-master-list?replies=4) segnalati per WordPress 3.5. Questo thread non è pensato per avere feedback dagli utenti ma è un thread curato che evidenzia rapidamente i problemi noti segnalati insieme alle istruzioni su come risolverli.

Tara Tara
12 dic 2012 22:24:13

Come posso ascoltare l'evento di chiusura del lightbox? Devo attivare una funzione personalizzata se qualcuno non sceglie una nuova immagine

Xaver Xaver
13 dic 2012 18:34:56

// aggiungi listener: wp.media.view.Modal.prototype.on('close', function(){ console.log('triggered close'); }

ungestaltbar ungestaltbar
14 dic 2012 00:16:23
1

Ecco un piccolo tutorial su come utilizzare il caricatore multimediale di WP 3.5 nelle opzioni del tema. Questa è la soluzione che ho trovato e funziona perfettamente per me. Fatemi sapere se trovate una soluzione migliore.

Ecco come ho implementato il codice nelle opzioni del mio tema:

jQuery(document).ready(function($){
  $('.stag-metabox-table .button').click(function(e){
  var send_attachment_bkp = wp.media.editor.send.attachment;
  var button = $(this);
  var id = button.attr('id').replace('_button', '');
  wp.media.editor.send.attachment = function(props, attachment){
    $("#"+id).val(attachment.url);
    wp.media.editor.send.attachment = send_attachment_bkp;
  }

  wp.media.editor.open(button);
  return false;

  });
});

Aggiornamento

Questo codice funziona solo nella pagina di modifica degli articoli. Per farlo funzionare nella pagina delle opzioni del tema è necessario aggiungere wp_enqueue_media();

13 dic 2012 09:05:45
Commenti

e se permettessi solo la selezione di una singola immagine e non multipla?

Mehul Kaklotar Mehul Kaklotar
6 mar 2015 17:06:21
2

Sto facendo quasi la stessa cosa, non è ancora pronto ma funziona:

nel php:

<input id="default_featured_image" type="text" size="100" name="default_featured_image" value="<?php echo esc_attr( $value ); ?>" />
<?php
do_action( 'media_buttons', 'default_featured_image' ); // il secondo argomento è lo stesso dell'id del `<input>`

Il javascript:

jQuery('#default_featured_image_button').click(function () {
    var formfield = jQuery('#default_featured_image').attr('name');
    tb_show('', 'media-upload.php?type=image&amp;TB_iframe=true');
    return false;
});

window.send_to_editor = function (html) {
    var imgurl = jQuery('img', html).attr('src');
    console.log(jQuery('img', html));
    console.log(html);
    console.log(imgurl);
    // imposta l'URL come valore
    jQuery('#default_featured_image').val(imgurl);
    tb_remove();
};

Questo ti permetterà di caricare e inviare l'URL dell'immagine (di qualsiasi dimensione) all'elemento <input>.
Sto cercando di implementarlo come impostazione e funziona, l'unica cosa che mi serve ora è un modo affidabile per inviare l'ID dell'allegato al <input>

14 dic 2012 15:32:01
Commenti

Grazie milleeeeeeeeeeeee!!!! Finalmente ha funzionato dopo 2 giorni di disperata ricerca della soluzione!!! Grazie infinite!!!

Devner Devner
25 feb 2013 09:24:00

potresti dare un'occhiata al codice sorgente nel mio plugin: http://wordpress.org/extend/plugins/default-featured-image/

janw janw
25 feb 2013 11:35:19
0

Penso che @janw abbia fatto un ottimo lavoro, ma non sono riuscito a far funzionare una cosa. Jan inserisce il pulsante della media library utilizzando:

do_action( 'media_buttons', 'default_featured_image' );

e poi previene l'azione predefinita con:

jQuery('#default_featured_image_button').click(function () {...

Il problema che ho riscontrato è che inserire un pulsante media in questo modo non assegna un id "default_featured_image_button" al link. In realtà non aggiunge alcun id al link inserito. Ecco cosa ho fatto per farlo funzionare.

Ho aggiunto questa linea alla mia funzione di callback del meta box, subito dopo il mio campo di input:

<input id="upload_logo_button" type="button" value="Immagine dalla Media Library" class="button-secondary" />

Poi ho caricato il mio file jQuery personalizzato e il file CSS thickbox, sempre nel file functions.php, usando:

add_action('admin_enqueue_scripts', 'jhsir_load_image_set_js');

function jhsir_load_image_set_js() {
    wp_enqueue_script( 'jhsir_image_set_script', get_stylesheet_directory_uri() . '/js/image-set.js', array('jquery','media-upload','thickbox') );
    wp_enqueue_style( 'thickbox' );
}

Infine, il mio file image-set.js conteneva il seguente codice:

jQuery(document).ready(function($) {

    var formfield = null;

    $('#upload_logo_button, #upload_background_button').click(function() {

        $('html').addClass('Image');

        formfield = $(this).prev('input').attr('name');  
        formfield_id = $(this).prev('input').attr('id'); 

        tb_show( '', 'media-upload.php?type=image&TB_iframe=true' );
        return false;
    });

    // l'utente inserisce il file nel post.
    // esegui il codice personalizzato solo se l'utente ha avviato il processo con il metodo sopra
    // window.send_to_editor(html) è il modo normale con cui WordPress gestisce i dati ricevuti

    window.original_send_to_editor = window.send_to_editor;
    window.send_to_editor = function( html ) {
        var fileurl;

        if(formfield != null) {
            fileurl = $( 'img', html).attr('src');

            $( "#" + formfield_id ).val(fileurl);

            tb_remove();

            $('html').removeClass('Image');
            formfield = null;
        } else {
            window.original_send_to_editor(html);
        }
    };
});

Noterete che ho utilizzato delle variabili per memorizzare il nome e l'id del campo di input che si trova appena prima del link che richiama il jQuery. In questo modo, questo codice può essere utilizzato più volte nella stessa pagina. Basterebbe assegnare una classe a tutti i pulsanti o utilizzare id individuali per i pulsanti nel tuo jQuery, come ho fatto io. Spero che questo possa aiutare qualcuno come la risposta di Jan ha aiutato me.

13 mar 2013 21:48:56
0

So che questo è un post vecchio, ma voglio condividere le mie scoperte:

Per aprire l'editor multimediale, chiamiamo questa funzione

wp.media.editor.open();

l'editor multimediale fondamentalmente verificherà la presenza dell'editor tinyMCE (window.tinymce), poi i Quicktags (window.QTags), per passare il contenuto.

Per il mio approccio per ottenere il contenuto, ho assegnato window.QTags con un oggetto personalizzato, che ha un metodo insertContent():

var newObject = {
  insertContent: function(html){
    // per estrarre il percorso dell'immagine
    $(html).find('img').attr('src');
  }
}

// assegna il newObject alla proprietà window.QTags
window.QTags = newObject;

Riferimento: phpxref

28 nov 2015 13:00:09