2012-12-03 9 views
11

Ho scritto uno shortcode e funziona come dovrebbe. Ora la parte difficile:Anteprima shortcode Wordpress in tinyMCE

Vorrei mostrare all'utente un'anteprima già nell'editor di tinyMCE. Caricamento CSS nell'editor non è un problema per me, ma mi piacerebbe sapere se è già possibile elaborare lo shortcode in TinyMCE.

Grazie!

+0

Se non trovi una risposta qui, probabilmente dovresti vedere come WordPress passa il tag [caption]: quando inserisci un'immagine con una didascalia, vedi l'immagine e la didascalia sottostante, ma in realtà è solo una codice corto. –

+0

grazie! Lo esaminerò domani quando non avrò niente qui. Speravo che ci potesse essere un filtro o un hook per eseguire gli shortcode nel backend :) –

+4

Ho dato un'occhiata veloce e sembra che tu possa probabilmente aggiungere un plugin TinyMCE personalizzato. Vedi ad esempio il codice del plugin [WpGallery] (http://core.trac.wordpress.org/browser/tags/3.4.2/wp-includes/js/tinymce/plugins/wpgallery/editor_plugin_src.js) tinyMCE. Fondamentalmente sembra che tinyMCE abbia un paio di hook che ti permettono di analizzare il contenuto prima che venga visualizzato e prima che venga salvato (su post-aggiornamento). Questi hook sono aggiunti in questo modo: 'ed.onBeforeSetContent.add (function (ed, o) {}' e 'ed.onPostProcess.add (function (ed, o) {}'. Spero che questo aiuti :) –

risposta

3

Lasciate che il codice parla: Metterò un codice per aggiungere un'icona visiva per parola il contenuto highlight (s) shortcode, e si può quindi realizzare qualsiasi altra shortcode che vuoi con la stessa logica,

 class spot_shortcodes { 

     function spot_shortcodes() 
{ 

    add_action('init', array(&$this, 'init')); 
} 
function init(){ 

    // Enable shortcodes in text widgets 
    add_filter('widget_text', 'do_shortcode'); 

    // Fix for large posts, http://core.trac.wordpress.org/ticket/8553 
    @ini_set('pcre.backtrack_limit', 500000); 
    // init process for button control 
    add_filter('tiny_mce_version', 'my_refresh_mce'); 

    // Add only in Rich Editor mode 
    if (get_user_option('rich_editing') == 'true') { 
    add_filter('mce_buttons_3', array(&$this, 'register_highlight_button')); 
    }  
} 

    // Add your button plugin js code to tinyMCE 
    // codex: wp_register_script($handle, $src, $deps, $ver, $in_footer); 
    wp_register_script('effects-highlight', SPOT_SHORTCODES_URL . '/js/jquery.effects.highlight.js', false ,SPOT_SHORTCODES_URL, true); 

    function add_youtube_button() { 

    // Don't bother doing this stuff if the current user lacks permissions 
    if (! current_user_can('edit_posts') && ! current_user_can('edit_pages')) 
    return; 

    // Add only in Rich Editor mode 
    if (get_user_option('rich_editing') == 'true') { 
    add_filter("mce_external_plugins", array(&$this, "add_youtube_tinymce_plugin")); 
    add_filter('mce_buttons', array(&$this, 'register_highlight_button')); 
    } 
} 

    // function to register you button to tinyMCE dashboard 
    function register_highlight_button($buttons) { 
    array_push($buttons, "|", 'highlight_button'); 
    return $buttons; 
} 

    function add_youtube_tinymce_plugin($plugin_array) { 

    // your icon image(highlight.png) which will be displayed in the tinyMCE dashboard 
    $plugin_array['highlight'] = SPOT_TINYMCE_URL . '/icons-lib-custom.js'; 

    return $plugin_array; 
} 

} // class end 
// Finally make an object from your button 
$spot_shortcodes = new spot_shortcodes(); 

nostro js codice per l'opzione del pulsante clou fanno file di un punto js messo il codice followin in esso e metterlo nella directory dei plugin TinyMCE

// dont forget to change the paths 
tinymce.create('tinymce.plugins.highlight', { 
    // creates control instances based on the control's id. 
    // our button's id is "highlight_button" 
    createControl : function(id, controlManageradel) { 
     if (id == 'highlight_button') { 
      // creates the button 
      var button = controlManageradel.createButton('highlight', { 
       title : 'Add a Hightlight Text', // title of the button 
       image :spotShortcodes.plugin_folder +"/tinymce/images/highlight.png", // path to the button's image 
       onclick : function() { 
        // triggers the thickhighlight 
        var width = jQuery(window).width(), H = jQuery(window).height(), W = (720 < width) ? 720 : width; 
        W = W - 80; 
        H = H - 84; 
        tb_show('Insert text box shortcode', '#TB_inline?width=' + W + '&height=' + H + '&inlineId=highlight-form'); 
       } 
      }); 
      return button; 
     } 
     return null; 
    } 
}); 

// registers the plugin. DON'T MISS THIS STEP!!! 
tinymce.PluginManager.add('highlight', tinymce.plugins.highlight); 
// executes this when the DOM is ready 
jQuery(function(){ 
    // creates a form to be displayed everytime the button is clicked 
    // you should achieve this using AJAX instead of direct html code like this 
    var form = jQuery('<div id="highlight-form"><table id="highlight-table" class="form-table" style="text-align: left">\ 
     \ 
      \ 
     <tr>\ 
     <th><label class="title" for="highlight-bg">Highlight color</label></th>\ 
      <td><select name="bg" id="highlight-bg">\ 
       <option value="#f02d33">Red</option>\ 
       <option value="#b6bbbd">Grey</option>\ 
       <option value="#3e3c3c">Darkgrey</option>\ 
       <option value="#99cc33">Lightgreen</option>\ 
       <option value="#6c8c2d">Darkgreen</option>\ 
       <option value="#0f5ac6">Blue</option>\ 
       <option value="#3cbcf7">Cyan</option>\ 
       <option value="#9219f8">Purple</option>\ 
       <option value="#fcc016">Yellow</option>\ 
       <option value="#f65e0e">Orange</option>\ 
      </select><br />\ 
     <div class="info"><small>Select box type.</small></div></td>\ 
     </tr>\ 
     <tr>\ 
     <th><label class="title" for="highlight-contet">Conent</label></th>\ 
      <td><textarea rows="7"\ cols="45"name="content" id="highlight-content">hightlight text</textarea>\ 
       <br />\ 
      <div><small>this text displayed in box.</small></div></td>\ 
     </tr>\ 
     </table>\ 
    <p class="submit">\ 
     <input type="button" id="highlight-submit" class="button-primary" value="Insert shortcode" name="submit" style=" margin: 10px 150px 50px; float:left;"/>\ 
    </p>\ 
    </div>'); 

    var table = form.find('table'); 
    form.appendTo('body').hide(); 

    // handles the click event of the submit button 
    form.find('#highlight-submit').click(function(){ 
     // defines the options and their default values 
     // again, this is not the most elegant way to do this 
     // but well, this gets the job done nonetheless 
     var options = { 
      'bg'  : '#f02d33', 
      'content' : 'hightlight text', 
      }; 

     var shortcode = '[highlight '; 

     for(var index in options) { 
      var value = table.find('#highlight-' + index).val(); 

      // attaches the attribute to the shortcode only if it's different from the default value 
      if (value !== options[index] & index !== 'content') 
       shortcode += ' ' + index + '="' + value + '"'; 
     } 

     shortcode += ']'+ value + '[/highlight]' 

     // inserts the shortcode into the active editor 
     tinyMCE.activeEditor.execCommand('mceInsertContent', 0, shortcode); 

     // closes Thickhighlight 
     tb_remove(); 
    }); 
}); 

spero che questo aiuto, mi darà risposte se volete qualsiasi altra spiegazione, grazie .

+1

Your wp_register_script (La linea sta generando un errore, credo che sia al di fuori di una funzione? –

+0

Informazioni su cosa wp_register_script() stai parlando? C'è solo una sua istanza e non è la mente che la cosa sia interna o esterna, puoi scrivere l'errore visualizzato, fammi indovinare: 1. vi danno questa costante SPOT_SHORTCODES_URL tuo valore personalizzato 2. È possibile sostituire la funzione con questo e provare questo:? define ('SPOT_SHORTCODES_URL', 'il tuo/personalizzato/Path'); definire ('SPOT_SHORTCODES_VER', '0.1'); wp_register_script ('effect-highlight', SPOT_SHORTCODES_URL. '/js/jquery.effects.highlight.js', false, SPOT_SHORTC ODES_VER, true); Grazie, fammi sapere se posso aiutarti di più, sarò felice per questo. –

+1

Non sono un esperto di TiniMCE ma non vedo da nessuna parte in questo codice come visualizzare l'anteprima dell'effetto highlight, che era la domanda principale. – sergio