TinyMCE редактор удаляет теги <p> и <br/>?
Привет всем, я добавил TinyMCE к некоторым текстовым полям, которые отображаются в пользовательском метабоксе. Все форматирование работает отлично, за исключением того, что редактор не сохраняет теги <p>
или <br/>
. Он не сохраняет переносы строк.
TinyMCE настроен следующим образом:
wp_tiny_mce(true, array('editor_selector' => $field['class'] ) );
'<textarea name="', $field['id'], '" class="', $field['class'], '" id="', $field['id'], '" cols="60" rows="8" style="width:97%">', $meta ? esc_html($meta) : $field['std'], '</textarea>';
И всё это работает отлично. Все кнопки форматирования работают нормально, кроме тегов <P>
и <BR>
.
Я не уверен, удаляет ли редактор эти теги до или после сохранения мета-данных записи.
Есть идеи?

Я недавно заставил это работать. Вам нужно найти и заменить metaname
на имя вашего метабокса.
Ключом к сохранению форматирования было использование wpautop();
при сохранении данных.
add_action( 'add_meta_boxes', 'add_metaname_box');
add_action( 'save_post', 'metaname_save');
function add_metaname_box() {
add_meta_box(
'metaname_id',
__( 'Текст метабокса', 'metaname_textdomain'),
'metaname_custom_box',
'page'
);
}
function metaname_custom_box() {
global $post;
wp_nonce_field( plugin_basename( __FILE__ ), 'metaname_noncename' );
$data = get_post_meta($post->ID, 'metaname_custom_box', true);
echo <<<EOT
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery("#metaname_custom_box").addClass("mceEditor");
if ( typeof( tinyMCE ) == "object" &&
typeof( tinyMCE.execCommand ) == "function" ) {
tinyMCE.execCommand("mceAddControl", false, "metaname_custom_box");
}
});
</script>
<textarea id="metaname_custom_box" name="metaname_custom_box">$data</textarea>
EOT;
}
function metaname_save($post_id) {
global $post;
// Проверка
if ( !wp_verify_nonce( $_POST['metaname_noncename'], plugin_basename(__FILE__) )) {
return $post_id;
}
if ( 'page' == $_POST['post_type'] ) {
if ( !current_user_can( 'edit_page', $post_id ))
return $post_id;
} else {
if ( !current_user_can( 'edit_post', $post_id ))
return $post_id;
}
$key = 'metaname_custom_box';
$data = wpautop($_POST[$key]);
// Добавление, обновление и удаление
if(get_post_meta($post_id, $key) == "")
add_post_meta($post_id, $key, $data, true);
elseif($data != get_post_meta($post_id, $key, true))
update_post_meta($post_id, $key, $data);
elseif($data == "")
delete_post_meta($post_id, $key, get_post_meta($post_id, $key, true));
}

Вот (упрощенная версия) того, что я использую для кастомной настройки TinyMCE:
// http://tinymce.moxiecode.com/wiki.php/Configuration
function cbnet_tinymce_config( $init ) {
// Не удалять переносы строк
$init['remove_linebreaks'] = false;
// Возвращаем $init обратно в WordPress
return $init;
}
add_filter('tiny_mce_before_init', 'cbnet_tinymce_config');
Полагаю, это то, что вы уже пробовали?
РЕДАКТИРОВАНО:
Возможно, вам потребуется добавить другие настройки, например:
// Конвертировать символы новой строки в теги BR
$init['convert_newlines_to_brs'] = true;
// Не удалять избыточные теги BR
$init['remove_redundant_brs'] = false;
Поэкспериментируйте с параметрами конфигурации TinyMCE и найдите тот, который вам нужно изменить.

Нет, я этого не использовал. Как мне отфильтровать мой wp_tiny_mce с помощью вашей функции?

Смотрите мою правку. Возможно, вы обращаетесь не к тому параметру конфигурации.

Хмм, всё равно не работает. Насколько я могу судить, фильтр вообще не оказывает никакого эффекта. Это для плагина, поэтому код фильтра размещён в основном файле плагина. Может, его нужно передать через хука init?

Возможно, нашел более простое решение для этой проблемы:
В самом шаблоне измените это:
<?php echo get_the_content());?>
на это:
<?php echo wpautop(get_the_content());?>
Таким образом функция wpautop() добавляет теги, которые были удалены TinyMCE, на уровне отдельных шаблонов.

Почему бы не использовать новую функцию WordPress wp_editor
для рендеринга TinyMCE. Таким образом, все будет обработано автоматически. А при выводе контента пользователю примените фильтр the_content
.
Например так:
$meta = "содержимое метабокса";
echo apply_filters('the_content', $meta);
Фильтр the_content
автоматически преобразует разрывы строк в теги <br>
и <p>
.

Это для тех, кто использует метабоксы в WordPress:
Название плагина: Meta Box
Ссылка на плагин: deluxeblogtips com/meta-box
Я модифицировал файл /vendor/meta-box/inc/fields/wysiwyg.php
В статической функции:
static function html( $html, $meta, $field )
//сразу после else я добавил:
$meta = html_entity_decode($meta); //
//и это решило проблему ;)
-- НО ЛУЧШЕЕ РЕШЕНИЕ --
Добавьте это в functions.php, оно вызывает фильтр из плагина метабоксов:
function meta_wysiwyg_antes_save($meta)
{
$meta = html_entity_decode($meta);
return $meta;
}
add_filter("rwmb_(ID-OF-METABOX-FIELD)_meta", "meta_wysiwyg_antes_save"); //в meta-box.php строка 194

Может быть, у кого-то есть более конструктивное мнение? :) Куда я могу вставить этот код в functions.php?
