Adicionar botão TinyMCE 4 personalizado, utilizável desde o WordPress 3.9-beta1

20

Como é possível adicionar um botão personalizado ao editor visual TinyMCE, versão 4 ?

Atualmente, encontrei essas perguntas e respostas com algumas dicas para o tópico, mas não uma solução ou um como. Mas não consigo encontrar um tutorial, documentação, perguntas e respostas para o tópico para adicionar um botão personalizado ao TinyMCE versão 4, incluído no WordPress desde a versão 3.9-beta1.

Objetivo

insira a descrição da imagem aqui

bueltge
fonte

Respostas:

24

O pequeno plug-in a seguir cria um botão personalizado na linha 1 do WordPress TinyMCE Versão 4, testado no WP versão 3.9-beta2.

O plug-in foi var_dumpincluído para entender os valores. Também é possível adicionar o botão para outras linhas do editor visual, apenas uma outra gancho, como para a linha 2: mce_buttons_2.

Resultado

insira a descrição da imagem aqui

Plugin, lado PHP - tinymce4-test.php

<?php
/**
 * Plugin Name: TinyMCE 4 @ WP Test
 * Description: 
 * Plugin URI:  
 * Version:     0.0.1
 * Author:      Frank Bültge
 * Author URI:  http://bueltge.de
 * License:     GPLv2
 * License URI: ./assets/license.txt
 * Text Domain: 
 * Domain Path: /languages
 * Network:     false
 */

add_action( 'admin_head', 'fb_add_tinymce' );
function fb_add_tinymce() {
    global $typenow;

    // Only on Post Type: post and page
    if( ! in_array( $typenow, array( 'post', 'page' ) ) )
        return ;

    add_filter( 'mce_external_plugins', 'fb_add_tinymce_plugin' );
    // Add to line 1 form WP TinyMCE
    add_filter( 'mce_buttons', 'fb_add_tinymce_button' );
}

// Inlcude the JS for TinyMCE
function fb_add_tinymce_plugin( $plugin_array ) {

    $plugin_array['fb_test'] = plugins_url( '/plugin.js', __FILE__ );
    // Print all plugin JS path
    var_dump( $plugin_array );
    return $plugin_array;
}

// Add the button key for address via JS
function fb_add_tinymce_button( $buttons ) {

    array_push( $buttons, 'fb_test_button_key' );
    // Print all buttons
    var_dump( $buttons );
    return $buttons;
}

Script, lado JavaScript - plugin.js

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

        // Add a button that opens a window
        editor.addButton( 'fb_test_button_key', {

            text: 'FB Test Button',
            icon: false,
            onclick: function() {
                // Open window
                editor.windowManager.open( {
                    title: 'Example plugin',
                    body: [{
                        type: 'textbox',
                        name: 'title',
                        label: 'Title'
                    }],
                    onsubmit: function( e ) {
                        // Insert content when the window form is submitted
                        editor.insertContent( 'Title: ' + e.data.title );
                    }

                } );
            }

        } );

    } );

} )();

Essência

Use o Gist bueltge / 9758082 como referência ou faça o download. O Gist também tem mais exemplos de botões diferentes no TinyMCE.

Ligações

bueltge
fonte
2
A documentação do TinyMCE sobre como criar um diálogo não é realmente muito útil. Então fui em frente e escrevi um artigo listando os diferentes widgets e layout de contêineres disponíveis: makina-corpus.com/blog/metier/2016/…
Gagaro
3

E, se você quiser ter um botão de ícone real, poderá aproveitar o dashicons ou sua própria fonte de ícone.

Crie um arquivo CSS e enfileire no lado do administrador;

i.mce-i-pluginname:before {
    content: "\f164";
    display: inline-block;
    -webkit-font-smoothing: antialiased;
    text-align: center;
    font: 400 20px/1 dashicons!important;
    speak: none;
    vertical-align: top;
}

Basicamente retirado diretamente do núcleo.

Dale Sattler
fonte
Certo, estava dentro dos meus Links acima na lista de Links.
bueltge
Gostaria de ter encontrado essa resposta antes de passar meia hora tentando adicioná-la através de um arquivo CSS. Essa parece ser a melhor maneira de fazer isso; todos os tutoriais que encontrei on-line são desnecessariamente detalhados.
21714
0

O método simples de adicionar botão

1) ADICIONE ESTE CÓDIGO EM FUNCTIONS.PHP OU NO PLUGIN

//add_protect_shortcode_button
add_action('admin_init', 'add_cb_button');function add_cb_button() {
   if (current_user_can('edit_posts')  &&  get_user_option('rich_editing') == 'true') {
        add_filter('mce_buttons_2', 'register_buttonfirst');
        add_filter('mce_external_plugins', 'add_pluginfirst');
   }
}
function register_buttonfirst($buttons) {  array_push($buttons, "|", "shortcode_button1" );   return $buttons;}
function add_pluginfirst($plugin_array) {$plugin_array['MyPuginButtonTag'] =  plugin_dir_url( __FILE__ ).'My_js_folder/1_button.php';return $plugin_array;}
add_filter( 'tiny_mce_version', 'my_refresh_mceeee1');  function my_refresh_mceeee1($ver) {$ver += 3;return $ver;}

2) Crie 1_button.php na pasta de destino e insira esse código (observe, altere os URLs "wp-load" e "ButtonImage.png" !!!)

<?php 
header("Content-type: application/x-javascript");
require('../../../../wp-load.php');
?>
(function() {
    // START my customs
    var abcd =location.host;

    tinymce.create('tinymce.plugins.shortcodebuton_plugin2', {  
        init            : function(ed, this_folder_url)
        {
                    // -------------------------
                    ed.addButton('shortcode_button1', {  
                        title : 'Show Level1 count',  
                        image : this_folder_url + '/ButtonImage.png',
                        onclick : function() {  
                            ed.selection.setContent('[statistics_sp]');  
                                //var vidId = prompt("YouTube Video", "");
                                //ed.execCommand('mceInsertContent', false, '[youtube id="'+vidId+'"]');
                        }  
                    });


        }, 

        createControl   : function(n, cm) {     return null;  }, 
    });  
    tinymce.PluginManager.add('MyPuginButtonTag', tinymce.plugins.shortcodebuton_plugin2);  
})();
T.Todua
fonte
Eu acho que não é o melhor caminho. A inclusão do wp-load.php não é estável. O ritmo, onde este arquivo é diferente. A instalação do WordPress tem possibilidades padrão para mover a pasta de temas e plugins.
bueltge