¿Cómo usar iconos de FontAwesome en el editor TinyMCE?

1 jul 2014, 14:46:48
Vistas: 18.3K
Votos: 7

Estoy intentando agregar un botón de YouTube en el editor TinyMCE.

Aquí está el archivo recent-posts.js que está en la carpeta js del directorio del tema.

(function() {
   tinymce.create('tinymce.plugins.buttons', {
      init : function(ed, url) {

         //para el botón de posts recientes
         ed.addButton('recentposts', {
            title : 'Posts recientes',
            image : url + '/youtube.png',
            onclick : function() {
               var posts = prompt("Número de posts", "");
               var text = prompt("Encabezado de la lista", "");

               if (text != null && text != ''){
                  if (posts != null && posts != '')
                     ed.execCommand('mceInsertContent', false, '[recent-posts posts="'+posts+'"]'+text+'[/recent-posts]');
                  else
                     ed.execCommand('mceInsertContent', false, '[recent-posts]'+text+'[/recent-posts]');
               }
               else{
                  if (posts != null && posts != '')
                     ed.execCommand('mceInsertContent', false, '[recent-posts posts="'+posts+'"]');
                  else
                     ed.execCommand('mceInsertContent', false, '[recent-posts]');
               }
            }
         });


         //para video de YouTube
          ed.addButton('youtube', {
            title : 'YouTube',
            text: 'YouTube',          
            onclick : function() {
               var id = prompt("ID del video", "");
               var text = prompt("Encabezado del video", "");

               if (text != null && text != ''){
                  if (id != null && id != '')
                     ed.execCommand('mceInsertContent', false, '[yt id="'+id+'"]'+text+'[/yt]');
               }
               else{
                  if (id != null && id != '')
                     ed.execCommand('mceInsertContent', false, '[yt posts="'+id+'"]');
               }
            }
         });

      },
      createControl : function(n, cm) {
         return null;
      },
      getInfo : function() {
         return {
            longname : "me The Most Brilliant",
            author : 'me',
            authorurl : 'http://www.google.com',
            infourl : 'http://www.google.com',
            version : "1.0"
         };
      }
   });
   tinymce.PluginManager.add('buttons', tinymce.plugins.buttons);
})();

El código en functions.php es:

function register_button( $buttons ) {
   array_push( $buttons,"recentposts", "youtube" );
   return $buttons;
}

function add_plugin( $plugin_array ) {
   $plugin_array['buttons'] = get_template_directory_uri() . '/js/recent-posts.js';
   return $plugin_array;
}

function my_recent_posts_button() {

   if ( ! current_user_can('edit_posts') && ! current_user_can('edit_pages') ) {
      return;
   }

   if ( get_user_option('rich_editing') == 'true' ) {
      add_filter( 'mce_external_plugins', 'add_plugin' );
      add_filter( 'mce_buttons', 'register_button' );
   }

}

add_action('init', 'my_recent_posts_button');

En lugar de image : url+'/youtube.png' estoy intentando usar text :'<i class="fa fa-camera-retro"></i>'

Pero en el editor de texto, en vez de mostrar el icono de FontAwesome, solo aparece como texto literal. ¿Dónde debería colocar el archivo de FontAwesome y cómo debería llamarlo para usarlo en TinyMCE?

0
Todas las respuestas a la pregunta 3
18

No podrías añadir un icono de FontAwesome pasándolo directamente al método ed.addButton(); lamentablemente.

Sin embargo, puedes intentar una solución alternativa. Si omites el parámetro image : url+'/youtube.png' del método, automáticamente creará un <span> vacío con la clase mceIcon y otra clase mce_[plugin_name].

Luego puedes usar CSS para dar estilo a ese elemento <span> como prefieras.

Ahora puedes usar FontAwesome directamente en tu CSS, algo así (asegúrate de cambiar la clase .mce_[plugin_name] utilizada aquí por tu clase real):

span.mce_[plugin_name] {
    position: relative;
}

