¿Puedo agregar un formato personalizado a la opción de formato en el panel de texto?

16

En el editor de texto, donde puede establecer encabezados y otras configuraciones, ¿es posible agregar sus propios estilos para que los clientes los usen? e incluso eliminar los innecesarios?

Fuzz suave
fuente
2
WP3 y TinyMCE están tan desordenados en este aspecto. No puedo creer que no sea posible agregar o personalizar fácilmente los malditos formatos como en CKEditor.
cherouvim
1
Estoy de acuerdo, es un dolor total.
Mild Fuzz

Respuestas:

17

El editor "clásico" de TinyMCE tiene dos menús desplegables: formatselectpara estilos de párrafo y styleselectpara estilos de caracteres , que también pueden contener estilos de párrafo, para hacerlo más confuso. La configuración en WordPress por defecto solo muestra el menú desplegable de formato . Si aplica una hoja de estilo personalizada al editor, TinyMCE puede usarla para recoger los nombres de clase y agregarlos al menú desplegable de estilos , pero esto no funcionó todo el tiempo para mí.

Desde 3.0 se puede llamar add_editor_style()en su functions.phpañadir una hoja de estilos para el editor. Por defecto está editor-style.cssen su directorio de temas. Antes de 3.0, debe conectar el mce_cssfiltro para agregar la URL a la hoja de estilo de su editor. Esto terminará en el content_cssvalor de configuración de TinyMCE .

Para agregar el menú desplegable de estilo , la styleselectopción debe aparecer en una de las matrices de configuración de la barra de botones ( theme_advanced_buttons[1-4]en TinyMCE, filtrada por mce_buttons_[1-4]en WordPress). La lista de formatos de bloque está controlada por la theme_advanced_blockformatsopción de TinyMCE , que puede agregar a la matriz de control en el tiny_mce_before_initfiltro. Si desea personalizar los nombres del menú desplegable de estilos (no solo sus nombres de clase CSS), mire la theme_advanced_stylesopción . También puede usar la style_formatsopción más avanzada que le brinda más flexibilidad para definir los estilos.

El código PHP relevante con todos los ganchos y la configuración predeterminada está wp-admin/includes/post.phpen funciónwp_tiny_mce() . En conjunto, su configuración podría verse así:

add_action( 'after_setup_theme', 'wpse3882_after_setup_theme' );
function wpse3882_after_setup_theme()
{
    add_editor_style();
}

add_filter('mce_buttons_2', 'wpse3882_mce_buttons_2');
function wpse3882_mce_buttons_2($buttons)
{
    array_unshift($buttons, 'styleselect');
    return $buttons;
}

add_filter('tiny_mce_before_init', 'wpse3882_tiny_mce_before_init');
function wpse3882_tiny_mce_before_init($settings)
{
    $settings['theme_advanced_blockformats'] = 'p,h1,h2,h3,h4';

    // From http://tinymce.moxiecode.com/examples/example_24.php
    $style_formats = array(
        array('title' => 'Bold text', 'inline' => 'b'),
        array('title' => 'Red text', 'inline' => 'span', 'styles' => array('color' => '#ff0000')),
        array('title' => 'Red header', 'block' => 'h1', 'styles' => array('color' => '#ff0000')),
        array('title' => 'Example 1', 'inline' => 'span', 'classes' => 'example1'),
        array('title' => 'Example 2', 'inline' => 'span', 'classes' => 'example2'),
        array('title' => 'Table styles'),
        array('title' => 'Table row 1', 'selector' => 'tr', 'classes' => 'tablerow1'),
    );
    // Before 3.1 you needed a special trick to send this array to the configuration.
    // See this post history for previous versions.
    $settings['style_formats'] = json_encode( $style_formats );

    return $settings;
}
Jan Fabry
fuente
¿Hay un formato especial que el .css debería tomar usando add_editor_style? nada parece suceder
Mild Fuzz
1
@Mild Fuzz: mi respuesta anterior fue engañosa porque WordPress muestra solo uno de los dos menús desplegables necesarios. Actualicé mi respuesta con una forma de agregar el segundo menú desplegable y cómo controlarlo.
Jan Fabry
1
@Mild Fuzz: los parámetros de los diferentes style_formatselementos se explican en la formatspágina wiki relacionada .
Jan Fabry
1
¡ya no produce errores, pero no tiene efecto!
Suave Fuzz
1
json_encode genera "y no ', por lo que el javascript se rompe. Debe hacer str_replace ('" ', "'", json_encode ($ style_formats))
cherouvim