Как заставить TinyMCE в WordPress заменять переносы строк на теги <br> вместо <p> </p>
Ответ, предложенный GavinR, верен.
Однако вам не нужно устанавливать предложенный плагин. Просто добавьте этот мини-плагин, и всё готово:
<?php
defined( 'ABSPATH' ) OR exit;
/* Plugin Name: TinyMCE - перенос строки вместо параграфа */
function mytheme_tinymce_settings( $tinymce_init_settings ) {
$tinymce_init_settings['forced_root_block'] = false;
return $tinymce_init_settings;
}
add_filter( 'tiny_mce_before_init', 'mytheme_tinymce_settings' );
Теперь при нажатии Enter будет вставляться тег <br>
вместо создания нового параграфа. Но учтите, если вы создадите два последовательных переноса строки, текст всё равно будет разделён на параграфы из-за фильтра wpautop
, применяемого к содержимому вашей записи. Сначала вам нужно удалить этот фильтр и создать новый фильтр, который заменит все переносы строк тегами <br>
. Добавьте что-то вроде этого в ваш functions.php
, чтобы теги <br>
отображались в вашем шаблоне:
remove_filter ( 'the_content', 'wpautop' );
add_filter ( 'the_content', 'add_newlines_to_post_content' );
function add_newlines_to_post_content( $content ) {
return nl2br( $content );
}

Установите этот плагин: http://wordpress.org/plugins/advanced-tinymce-configuration/
и затем установите параметр forced_root_block в значение FALSE.

Это может не сработать для вас, потому что я не уверен, в каком именно сценарии требуется разрыв строки вместо абзацев. Если это нужно для определенного типа записи или конкретного шаблона, вы можете сделать следующее:
- Установите плагин Advanced Custom Fields.
- Создайте произвольное поле для вашего текста и выберите тип поля "textarea" с настройкой форматирования "преобразовывать переносы строк в теги <br />".
- Настройте "местоположение" этого произвольного поля так, чтобы оно отображалось только для нужного типа записи или шаблона (при необходимости это поле может заменить стандартный редактор для данного типа записи или шаблона).
Очевидно, что такой подход лишает всех стандартных возможностей форматирования, которые обычно предоставляет TinyMCE, включая создание ссылок и вставку медиафайлов. Поэтому такой вариант может вам не подойти.

Насколько мне известно... единственный способ сделать это - удалить фильтр wpautop
.
remove_filter( 'the_content', 'wpautop' );
remove_filter( 'the_excerpt', 'wpautop' );
Это точно предотвращает добавление WordPress'ом 'искусственных' тегов p
.
Я полагаю, что поскольку WordPress в некоторой степени разработан для "обычных пользователей"... они считают необходимым включить фильтр wpautop
, который обрабатывает контент после его отправки (или переключения между визуальным и текстовым режимами); выполняя серию "проверок" на валидность HTML... и корректируя контент соответствующим образом.
Хотя это может быть отлично для людей, которые никогда не касаются HTML-стороны, это становится головной болью для многих пользователей, пытающихся "возиться" с HTML.
ПРИМЕЧАНИЕ: Удаление фильтра wpautop
приведёт к тому, что все ваши записи/страницы (старые и новые) не будут использовать этот фильтр. В результате весь ваш HTML в редакторе контента будет "слипшимся". Визуальная сторона будет выглядеть нормально... но текстовая сторона будет слипшейся... что затруднит модификацию кода.

Если вы хотите сделать отступ в начале предложения после <br>
(SHIFT+ENTER), возможно, вам понадобится кастомное решение:
В functions.php добавьте:
add_action('init', 'add_cust_button');
function add_cust_button() {
if ( get_user_option('rich_editing') == 'true') {
add_filter('mce_external_plugins', 'add_mycust_plugin');
add_filter('mce_buttons_2', 'register_mycust_plugin');
}
}
function register_mycust_plugin($buttons) {
array_push($buttons, "|", "indent_button");
return $buttons;
}
function add_mycust_plugin($plugin_array) {
$plugin_array['my_custom_button'] = get_bloginfo('template_url').'/scripts/button.js';
return $plugin_array;
}
add_filter( 'tiny_mce_version', 'my_refresh_mce');
function my_refresh_mce($ver) {
$ver += 3;
return $ver;
}
Затем в папке темы создайте папку "scripts", а внутри неё файл с иконкой (назовите "indent_img.png") и JavaScript файл (назовите "button.js") с таким содержимым:
(function() {
tinymce.create('tinymce.plugins.Nlineeplg', {
init : function(ed, url) {
ed.addButton('indent_button', {
title : 'indent',
image : url+'/indent_img.png',
onclick : function() {
ed.execCommand('mceInsertContent', false, '<span style="margin:0 0 0 8px;"> </span>');
}
});
},
createControl : function(n, cm) {
return null;
}
});
tinymce.PluginManager.add('my_custom_button', tinymce.plugins.Nlineeplg);
})();
После этого на странице РЕДАКТОРА появится специальная кнопка, и когда вы кликнете в начале предложения и нажмёте эту кнопку, будет добавлен отступ.

Благодаря Bigsmoke стало возможно работать с wpautop:
A - Включение или отключение wpautop на выбранных страницах
B - Без изменения function.php
C - Без проблем со старыми страницами, если фильтр Wpautop был удален
D - Без искажения содержимого в текстовой части редактора
http://wordpress.org/plugins/wpautop-control/
Теперь я могу удобно форматировать большую часть текста с автоматическими абзацами, а затем завершать оформление без необходимости постоянно включать/выключать wpautop.

Отключение автоформатирования для этого, вероятно, плохая идея, так как это вносит гораздо больше изменений в обработку содержимого редактора, и большинство этих изменений, скорее всего, пользователь все равно хотел бы сохранить

Ты прав. Но поскольку WordPress принудительно заменяет br/ на , это просто кошмар, когда пытаешься, например, точно выровнять текст рядом с изображением.
Если у тебя есть более чистое решение для этого, я был бы рад его использовать.

Готово. :) http://wordpress.stackexchange.com/questions/157427/how-avoid-wp-editor-to-change-br-by-nbsp
