TinyMCE редактор удаляет теги <p> и <br/>?

22 апр. 2011 г., 18:25:16
Просмотры: 25.7K
Голосов: 23

Привет всем, я добавил 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>.

Я не уверен, удаляет ли редактор эти теги до или после сохранения мета-данных записи.

Есть идеи?

3
Комментарии

Мне удалось заставить это работать одним способом. Дублируя функцию из ядра и изменя 'remove_linebreaks' => true на 'remove_linebreaks' => false. Но это не работает, если я указываю 'remove_linebreaks' => false в массиве настроек, передаваемом в функцию

Pippin Pippin
22 апр. 2011 г. 22:29:18

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

JCL1178 JCL1178
8 февр. 2012 г. 00:31:04

@Arthur Carabott да, это сработало и для меня. Давайте добавим ссылку на документацию: http://codex.wordpress.org/Function_Reference/wpautop Пока!

Luca Reghellin Luca Reghellin
18 нояб. 2011 г. 17:02:39
Все ответы на вопрос 7
1
16

Я недавно заставил это работать. Вам нужно найти и заменить 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));        
}
23 мая 2011 г. 00:07:00
Комментарии

update_post_meta также выполнит add_post_meta, если вставляемый meta_key не существует.

vmassuchetto vmassuchetto
9 дек. 2011 г. 15:26:14
0

Похоже, в последующих версиях WordPress это немного изменилось. Теперь можно отключить эту функцию следующим образом:

add_filter('tiny_mce_before_init', function($init) {
    $init['wpautop'] = false;
    return $init;
}
4 окт. 2015 г. 05:12:01
6

Вот (упрощенная версия) того, что я использую для кастомной настройки 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 и найдите тот, который вам нужно изменить.

26 апр. 2011 г. 20:28:06
Комментарии

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

Pippin Pippin
27 апр. 2011 г. 07:06:07

Добавьте этот код в functions.php.

Chip Bennett Chip Bennett
27 апр. 2011 г. 16:07:17

Хм, это не работает.

Pippin Pippin
27 апр. 2011 г. 17:04:53

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

Chip Bennett Chip Bennett
27 апр. 2011 г. 17:20:16

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

Pippin Pippin
27 апр. 2011 г. 18:13:50

Он уже должен быть подключён через tiny_mce_before_init. У вас он случайно не внутри другой функции или объекта и т.д.?

Chip Bennett Chip Bennett
27 апр. 2011 г. 18:19:30
Показать остальные 1 комментариев
0

Возможно, нашел более простое решение для этой проблемы:

В самом шаблоне измените это:

<?php echo get_the_content());?>

на это:

<?php echo wpautop(get_the_content());?>

Таким образом функция wpautop() добавляет теги, которые были удалены TinyMCE, на уровне отдельных шаблонов.

8 мар. 2013 г. 17:09:17
1

Почему бы не использовать новую функцию WordPress wp_editor для рендеринга TinyMCE. Таким образом, все будет обработано автоматически. А при выводе контента пользователю примените фильтр the_content.

Например так:

$meta = "содержимое метабокса";
echo apply_filters('the_content', $meta);

Фильтр the_content автоматически преобразует разрывы строк в теги <br> и <p>.

21 янв. 2012 г. 22:44:40
Комментарии

На момент публикации этого вопроса функция wp_editor() была недоступна.

Pippin Pippin
23 янв. 2012 г. 06:17:24
0

Ещё одно простое решение: используйте шорткоды!

Поместите этот код в файл functions.php и используйте [br] в редакторе контента — HTML или визуальном — там, где вам нужно вставить тег br.

add_shortcode("br", "br_tag");

function br_tag(){
    return("<br/>");                            
}
31 авг. 2012 г. 00:11:59
3

Это для тех, кто использует метабоксы в 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
6 нояб. 2013 г. 13:42:43
Комментарии

Теперь вы не можете обновлять плагин. Не самое лучшее решение.

fuxia fuxia
6 нояб. 2013 г. 14:26:32

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

ClaudioC ClaudioC
6 нояб. 2013 г. 19:15:06

Подключиться к хуку save_post раньше плагина и подготовить значение в отдельной функции?

fuxia fuxia
6 нояб. 2013 г. 19:33:58