Можно ли добавить пользовательский формат в панель форматирования текста?
В текстовом редакторе, где можно установить заголовки и другие настройки, возможно ли добавить собственные стили для использования клиентами? А также удалить ненужные?

В "классическом" редакторе TinyMCE есть два выпадающих списка: formatselect
для стилей абзацев и styleselect
для стилей символов — которые также могут содержать стили абзацев, что может вызвать путаницу. По умолчанию в WordPress отображается только выпадающий список формата. Если применить пользовательскую таблицу стилей к редактору, TinyMCE может использовать её для извлечения классов и добавления их в выпадающий список стилей — но у меня это срабатывало не всегда.
Начиная с версии 3.0, вы можете вызвать add_editor_style()
в вашем functions.php
, чтобы добавить таблицу стилей в редактор. По умолчанию используется файл editor-style.css
в директории вашей темы. До версии 3.0 необходимо было использовать фильтр mce_css
, чтобы добавить URL вашей таблицы стилей редактора. В итоге это попадает в значение конфигурации TinyMCE content_css
.
Чтобы добавить выпадающий список стилей, опция styleselect
должна быть указана в одном из массивов конфигурации панели кнопок (theme_advanced_buttons[1-4]
в TinyMCE, фильтруемый через mce_buttons_[1-4]
в WordPress). Список форматов блоков управляется опцией TinyMCE theme_advanced_blockformats
, которую можно добавить в массив управления через фильтр tiny_mce_before_init
. Если вы хотите настроить названия в выпадающем списке стилей (а не только имена CSS-классов), обратите внимание на опцию theme_advanced_styles
. Также можно использовать более продвинутую опцию style_formats
, которая предоставляет больше гибкости в определении стилей.
Соответствующий PHP-код со всеми хуками и конфигурацией по умолчанию находится в wp-admin/includes/post.php
, в функции wp_tiny_mce()
. В целом, ваша настройка может выглядеть так:
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';
// Взято с http://tinymce.moxiecode.com/examples/example_24.php
$style_formats = array(
array('title' => 'Жирный текст', 'inline' => 'b'),
array('title' => 'Красный текст', 'inline' => 'span', 'styles' => array('color' => '#ff0000')),
array('title' => 'Красный заголовок', 'block' => 'h1', 'styles' => array('color' => '#ff0000')),
array('title' => 'Пример 1', 'inline' => 'span', 'classes' => 'example1'),
array('title' => 'Пример 2', 'inline' => 'span', 'classes' => 'example2'),
array('title' => 'Стили таблицы'),
array('title' => 'Строка таблицы 1', 'selector' => 'tr', 'classes' => 'tablerow1'),
);
// До версии 3.1 требовался специальный трюк для передачи этого массива в конфигурацию.
// Смотрите историю изменений этого поста для предыдущих версий.
$settings['style_formats'] = json_encode( $style_formats );
return $settings;
}

Есть ли специальный формат, который должен иметь .css при использовании add_editor_style? Кажется, ничего не происходит.

Все еще не получается разобраться, как добавить классы в выпадающий список форматов, кроме стандартных.

@Mild Fuzz: Мой предыдущий ответ был вводящим в заблуждение, потому что WordPress показывает только один из двух необходимых выпадающих списков. Я обновил свой ответ, добавив способ добавления второго списка и управления им.

ты просто легенда!! не совсем понимаю, что делает 'style_formats', но 'theme_advanced_styles' делает именно то, что мне нужно!!

очень хочу, чтобы второй блок начал работать, так как выглядит, что он может быть чрезвычайно полезным. Проблема в том, что $settings['style_formats'] изначально равен null, поэтому я не могу сравнить форматы с чем-либо.

@Mild Fuzz: Параметры для различных элементов style_formats
объясняются на связанной formats
wiki странице.

всё показано на JS, немного запутался, как преобразовать это в рабочий PHP. Пробовал '$settings['style_formats'] .= "custom_format : {block : 'h1', attributes : {title : \"Header\"}, styles : {color : red}}";', но это полностью убивает tinyMCE

@Mild Fuzz: Я думал, WordPress применит json_encode()
к конфигурации, но он просто выводит её. Я изменил свой ответ, включив туда "JS-инъекцию" для передачи массива конфигурации в TinyMCE. Не гарантируется, что сработает.

Работает ли пример кода, и решил ли он ваш вопрос? Обратите внимание, что у вас опечатка в конце строки "Table styles" — нужна ), а не }

json_encode генерирует ", а не ', поэтому JavaScript ломается. Вам нужно сделать str_replace('"', "'", json_encode($style_formats))

Вы можете добавить собственный формат или удалить существующий следующим образом:
add_filter('tiny_mce_before_init', function($init_array) {
$init_array['formats'] = json_encode([
// добавляем новый формат
'h3marked' => [
'selector' => 'h3',
'block' => 'h3',
'classes' => 'article-paragraph',
],
], JSON_THROW_ON_ERROR);
// удаляем ненужные форматы из массива
$block_formats = [
'Абзац=p',
'Заголовок 1=h1',
'Заголовок 2=h2',
'Заголовок 3=h3',
'Заголовок 3 с маркером=h3marked', // используем новый формат в выборе
'Заголовок 4=h4',
'Заголовок 5=h5',
'Заголовок 6=h6',
'Преформатированный=pre',
];
$init_array['block_formats'] = implode(';', $block_formats);
return $init_array;
});
Подробнее смотрите в этой статье и документации TinyMCE

Как указано здесь Выпадающий список форматов TinyMCE больше не показывает предпросмотр стилей
Кара была права, необходимо сбросить стили по умолчанию, чтобы увидеть новые стили...
unset($init['preview_styles']);
return $settings;
