Пользовательские стили WordPress TinyMCE с возможностью ввода - PullRequest
0 голосов
/ 06 февраля 2020

Я хочу добавить собственный стиль в wordpress tiny mce. Существует множество обучающих программ для простого добавления простой опции, такой как «подсветка», которая добавит диапазон с классом «подсветка». Например: https://torquemag.io/2016/09/add-custom-styles-wordpress-editor-manually-via-plugin/

Но мне нужна опция для добавления дополнительных данных, например, если вы добавляете ссылку. Вы помечаете слова, нажимаете кнопку ссылки, появляется ввод для URL.

Чего я хочу добиться? Пользовательский стиль "аббревиатура" (https://get.foundation/sites/docs/typography-base.html). Решение, о котором я думаю, заключается в том, что пользователь помечает слово, выбирает стиль аббревиатуры, появляется ввод для описания. fin.

Надеюсь, вы поможете мне!

1 Ответ

1 голос
/ 06 февраля 2020

Так что у меня есть нечто подобное в большинстве моих проектов WordPress. У меня есть кнопка панели инструментов TinyMCE, у которой есть пара полей, которые выводят кнопку bootstrap.

Что вам нужно сделать, это создать свой собственный «плагин» TinyMCE, и для этого вам понадобятся две части:

  1. Файл javascript (ваш плагин)
  2. Фрагмент PHP для загрузки вашего javascript (плагин) в редактор TinyMCE.

Сначала мы создадим плагин:

/ js / my-tinymce-plugin. js

( function() {
    'use strict';

    // Register our plugin with a relevant name
    tinymce.PluginManager.add( 'my_custom_plugin', function( editor, url ) {

        editor.addButton( 'my_custom_button', {
            tooltip: 'I am the helper text',
            icon: 'code', // @link https://www.tiny.cloud/docs/advanced/editor-icon-identifiers/
            onclick: function() {

                // Get the current selected tag (if has one)
                var selectedNode = editor.selection.getNode();

                // If we have a selected node, get the inner content else just get the full selection
                var selectedText = selectedNode ? selectedNode.innerHTML : editor.selection.getContent();

                // Open a popup
                editor.windowManager.open( {
                    title: 'My popup title',
                    body: [

                        // Create a simple text field
                        {
                            type: 'textbox',
                            name: 'field_name_textbox',
                            label: 'Field label',
                            value: selectedText || 'I am a default value' // Use the selected value or set a default
                        },

                        // Create a select field
                        {
                            type: 'listbox',
                            name: 'field_name_listbox',
                            label: 'Field list',
                            value: '',
                            values: {
                                'value': 'Option 1',
                                'value-2': 'Option 2'
                            }
                        },

                        // Create a boolean checkbox
                        {
                            type: 'checkbox',
                            name: 'field_name_checkbox',
                            label: 'Will you tick me?',
                            checked: true
                        }
                    ],
                    onsubmit: function( e ) {
                        // Get the value of our text field
                        var textboxValue = e.data.field_name_textbox;

                        // Get the value of our select field
                        var listboxValue = e.data.field_name_listbox;

                        // Get the value of our checkbox
                        var checkboxValue = e.data.field_name_checkbox;

                        // If the user has a tag selected
                        if ( selectedNode ) {
                            // Do something with selected node
                            // For example we can add a class
                            selectedNode.classList.add( 'im-a-custom-class' );
                        } else {
                            // Insert insert content
                            // For example we will create a span with the text field value
                            editor.insertContent( '<span>' + ( textboxValue || 'We have no value!' ) + '</span>' );
                        }
                    }
                } );
            }
        } );

    } );

} )();

Теперь мы добавим и изменим приведенный ниже фрагмент к вашему Темы функции. php файл.

/ functions. php

<?php
add_action( 'admin_head', function() {
    global $typenow;

    // Check user permissions
    if ( !current_user_can( 'edit_posts' ) && !current_user_can( 'edit_pages' ) ) {
        return;
    }

    // Check if WYSIWYG is enabled
    if ( user_can_richedit() ) {

        // Push my button to the second row of TinyMCE actions
        add_filter( 'mce_buttons', function( $buttons ) {
            $buttons[] = 'my_custom_button'; // Relates to the value added in the `editor.addButton` function
            return $buttons;
        } );

        // Load our custom js into the TinyMCE iframe
        add_filter( 'mce_external_plugins', function( $plugin_array ) {

            // Push the path to our custom js to the loaded scripts array
            $plugin_array[ 'my_custom_plugin' ] = get_template_directory_uri() . '/js/my-tinymce-plugin.js';
            return $plugin_array;
        } );
    }
} );

Обязательно обновите имя файла и путь, если он отличается от этого пример!

WordPress использует TinyMCE 4, и документации для этого не хватает, поэтому поиск именно того, что вам нужно, может быть болезненным.

Это всего лишь отправная точка и не был протестирован.

Надеюсь, это поможет!


РЕДАКТИРОВАТЬ

Приведенный ниже код должен помочь вам вставить тег «Сокращения» и атрибут title.

( function() {
    'use strict';

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

        editor.addButton( 'my_custom_button', {
            tooltip: 'Insert an abbreviation',
            icon: 'plus',
            onclick: function() {

                var selectedNode = editor.selection.getNode();
                var selectedText = selectedNode ? selectedNode.innerHTML : editor.selection.getContent();

                editor.windowManager.open( {
                    title: 'Insert an abbreviation',
                    body: [

                        {
                            type: 'textbox',
                            name: 'abbreviation',
                            label: 'The abbreviated term',
                            value: selectedText
                        },

                        {
                            type: 'textbox',
                            name: 'title',
                            label: 'The full term',
                            value: ''
                        }

                    ],
                    onsubmit: function( e ) {

                        var abbreviation = e.data.abbreviation;
                        var title = e.data.title.replace( '"', '\"' );

                        if ( selectedNode && selectedNode.tagName === 'ABBR' ) {
                            selectedNode.innerText = abbreviation;
                            selectedNode.setAttribute( 'title', title );
                        } else {
                            editor.insertContent( '<abbr title="' + title + '">' + abbreviation + '</abbr>' );
                        }
                    }
                } );
            }
        } );

    } );

} )();
...