Como añadir un botón a la barra del editor clásico con JS en WordPress

Contents

Introducción

Este artículo explica paso a paso cómo añadir un botón personalizado a la barra del editor clásico (TinyMCE) en WordPress usando JavaScript y el habitual registro/encolado desde PHP. Incluye ejemplos completos de código (PHP y JS), manejo de permisos, localización de datos, ejemplos de inserción simple y de diálogo modal, y notas sobre compatibilidad y buenas prácticas de seguridad.

Qué vamos a lograr

  • Añadir un botón visible en la barra de herramientas del editor clásico.
  • Insertar contenido en el editor al pulsar el botón (texto, HTML o shortcode).
  • Mostrar un diálogo para recoger opciones y generar contenido dinámico.
  • Registrar y encolar los scripts correctamente desde un plugin o tema hijo.

Requisitos y consideraciones

  • Esto funciona con el editor clásico (TinyMCE 4). Si usas Gutenberg/Editor de bloques necesitarás otro enfoque (un bloque o un plugin para el editor).
  • Se recomienda crear esto desde un plugin o un tema hijo, no modificar archivos núcleo.
  • Comprobar capacidades: solo usuarios con capacidad de editar posts deberían ver el botón (por ejemplo, current_user_can(edit_posts)).
  • Escapar y sanear cualquier entrada que venga desde AJAX o formularios.

Estructura de archivos sugerida

  1. my-plugin/
    • my-plugin.php (archivo principal del plugin)
    • assets/js/editor-button.js (JavaScript que añade el botón a TinyMCE)
    • assets/css/editor-button.css (opcional, estilos del botón o ventana)

Paso 1 — Registrar y encolar los scripts desde PHP

En el archivo principal del plugin (o en functions.php del tema hijo) registramos y encolamos el script que contiene el plugin de TinyMCE y pasamos datos mediante wp_localize_script (por ejemplo, ajax_url o nonce).

 admin_url( admin-ajax.php ),
        nonce    => wp_create_nonce( miboton_nonce ),
        button_text => __( Mi Botón, mi-textdomain ),
    ) )

    wp_enqueue_script( miboton_tinymce )

    // CSS opcional para estilos del modal o icono
    wp_enqueue_style( miboton_editor_css, plugins_url( assets/css/editor-button.css, __FILE__ ) )
}
?>

Nota: no estamos forzando que el plugin solo cargue si Classic Editor está activo estamos cargando en las pantallas de edición y realizando una comprobación de capacidades. Si necesitas detectar explícitamente si Gutenberg está activo, hay funciones adicionales, pero no son necesarias si tu objetivo es el editor clásico.

Paso 2 — Código JavaScript: registrar el plugin de TinyMCE y añadir el botón

El archivo assets/js/editor-button.js debe contener la definición del plugin TinyMCE. Usaremos tinymce.PluginManager.add y luego añadiremos el botón con editor.addButton. El ejemplo incluye:

(function() {
    // Esperar a que tinymce exista
    if ( typeof tinymce === undefined ) {
        return
    }

    // Registrar el plugin
    tinymce.PluginManager.add(miboton_plugin, function(editor, url) {
        // Añadir un botón simple que inserta texto
        editor.addButton(miboton_button, {
            text: mibotonData.button_text  Mi Botón,
            icon: false,
            onclick: function() {
                // Insertar contenido en el editor donde esté el cursor
                editor.insertContent(Contenido insertado por Mi Botón)
            }
        })

        // Alternativamente, añadir un botón que abre una ventana modal
        editor.addButton(miboton_dialog, {
            text: Insertar con diálogo,
            icon: false,
            onclick: function() {
                editor.windowManager.open({
                    title: Opciones del botón,
                    body: [
                        { type: textbox, name: title, label: Título },
                        { type: textbox, name: subtitle, label: Subtítulo }
                    ],
                    onsubmit: function( e ) {
                        var titulo = editor.dom.encode( e.data.title )
                        var subtitulo = editor.dom.encode( e.data.subtitle )
                        // Insertar HTML seguro
                        editor.insertContent( 

titulo

subtitulo

) } }) } }) // Opcional: crear un botón con icono como imagen (image: url) editor.addButton(miboton_icon, { image: url /icono-16.png, // si se tiene un icono dentro del plugin tooltip: Mi botón con icono, onclick: function() { editor.insertContent([mi_shortcode]) } }) // Registrar el botón en los menús o toolbars si se necesita }) // Indicar a WordPress que cargue el plugin TinyMCE cuando se inicialice // Nota: WordPress inyecta automáticamente todos los plugins que se registran })()

Importante: el objeto mibotonData proviene de wp_localize_script en PHP y permite pasar datos de forma segura (ajax_url, nonce, textos traducibles, etc.).

Paso 3 — Registrar el plugin TinyMCE en WordPress (filtro mce_external_plugins y mce_buttons)

Para que WordPress cargue el plugin de TinyMCE y muestre el botón en la barra, añadiremos hooks que integren el plugin con TinyMCE y añadan el nombre del botón a la lista de botones.


Con esto WordPress conocerá el plugin y añadirá el botón en la barra del editor clásico.

Paso 4 — Ejemplo de manejo AJAX (opcional)

Si el botón necesita obtener datos desde el servidor (por ejemplo, para autocompletar o generar contenido), puedes usar admin-ajax.php y pasar una nonce con wp_localize_script. Ejemplo de handler en PHP:

 Datos desde AJAX,
        time    => current_time( mysql )
    )

    wp_send_json_success( result )
}
?>

Y el correspondiente uso desde JS (fetch/jQuery.ajax) puede aprovechar mibotonData.ajax_url y mibotonData.nonce.

Buenas prácticas y puntos a considerar

  • Escapar y sanear: cualquier dato recibido por AJAX o por formulario debe validarse y sanearse (sanitize_text_field, wp_kses_post, etc.).
  • Permisos: comprobar current_user_can en los handlers y encolar scripts sólo para usuarios apropiados.
  • Compatibilidad: el código mostrado está pensado para TinyMCE4 (editor clásico). Para TinyMCE 5 o Gutenberg el enfoque cambia.
  • Traducciones: si necesitas internacionalizar, usa __(), _x(), y asegurate de cargar el textdomain del plugin.
  • Pruebas: probar en distintos navegadores y con distintos plugins que puedan modificar la barra de TinyMCE.
  • Iconos: puedes usar dashicons para estilos, o imágenes propias en TinyMCE puedes usar la propiedad image o una clase CSS en la que uses background-image.

Ejemplo completo resumido

Resumen de los pasos clave:

  1. Registrar y encolar assets (JS/CSS) en admin con comprobaciones de pantalla y permisos.
  2. Localizar datos (ajax_url, nonce, textos) con wp_localize_script.
  3. Registrar el plugin TinyMCE con mce_external_plugins y añadir el botón con mce_buttons.
  4. Crear el plugin JS usando tinymce.PluginManager.add y editor.addButton / editor.windowManager.
  5. Sanear/sanitizar/validar cualquier dato enviado al servidor.

Recursos útiles

Conclusión

Añadir un botón al editor clásico de WordPress es directo si sigues la secuencia adecuada: encolar scripts, registrar el plugin TinyMCE, añadir el botón y, opcionalmente, crear diálogos o llamadas AJAX. Siguiendo las buenas prácticas de permisos, escaping y localización tendrás una integración robusta y segura.



Acepto donaciones de BAT's mediante el navegador Brave 🙂



Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *