Ajouter un bouton de shortcode à fermeture automatique à TinyMCE dans WP 4.6


11

Je suis familier avec la création de shortcodes à fermeture automatique comme:

// shortcode
function wpse_shortcode_example( $wpse_atts ) {

    // Attributes
    $wpse_atts = shortcode_atts(
        array(
            'foo' => 'bar',
            'width' => '100%',
            'height' => 'auto',
        ),
        $wpse_atts,
        'wpse'
    );

    // Return
    return '<embed 
             src="' . $wpse_atts['src'] . '"
             width="' . $wpse_atts['width'] . '"
             height="' . $wpse_atts['height'] . '";

}
add_shortcode( 'wpse', 'wpse_shortcode_example' );

mais je voudrais commencer à les ajouter au TinyMCE. J'ai fait plusieurs recherches mais tous les résultats de recherche sont datés ou utilisent une approche qui n'est plus recommandée:

Je sais que le développeur en est encore à ses débuts, mais le manuel du plugin ne parle que brièvement de TinyMCE Enhanced Shortcodes et de l' API Shortcode et add_shortcode()ne mentionne pas TinyMCE.

Cela m'amène donc à ma question. Quelle est la procédure de base pour transformer un shortcode à fermeture automatique en bouton cliquable dans l'éditeur TinyMCE?


Donc, vous voulez dire comment créer un bouton dans l'éditeur TinyMCE qui injecte un shortcode à fermeture automatique dans le contenu?
birgire

1
@birgire Oui, je voudrais connaître les bases de l'intégration d'un bouton personnalisé dans TinyMCE qui ajoutera le shortcode au post visuel.
DᴀʀᴛʜVᴀᴅᴇʀ

1
Avez-vous vérifié la grande réponse ici de @bueltge?
birgire

@birgire non il n'est pas revenu de ma recherche mais c'est un bon Q&A
DᴀʀᴛʜVᴀᴅᴇʀ

Réponses:


14

Nous commençons par ajouter le bouton TinyMCE personnalisé:

function add_mce_button_custom_em() {
    // check user permissions
    if ( !current_user_can( 'edit_posts' ) && !current_user_can( 'edit_pages' ) ) {
        return;
    }
    // check if WYSIWYG is enabled
    if ( 'true' == get_user_option( 'rich_editing' ) ) {
        add_filter( 'mce_external_plugins', 'add_tinymce_plugin_custom_em' );
        add_filter( 'mce_buttons', 'register_mce_button_custom_em' );
    }
}
add_action('admin_head', 'add_mce_button_custom_em');

Ensuite, nous déclarons et enregistrons le nouveau bouton:

// Declare script for new button
function add_tinymce_plugin_custom_em( $plugin_array ) {
    $plugin_array['custom_em'] = get_template_directory_uri() .'/plug/custom-em/custom-em.js';
    return $plugin_array;
}

// Register new button in the editor
function register_mce_button_custom_em( $buttons ) {
    array_push( $buttons, 'custom_em' );
    return $buttons;
}

Enfin, nous décidons quels boutons (plus sur les boutons peuvent être trouvés dans la mise en forme du contenu ) que nous voulons afficher. Évidemment, si vous avez UX en tête, vous n'en afficheriez que quelques-uns, par exemple:

// TinyMCE: TinyMCE choose which buttons you want to display
function myformatTinyMCE( $in ) {
    $in['toolbar1'] = 'styleselect,bold,custom_em,blockquote,hr,aligncenter,link,unlink,spellchecker,undo,removeformat';
    return $in;
}
add_filter( 'tiny_mce_before_init', 'myformatTinyMCE' );

Comme vous pouvez le voir dans la add_tinymce_plugin_custom_emfonction, nous déclarons un fichier javascript à l'intérieurget_template_directory_uri() .'/plug/custom-em/custom-em.js'

Créez donc le custom-em.jsfichier, puis vous avez deux façons de procéder.

Vous pouvez soit utiliser le format de shortcode suivant, [shortcode foo="" bar=""]soit [shortcode][/shortcode].

Commençons par le [shortcode foo="" bar=""]format:

(function() {
    tinymce.create('tinymce.plugins.custom_em', {
        init : function(ed, url) {
            ed.addButton('custom_em', {
                title : 'Custom EM',
                image : url+'/images/btn_custom_em.png',
                onclick : function() {
                    ed.execCommand(
                        "mceInsertContent",
                        false,
                        "[shortcode foo=\"\" bar=\"\"]"
                    );
                }
            });
        }
    });
    tinymce.PluginManager.add('custom_em', tinymce.plugins.custom_em);
})(); 

Comme vous pouvez le voir, nous utilisons une image comme icône de bouton. Vous pouvez changer cela en texte comme indiqué dans l'exemple ci-dessous.

Ce qui suit est ce que nous utilisons sur notre propre plate-forme, il englobe la sélection dans <em class="whatever">hello world</em>:

(function() {
    tinymce.PluginManager.add('custom_em', function( editor, url ) {

        editor.on('init', function(e) {
            this.formatter.register('thetarget', {
                inline : 'em',
                classes : 'whatever'
            });
        });

        editor.addButton('custom_em', {
            text: 'Custom EM',
            icon: false,
            onclick : function() {
                var contents = editor.selection.getContent(),
                tags = jQuery(jQuery.parseHTML(contents)).find('em.whatever').andSelf();
                editor.formatter.toggle('thetarget');
            }
        });
    });
})(jQuery);

Veuillez publier les résultats et effectuer des modifications. TinyMCE est un fléau et nécessite des maux de tête mais peut être résolu de manière collaborative.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.