Добавление пользовательской кнопки в TinyMCE 4, доступно с WordPress 3.9-beta1

25 мар. 2014 г., 17:36:12
Просмотры: 18.7K
Голосов: 21

Как можно добавить пользовательскую кнопку в визуальный редактор TinyMCE версии 4?

В настоящее время я нашел этот вопрос-ответ с некоторыми подсказками по теме, но не готовое решение или инструкцию. Однако я не могу найти учебник, документацию или Q&A по добавлению пользовательской кнопки в TinyMCE версии 4, включенную в WordPress начиная с версии 3.9-beta1.

Цель

Пример пользовательской кнопки в TinyMCE

0
Все ответы на вопрос 3
1
24

Следующий небольшой плагин создает пользовательскую кнопку в первой строке редактора TinyMCE версии 4 в WordPress, протестирован в WP версии 3.9-beta2.

Плагин включает var_dump для понимания значений. Также можно добавить кнопку в другие строки визуального редактора, используя другой хук, например, для второй строки: mce_buttons_2.

Результат

Пользовательская кнопка в TinyMCE

Плагин, 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;

    // Только для типов записей: post и page
    if( ! in_array( $typenow, array( 'post', 'page' ) ) )
        return ;

    add_filter( 'mce_external_plugins', 'fb_add_tinymce_plugin' );
    // Добавить в строку 1 WP TinyMCE
    add_filter( 'mce_buttons', 'fb_add_tinymce_button' );
}

// Включение JS для TinyMCE
function fb_add_tinymce_plugin( $plugin_array ) {

    $plugin_array['fb_test'] = plugins_url( '/plugin.js', __FILE__ );
    // Вывод всех путей JS плагинов
    var_dump( $plugin_array );
    return $plugin_array;
}

// Добавление ключа кнопки для обращения через JS
function fb_add_tinymce_button( $buttons ) {

    array_push( $buttons, 'fb_test_button_key' );
    // Вывод всех кнопок
    var_dump( $buttons );
    return $buttons;
}

Скрипт, JavaScript часть - plugin.js

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

        // Добавление кнопки, открывающей окно
        editor.addButton( 'fb_test_button_key', {

            text: 'FB Test Button',
            icon: false,
            onclick: function() {
                // Открытие окна
                editor.windowManager.open( {
                    title: 'Пример плагина',
                    body: [{
                        type: 'textbox',
                        name: 'title',
                        label: 'Заголовок'
                    }],
                    onsubmit: function( e ) {
                        // Вставка содержимого при отправке формы окна
                        editor.insertContent( 'Заголовок: ' + e.data.title );
                    }

                } );
            }

        } );

    } );

} )();

Gist

Используйте Gist bueltge/9758082 в качестве справочника или для загрузки. В Gist также приведены дополнительные примеры различных кнопок в TinyMCE.

Ссылки

25 мар. 2014 г. 17:36:12
Комментарии

Документация TinyMCE о том, как создавать диалоговые окна, на самом деле не очень полезна. Поэтому я написал статью с перечислением различных доступных виджетов и макетов контейнеров: http://makina-corpus.com/blog/metier/2016/how-to-create-a-custom-dialog-in-tinymce-4

Gagaro Gagaro
30 мар. 2016 г. 12:31:21
2

И если вы хотите создать кнопку с иконкой, то можете использовать dashicons или ваш собственный шрифт с иконками.

Создайте CSS файл и подключите его в админке:

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

По сути, взято напрямую из ядра.

27 мар. 2014 г. 10:14:45
Комментарии

Верно, было внутри моих ссылок выше в списке ссылок.

bueltge bueltge
27 мар. 2014 г. 11:02:04

Жаль, что я не нашёл этот ответ раньше, потратив полчаса на попытки добавить это через CSS-файл. Этот способ кажется лучшим; все найденные мной онлайн-руководства излишне многословны.

aendra aendra
14 июл. 2014 г. 12:24:57
1

Простой способ добавления кнопки

1) ДОБАВЬТЕ ЭТОТ КОД В ФУНКЦИИ.PHP ИЛИ В ПЛАГИН

//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) Создайте файл 1_button.php в целевой папке и вставьте этот код (примечание: измените URL "wp-load" и "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 : 'Показать счетчик Level1',  
                        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);  
})();
20 февр. 2015 г. 17:37:43
Комментарии

Я считаю, что это не самый лучший способ. Подключение файла wp-load.php нестабильно. Местоположение этого файла может быть разным. Установка WordPress предоставляет стандартные возможности для перемещения папок тем и плагинов.

bueltge bueltge
20 февр. 2015 г. 18:29:48