Dodatkowe paski edytora TinyMCE <p> i znaczniki <br>?

22

Cześć, dodałem TinyMCE do niektórych obszarów tekstowych wyświetlanych w niestandardowym polu meta. Całe formatowanie działa doskonale, z wyjątkiem tego, że edytor nie zapisze <p>ani nie doda <br/>tagów. Nie zachowuje podziałów linii.

TinyMCE jest skonfigurowany w następujący sposób:

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

I to wszystko działa idealnie dobrze. Wszystkie przyciski formatowania działają dobrze, z wyjątkiem znaczników <P>i <BR>.

Nie jestem pewien, czy redaktor usuwa je przed lub po zapisaniu meta postu.

Pomysły?

Pippin
źródło
Udało mi się zmusić go do działania w jeden sposób. Przez skopiowanie funkcji z rdzenia i przejście 'remove_linebreaks' => truedo 'remove_linebreaks' => false. Ale to nie działa, jeśli podam 'remove_linebreaks' => falsew tablicy ustawień przekazanej do funkcji
Pippin
@Arthur Carabott tak, to też załatwiło sprawę dla mnie. Dodajmy link do dokumentacji: codex.wordpress.org/Function_Reference/wpautop Bye!
Luca Reghellin,
Widzimy bardzo dziwną rzecz. Wpisy, które są ręcznie wprowadzane / kopiowane, mają zachowane podziały podczas edycji. Posty, które zaimportowaliśmy, podlegają edytorowi, który usuwa podziały wierszy podczas edycji.
JCL1178

Odpowiedzi:

16

Niedawno mam to działa. Powinieneś wyszukać i zastąpić metanameswoją nazwę pola meta.

Kluczem do zachowania formatowania było wpautop();zapisywanie danych.

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));        
}
Arthur Carabott
źródło
update_post_metabędzie również, add_post_metajeśli meta_keywstawiane nie istnieje.
vmassuchetto
5

Oto (zredukowana wersja) tego, czego używam do niestandardowej konfiguracji 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');

Zakładam, że już tego próbowałeś?

EDYTOWAĆ:

Konieczne może być wprowadzenie innych zmian w konfiguracji, takich jak:

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

Pobaw się z parametrów konfiguracyjnych TinyMCE i znaleźć taki, który trzeba zmienić.

Chip Bennett
źródło
Nie, nie użyłem tego. Jak przefiltrować mój wp_tiny_mce za pomocą twojej funkcji?
Pippin
Upuść kod functions.php.
Chip Bennett
Hmmm, to nie działa.
Pippin
Zobacz moją edycję. Być może celujesz w niewłaściwy parametr konfiguracyjny.
Chip Bennett
1
Powinien już zostać wciągnięty, w tiny_mce_before_init. Nie masz go w innej funkcji, obiekcie itp., Prawda?
Chip Bennett
5

Wygląda na to, że nieco się to zmieniło w kolejnych wersjach Wordpress. Możesz teraz w ten sposób wyłączyć tę funkcję:

add_filter('tiny_mce_before_init', function($init) {
    $init['wpautop'] = false;
    return $init;
}
Nathan Crause
źródło
3

Znaleziono być może prostsze obejście tego:

w rzeczywistym szablonie zmień to:

<?php echo get_the_content());?>

do tego:

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

W ten sposób wpautop () dodaje tagi usuwane przez TinyMCE na szablonie według szablonu.

patricksayshi
źródło
2

dlaczego nie użyjesz nowej funkcji WordPress wp_editordo renderowania tinymce. W ten sposób wszystko zostanie załatwione. A kiedy wyświetlasz zawartość użytkownikowi, zastosuj filtr the_content.

Lubię to:

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

Filtr the_contentautomatycznie zamieni hamulce łączące na <br>i <p>.

Sisir
źródło
W chwili opublikowania tego pytania funkcja wp_editor () była niedostępna.
Pippin
1

Kolejne proste rozwiązanie: użyj skrótów!

Umieść ten kod w functions.php i użyj [br] w edytorze treści - HTML lub Visual - gdziekolwiek chcesz, aby pojawił się znacznik br.

add_shortcode("br", "br_tag");

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

}
Tapefreak
źródło
1

to jest dla tych, którzy używają metaboksów dla wordpress: Nazwa wtyczki: Meta Box URI wtyczki: deluxeblogtips com / meta-box

zmodyfikowałem /vendor/meta-box/inc/fields/wysiwyg.php w funkcji statycznej:

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

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

- ALE LEPSZE ROZWIĄZANIE JEST -

Umieść to w functions.php, wywołuje filtr z wtyczki 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
claudio
źródło
Teraz nie możesz już aktualizować wtyczki. Niezbyt dobre rozwiązanie.
fuxia
Masz trochę bardziej konstruktywną opinię? :) Gdzie mogę umieścić ten kod na functions.php?
claudio,
Podłącz się save_postwcześniej niż wtyczkę i przygotuj wartość w osobnej funkcji?
fuxia