Дополнительный редактор TinyMCE удаляет теги <p> и <br>?


22

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

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

Идеи?


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

@ Артур Кеработт, да, это тоже помогло мне. Давайте добавим ссылку на документы: codex.wordpress.org/Function_Reference/wpautop Пока!
Лука Регеллин

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

Ответы:


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 text', '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;

    // Verify
     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]);

     // New, Update, and Delete
     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));        
}

update_post_metaбудет также, add_post_metaесли meta_keyвставляемый элемент не существует.
vmassuchetto

5

Вот (урезанная версия), которую я использую для пользовательской настройки TinyMCE:

// http://tinymce.moxiecode.com/wiki.php/Configuration
function cbnet_tinymce_config( $init ) {

    // Don't remove line breaks
    $init['remove_linebreaks'] = false; 

    // Pass $init back to WordPress
    return $init;
}
add_filter('tiny_mce_before_init', 'cbnet_tinymce_config');

Я полагаю, это то, что вы уже пробовали?

РЕДАКТИРОВАТЬ:

Возможно, вам придется включить некоторые другие изменения конфигурации, такие как:

// Convert newline characters to BR tags
$init['convert_newlines_to_brs'] = true; 
// Do not remove redundant BR tags
$init['remove_redundant_brs'] = false;

Поиграйте с параметрами конфигурации TinyMCE и найдите тот, который вам нужно изменить.


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

Оставьте код в functions.php.
Чип Беннетт

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

Смотрите мое редактирование. Возможно, вы не указали правильный параметр конфигурации.
Чип Беннетт

1
Это должно уже зацепить, в tiny_mce_before_init. У вас его нет внутри другой функции или объекта и т. Д.?
Чип Беннетт

5

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

add_filter('tiny_mce_before_init', function($init) {
    $init['wpautop'] = false;
    return $init;
}

3

Найден, возможно, более простой обходной путь для этого:

на фактическом шаблоне измените это:

<?php echo get_the_content());?>

к этому:

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

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


2

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

Так:

$meta = "content of the metabox";
echo apply_filters('the_content', $meta);

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


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

1

Другое простое решение: используйте шорткоды!

Поместите этот код в functions.php и используйте [br] в редакторе контента - HTML или visual - везде, где вы хотите, чтобы появился тег br.

add_shortcode("br", "br_tag");

function br_tag(){
    return("<br/>");                            

}

1

это для тех, кто использует метабоксы для WordPress: Имя плагина: URI плагина Meta Box: deluxeblogtips com / meta-box

я изменил /vendor/meta-box/inc/fields/wysiwyg.php в статической функции:

static function html( $html, $meta, $field )

//just after the else i have added :
$meta = html_entity_decode($meta); // 
//and solve the problem ;)

- НО ЛУЧШЕЕ РЕШЕНИЕ -

Поместите это в functions.php, он вызывает фильтр из плагина metaboxes:

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"); //en meta-box.php 194

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

Есть немного более конструктивное мнение? :) Где я могу поместить этот код на functions.php?
Клаудио

Зацепиться save_postраньше, чем плагин и подготовить значение в отдельной функции?
fuxia
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.