Додатковий редактор 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в масиві налаштувань, переданому функції
Піппін

@Arthur Carabott так, це зробив трюк і для мене. Додамо посилання на документи: 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

чому б не використати Wordpress нову функцію wp_editorдля візуалізації tinymce. Таким чином все вийде. І коли ви показуєте вміст користувачеві, застосуйте фільтр the_content.

Подобається це:

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

Фільтр автоматично the_contentавтоматично перетворює гальмо посилання на <br>та <p>.


На момент розміщення цього питання функція wp_editor () була недоступною.
Піппін

1

Ще одне просте рішення: використовуйте короткі коди!

Розмістіть цей код у function.php та використовуйте [br] у редакторі вмісту - HTML чи візуальний - там, де ви хочете, щоб тег 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 ;)

- АЛЕ НАЙКРАЩЕ РІШЕННЯ -

Помістіть це у function.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"); //en meta-box.php 194

Тепер ви більше не можете оновлювати плагін. Не вдале рішення.
fuxia

Маєте трохи більш конструктивну думку? :) Де я можу поставити цей код на function.php?
клаудіо

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