Utilizzando Wordpress 3.5 Media Uploader in meta box?


16

È possibile farlo?

Adoro come funziona il nuovo uploader. Immagino che abbia a che fare con una chiamata jQuery come ha fatto l'altro modo.

MODIFICARE

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

Risposte:


9

Per iniziare, le funzioni di base e le sostituzioni per quanto ne so attualmente. Potrebbero esserci soluzioni migliori, ma ho avuto solo due giorni con 3.5:

// open modal - bind this to your button
    if ( typeof wp !== 'undefined' && wp.media && wp.media.editor )
        wp.media.editor.open( ##unique_id_here## );

// backup of original send function
   original_send = wp.media.editor.send.attachment;

// new send function
   wp.media.editor.send.attachment = function( a, b) {
       console.log(b); // b has all informations about the attachment
       // or whatever you want to do with the data at this point
       // original function makes an ajax call to retrieve the image html tag and does a little more
    };

// wp.media.send.to.editor will automatically trigger window.send_to_editor for backwards compatibility

// backup original window.send_to_editor
   window.original_send_to_editor = window.send_to_editor; 

// override window.send_to_editor
   window.send_to_editor = function(html) {
       // html argument might not be useful in this case
       // use the data from var b (attachment) here to make your own ajax call or use data from b and send it back to your defined input fields etc.
   }

Questa non è una risposta operativa completa. Devi definire e tenere traccia dei campi di input da solo, ecc. Questo dovrebbe iniziare. Se hai domande più concrete, basta chiedere.

E assicurati di riassegnare le funzioni originali al termine dello script.


Estratto dai commenti:

Come posso ascoltare l'evento di chiusura del lightbox?

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

Grazie! Non riesco però a farlo funzionare. Ho incollato quello che ho usato per il vecchio uploader multimediale qui sopra, se questo aiuta.
souporserious

Ipstenu e il team di supporto hanno messo insieme un elenco principale di problemi ( wordpress.org/support/topic/… ) segnalati per WordPress 3.5. Questo thread non intende avere alcun feedback da parte degli utenti, ma è un thread curato che evidenzia rapidamente i problemi noti segnalati e le istruzioni su come risolvere il problema.
Tara,

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

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

6

Ecco un piccolo tutorial su come utilizzare l'uploader multimediale WP 3.5 nelle opzioni del tema. Questo è quello che mi è venuto in mente e funziona perfettamente per me. Fammi sapere se trovi 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;

  });
});

Aggiornare

Questo codice funziona solo sulla pagina di modifica post. Per farlo funzionare nella pagina delle opzioni del tema è necessario aggiungerewp_enqueue_media();


cosa succede se si fornisce solo una selezione di immagini singole e non multiple?
Mehul Kaklotar,

3

Sto facendo quasi lo stesso, 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' ); // second argument is the same as the `<input>` id

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);
    // set the url as the value
    jQuery('#default_featured_image').val(imgurl);
    tb_remove();
};

Ciò ti consentirà di caricare e inviare l'URL dell'immagine (di qualsiasi dimensione) <input>all'elemento.
Sto provando a farlo come impostazione e funziona, solo thig che ho bisogno ora è un modo affidabile per inviare l'ID allegato al<input>


Grazie milleoooooooooooooooooo molto !!!! Questo alla fine ha funzionato dopo 2 giorni di caccia disperata per la soluzione !!! Grazie mille !!!
Devner,

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

3

Penso che @janw abbia capito bene, ma non sono riuscito a far funzionare una cosa. Jan inserisce il pulsante della libreria multimediale usando:

do_action( 'media_buttons', 'default_featured_image' );

e quindi impedisce l'azione predefinita usando:

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

Il problema che ho riscontrato è che l'inserimento di un pulsante multimediale in questo modo non assegna un ID di "default_featured_image_button" al link. In realtà non aggiunge alcun ID sul collegamento inserito. Quindi questo è quello che ho fatto per farlo funzionare.

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

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

Ho quindi accodato il mio file jquery personalizzato e il file css thickbox, anche nel mio 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' );
}

Finalmente il mio file image-set.js includeva quanto segue:

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

    // user inserts file into post.
    // only run custom if user started process using the above process
    // window.send_to_editor(html) is how wp normally handles the received data

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

Noterai che ho usato le variabili per memorizzare il nome e l'id del campo di input che è appena prima del collegamento che chiama jQuery. In questo modo questo codice può essere usato ripetutamente sulla stessa pagina. Dovresti semplicemente assegnare una classe a tutti i pulsanti o utilizzare i singoli ID per i pulsanti nel tuo jquery come ho fatto io. Spero che questo aiuti qualcuno come mi ha fatto la risposta di Jan.


0

So che questo è un vecchio post, ma voglio solo condividere i miei risultati:

Per aprire l'editor multimediale, chiamiamo questa funzione

wp.media.editor.open();

l'editor dei media sostanzialmente controllerà l'editor di tinyMCE (window.tinymce ), quindi Quicktags ( window.QTags), a cui passare il contenuto.

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

var newObject = {
  insertContent: function(html){
    // to extract the image source
    $(html).find('img').attr('src');
  }
}

// assign the newObject to window.QTags property
window.QTags = newObject;

Riferimento: phpxref

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.