span.mce_[plugin_name]:before {
    content: "\f166"; /* Valor para el icono de Youtube*/
    font-family: FontAwesome;
    font-style: normal;
    font-weight: normal;
    text-decoration: inherit;
/*--ajusta según sea necesario--*/
    color: #000;
    font-size: 18px;
    padding-right: 0.5em;
    position: absolute;
    top: 10px;
    left: 0;
}

ACTUALIZACIÓN

Aquí está cómo cargo mi archivo CSS de FontAwesome. Lo he adaptado para cargar en el área de administración para lo que necesitas hacer. Lo llamo desde el CDN de Bootstrap, pero podrías descargar el archivo CSS y cargarlo desde tu carpeta de tema o plugin usando la misma función admin_enqueue_scripts();.

// Cargar Font Awesome
function royal_enqueue_awesome() {
    wp_enqueue_style( 'prefix-font-awesome', '//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css', array(), '4.0.3' );
}

add_action( 'admin_enqueue_scripts', 'royal_enqueue_awesome' );
1 jul 2014 15:29:54
Comentarios

No estoy usando un plugin.

user1906399 user1906399
1 jul 2014 17:23:37

y el icono de YouTube de FontAwesome viene usando <i class="fa fa-youtube"></i>. ¿Cómo uso esto en CSS?

user1906399 user1906399
1 jul 2014 17:43:01

Lo que estás haciendo en tu código anterior es agregar tu propio plugin de TinyMCE - no me refiero a usar un plugin de WordPress :-) Te sugiero que revises este tutorial para obtener una buena visión general del proceso también, podría ser útil :-)

Matt Royal Matt Royal
1 jul 2014 17:44:13

El <i class="fa fa-youtube"></i> es el marcado HTML al que se aplica el CSS de FontAwesome por defecto. También puedes aplicarlo a otros elementos usando Selectores Pseudo CSS como lo he hecho en mi código si así lo deseas.

Matt Royal Matt Royal
1 jul 2014 17:47:38

No obtengo ningún elemento span si dejo image:. Puedo acceder al botón usando su ID que es #mce_17, y puedo usar el hook admin_head, y puedo cambiar su color de fondo, etc. Estoy confundido sobre dónde debería poner la carpeta de fontawesome que descargué y ¿debería simplemente llamar a su archivo css en functions.php? después de eso, ¿qué debería hacer? Déjame poner todo el código.

user1906399 user1906399
1 jul 2014 17:55:49

Sí, también puedes usar el ID. Necesitas usar la función wp_enqueue_style para agregar el archivo CSS de FontAwesome a tu sitio web antes de poder llamar al CSS que te proporcioné anteriormente.

Matt Royal Matt Royal
1 jul 2014 18:06:05

No estoy seguro de dónde estás obteniendo ese valor "\f1666", no hay documentación al respecto en el sitio web de FontAwesome

user1906399 user1906399
1 jul 2014 18:12:47

No está funcionando de la manera que dijiste, el elemento es <button role="presentation" type="button" tabindex="-1">YouTube</button>, todo lo que necesito hacer es reemplazar YouTube con <i fa fa-youtube></i>

user1906399 user1906399
1 jul 2014 18:15:40

El valor "\f1666" es el código de caracteres UTF-8. Puedes consultarlos en la Hoja de referencia de FontAwesome

Matt Royal Matt Royal
1 jul 2014 18:19:45

`function tinymce_style(){

?> <style> #mce_17{

      content: "\f166"; /* Valor para el ícono de YouTube */
  font-family: FontAwesome;
  font-style: normal;
  font-weight: normal;
  text-decoration: inherit;

     }

</style>

<?php }

add_action('admin_head', 'tinymce_style');` estoy usando esto

user1906399 user1906399
1 jul 2014 18:24:52

¿Cuál es el elemento <div> que envuelve al elemento <button>?

Matt Royal Matt Royal
1 jul 2014 18:24:55

