2014-10-08 11 views
5

Sto costruendo un plug-in per il pulsante tinymce per l'editor Wordpress (4). La finestra a comparsa in cui si apre il mio pulsante visualizza un modulo con diversi campi. Uno di questi è per selezionare un'immagine all'interno della libreria multimediale WP. Non riesco a capire come ottenere questo. Se ciò non è possibile, quale sarebbe il modo migliore per consentire all'utente di selezionare un'immagine memorizzata nella libreria multimediale WP da una finestra popup del plugin di tinymce?Open/Access Libreria multimediale WP dalla finestra popup del plugin tinymce

FYI, il plugin di tinymce inserisce uno shortcode con un'immagine src come attributo.

grazie!

risposta

4

Ho avuto lo stesso problema solo ora e ho trovato la soluzione, quindi la sto condividendo qui. Spero non sia troppo tardi.

Prima di poter utilizzare il pulsante WP Aggiungi supporto, è necessario accodare lo script necessario. Questo è facile, basta chiamare la funzione wp_enqueue_media() in questo modo:

add_action('admin_enqueue_scripts', 'enqueue_scripts_styles_admin'); 
function enqueue_scripts_styles_admin(){ 
    wp_enqueue_media(); 
} 

Questa chiamata modo da garantirvi sempre le librerie necessarie per utilizzare il tasto WP Media.

Naturalmente si dovrebbe anche avere gli elementi HTML per contenere l'URL caricato file multimediale/selezionato, qualcosa di simile:

<input type="text" class="selected_image" /> 
<input type="button" class="upload_image_button" value="Upload Image"> 

Il primo campo di testo conterrà l'URL del file multimediale, mentre la seconda è un pulsante per aprire la finestra popup multimediale stessa.

Poi, nel tuo jscript, avresti qualcosa di simile:

var custom_uploader; 

    $('.upload_image_button').click(function(e) { 
     e.preventDefault(); 

     var $upload_button = $(this); 

     //Extend the wp.media object 
     custom_uploader = wp.media.frames.file_frame = wp.media({ 
      title: 'Choose Image', 
      button: { 
       text: 'Choose Image' 
      }, 
      multiple: false 
     }); 

     //When a file is selected, grab the URL and set it as the text field's value 
     custom_uploader.on('select', function() { 
      var attachment = custom_uploader.state().get('selection').first().toJSON(); 
      $upload_button.siblings('input[type="text"]').val(attachment.url); 
     }); 

     //Open the uploader dialog 
     custom_uploader.open(); 

    }); 

Ora io non ho intenzione di spiegare ogni linea, perché non è così difficile da capire. La parte più importante è quella che usa l'oggetto wp per far funzionare tutti questi elementi.

La parte complicata è fare tutto questo in un popup TinyMCE (che è il problema che ho dovuto affrontare). Ho cercato hi e lo per la soluzione ed ecco cosa ha funzionato per me. Ma prima parlerò di quale problema ho incontrato per primo. Quando ho provato a implementarlo, ho riscontrato il problema "WP isdefinito" sul popup stesso. Per risolvere questo problema, basta passare l'oggetto WP allo script in questo modo:

(function() { 
tinymce.create('tinymce.plugins.someplugin', { 
    init : function(ed, url) { 
     // Register commands 
     ed.addCommand('mcebutton', function() { 
      ed.windowManager.open(
       { 
        file : url + '/editor_button.php', // file that contains HTML for our modal window 
        width : 800 + parseInt(ed.getLang('button.delta_width', 0)), // size of our window 
        height : 600 + parseInt(ed.getLang('button.delta_height', 0)), // size of our window 
        inline : 1 
       }, 
       { 
        plugin_url : url, 
        wp: wp 
       } 
      ); 
     }); 

     // Register buttons 
     ed.addButton('someplugin_button', {title : 'Insert Seomthing', cmd : 'mcebutton', image: url + '/images/some_button.gif' }); 
    } 
}); 

// Register plugin 
// first parameter is the button ID and must match ID elsewhere 
// second parameter must match the first parameter of the tinymce.create() function above 
tinymce.PluginManager.add('someplugin_button', tinymce.plugins.someplugin); 

})(); 

Quello che ci interessa è questa linea => "wp: wp". Questa linea garantisce che stiamo passando l'oggetto wp alla finestra pop-up (un iframe in realtà ...) che deve essere aperto quando clicchiamo sul pulsante tinymce. È possibile passare qualsiasi cosa alla finestra popup tramite questo oggetto (il 2 ° parametro del metodo ed.windowManager.open)!

Ultimo ma non meno importante si avrebbe dovuto riferimento che passava oggetto wp sul tuo javascript in questo modo:

var args = top.tinymce.activeEditor.windowManager.getParams(); 
    var wp = args.wp; 

Assicurati di farlo prima di chiamare/utilizzando l'oggetto WP.

Questo è tutto ciò che devi fare per farlo funzionare.Ha funzionato per me, spero che funzioni per te :)

1

So che è vecchio ma nel caso in cui qualcun altro si trovi nella stessa situazione, la soluzione di Paolo sopra funziona perfettamente ma non è necessario accodare wp_enqueue_media(); questo caricherà un gruppo di script, è possibile caricare solo 2 script:

wp_enqueue_script('jquery'); 
wp_enqueue_script('media-lib-uploader-js'); 
0

ho preso il codice di Paolo e semplificate in modo da non avere molti file da gestire. Inoltre, non sono riuscito a farlo funzionare in questo modo.

Quindi questa soluzione ha meno codice e utilizza solo un singolo file.

Basta mettere questo nel file js plugin TinyMCE:

(function(){ 
    tinymce.PluginManager.add('myCustomButtons', function(editor, url){ 
     editor.addButton('btnMedia', { 
      icon: 'image', 
      tooltip: 'Add an image', 
      onclick: function() { 
       editor.windowManager.open({ 
        title: 'Add an image', 
        body: [{ 
         type: 'textbox', 
         subtype: 'hidden', 
         name: 'id', 
         id: 'hiddenID' 
        }, 
        { 
         type: 'textbox', 
         name: 'text', 
         label: 'Text', 
         id: 'imageText' 
        }, 
        { 
         type: 'button', 
         text: 'Choose an image', 
         onclick: function(e){ 
          e.preventDefault(); 
          var hidden = jQuery('#hiddenID'); 
          var texte = jQuery('#imageText'); 
          var custom_uploader = wp.media.frames.file_frame = wp.media({ 
           title: 'Choose an image', 
           button: {text: 'Add an image'}, 
           multiple: false 
          }); 
          custom_uploader.on('select', function() { 
           var attachment = custom_uploader.state().get('selection').first().toJSON(); 
           hidden.val(attachment.id); 
           if(!texte.val()){ 
            if(attachment.alt) 
             texte.val(attachment.alt); 
            else if(attachment.title) 
             texte.val(attachment.title); 
            else 
             texte.val('See the image'); 
           } 
          }); 
          custom_uploader.open(); 
         } 
        }], 
        onsubmit: function(e){ 
         var image = '<button data-id="'+e.data.id+'">'+e.data.text+'</button>'; 
         editor.insertContent(image); 
        } 
       }); 
      } 
     }); 
    }); 
})(); 

Il risultato nel codice HTML frontend è un pulsante che ha l'ID dell'immagine in un attributo data-id, e un testo da visualizzare (l'alt dell'immagine, per impostazione predefinita, o il titolo o un testo che l'utente può scrivere).

Quindi, con il mio frontend js, otterrò l'immagine corrispondente con il suo ID e mostrarla in un popup ajax.

Con questa soluzione, si dispone di tutte le funzioni js in un singolo file e non è necessario accodare alcun script né creare un file php.

Problemi correlati