`function thought_script(){

wp_enqueue_style('fontawesome-style', get_template_directory_uri().'/font-awesome/css/font-awesome.min.css');

}

add_action('wp_enqueue_scripts', 'thought_script');` y esto para añadir el CSS de FontAwesome

user1906399 user1906399
1 jul 2014 18:27:02

Continuemos esta discusión en el chat.

Matt Royal Matt Royal
1 jul 2014 18:28:35

<div id="mce_17" class="mce-widget mce-btn mce-last" tabindex="-1" aria-labelledby="mce_17" role="button" aria-label="YouTube"><button role="presentation" type="button" tabindex="-1"><i class="mce-ico mce-i-youtube"></i></button></div> esto es lo que obtengo del elemento de inspección de Google

user1906399 user1906399
1 jul 2014 18:29:08

necesito 20 de reputación para chatear

user1906399 user1906399
1 jul 2014 18:30:57

Prueba esto ya que estabas usando la acción incorrecta y cargando FontAwesome en el sitio web y no en el Dashboard como necesitas... function thought_script(){ wp_enqueue_style('fontawesome-style', get_template_directory_uri().'/font-awesome/css/font-awesome.min.css'); } add_action('admin_enqueue_scripts', 'thought_script');

Matt Royal Matt Royal
1 jul 2014 18:32:35

ahora obtengo <i class="mce-ico mce-i-youtube"></i> dentro del elemento button, pero no está funcionando.

user1906399 user1906399
1 jul 2014 18:39:42

Ahora lo resolví, no es un elemento span sino un elemento i que aparece si no se especifica texto o imagen. Así que solo necesitaba apuntar a la clase i.mce-i-youtube, que es diferente como mencionaste. Estaba buscando un elemento span. Gracias por tu ayuda y tiempo.

user1906399 user1906399
1 jul 2014 22:06:35
Mostrar los 13 comentarios restantes
0

Probé lo siguiente en WordPress 4.6.1

Originalmente investigué este proceso para ayudar a crear un botón que generara un shortcode. Basado en varios posts, inicialmente usé los siguientes parámetros addButton dentro de mi archivo javascript para decorar mi botón de TINYMCE...

ed.addButton('wpse72394_button', { title: 'título de mi botón', cmd: 'wpse72394_inser', image: url + '/ruta/a/la/imagen.png' });

...Pero no quería crear un botón desde cero o solo una etiqueta de texto. En lugar de eso, quería hacer referencia a un icono existente en WordPress. Descubrí que podía fácilmente reemplazar el parámetro image: por un parámetro icon: así...

ed.addButton('wpse72394_button', { title: 'Insertar shortcode', cmd: 'wpse72394_insert_shortcode', icon: 'wp_code' });

Dentro de WordPress, si buscas en

ruta-del-sitio\wp-includes\js\tinymce\plugins\wordpress\plugins.js

encontrarás varias opciones como...

      wp_help
      wp_more  
      wp_page
      wp_code

No creo que estos sean iconos de fontawesome, pero son lo suficientemente cercanos para mí para hacer el trabajo sin agregar css adicional o referencias a enlaces CDN.

31 oct 2016 18:27:31
1

Aquí hay una solución muy sencilla para esto.

Primero, agrega la biblioteca FontAwesome al backend de WordPress creando y añadiéndola a admin_init

function fontawesome_dashboard() {
   wp_enqueue_style('fontawesome', 'https://use.fontawesome.com/releases/v5.1.1/css/all.css'); 
}

add_action('admin_head', 'fontawesome_dashboard', 11);

Luego, en tu archivo javascript:

ed.addButton('recentposts', {
            title : 'Publicaciones recientes',
            icon: ' fa fa-camera-retro', // nota el espacio antes de 'fa'

Este tipo de truco funcionó para mí. Estoy seguro de que también funcionará para ti :)

19 jul 2018 17:12:47
Comentarios

Funciona muy bien (ejecutando WP 5.7.2 y FontAwesome 5.15.1). Solo asegúrate de prestar atención al ESPACIO antes de la primera clase LOL

revive revive
13 may 2021 20:13:31