Zusätzliche TinyMCE-Editorstreifen <p> und <br> -Tags?

22

Hallo Leute, ich habe ein TinyMCE zu einigen Textbereichen hinzugefügt, die in einer benutzerdefinierten Meta-Box angezeigt werden. Die gesamte Formatierung funktioniert einwandfrei, mit der Ausnahme, dass der Editor keine Daten <p>oder <br/>Tags speichert . Die Zeilenumbrüche bleiben nicht erhalten.

Der TinyMCE ist folgendermaßen eingerichtet:

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

Und das alles funktioniert einwandfrei. Alle Formatierungsschaltflächen außer den Tags <P>und funktionieren <BR>einwandfrei.

Ich bin nicht sicher, ob der Editor sie entfernt, bevor oder nachdem das Post-Meta gespeichert wurde.

Ideen?

Pippin
quelle
Ich habe es geschafft, es auf eine Art zum Laufen zu bringen. Durch Duplizieren der Funktion vom Kern und Wechseln 'remove_linebreaks' => truezu 'remove_linebreaks' => false. Aber es funktioniert nicht, wenn ich 'remove_linebreaks' => falsein den Einstellungen ein Array an die Funktion übergeben
Pippin
@Arthur Carabott Ja, das hat den Trick auch für mich getan. Fügen wir einen Link zu den Dokumenten hinzu: codex.wordpress.org/Function_Reference/wpautop Bye!
Luca Reghellin
Wir sehen eine sehr seltsame Sache. Bei manuell eingegebenen / kopierten Posts bleiben die Pausen beim Bearbeiten erhalten. Von uns importierte Posts unterliegen dem Editor, der beim Bearbeiten die Zeilenumbrüche wegbläst.
JCL1178,

Antworten:

16

Ich habe das kürzlich zum Laufen gebracht. Sie sollten metanamemit Ihrem Meta-Box-Namen suchen und ersetzen .

Der Schlüssel zur Aufrechterhaltung der Formatierung war das wpautop();Speichern der Daten.

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
quelle
update_post_metawird auch, add_post_metawenn der meta_keyeinzufügende nicht existiert.
Vmassuchetto
5

Hier ist (eine abgespeckte Version von), was ich verwende, um TinyMCE individuell zu konfigurieren:

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

Ich nehme an, das hast du schon versucht?

BEARBEITEN:

Möglicherweise müssen Sie einige andere Konfigurationsänderungen vornehmen, z.

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

Spielen Sie mit den TinyMCE-Konfigurationsparametern und finden Sie die, die Sie ändern müssen.

Chip Bennett
quelle
Nein, das habe ich nicht benutzt. Wie würde ich mein wp_tiny_mce mit Ihrer Funktion filtern?
Pippin
Gib den Code ein functions.php.
Chip Bennett
Hmmm, das funktioniert nicht.
Pippin
Siehe meine Bearbeitung. Möglicherweise zielen Sie nicht auf den richtigen Konfigurationsparameter.
Chip Bennett
1
Es sollte schon süchtig werden, in tiny_mce_before_init. Sie haben es nicht in einer anderen Funktion oder einem anderen Objekt usw., oder?
Chip Bennett
5

Dies scheint sich in späteren Versionen von Wordpress ein wenig geändert zu haben. Sie können diese Funktionalität nun folgendermaßen deaktivieren:

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

Fand vielleicht eine einfachere Lösung dafür:

Ändern Sie auf der tatsächlichen Vorlage Folgendes:

<?php echo get_the_content());?>

dazu:

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

Auf diese Weise fügt wpautop () die von TinyMCE entfernten Tags auf Vorlagenbasis hinzu.

patricksayshi
quelle
2

Warum benutzt du nicht die neue WordPress-Funktion wp_editor, um den Tinymce zu rendern? Auf diese Weise wird alles erledigt. Und wenn Sie dem Benutzer den Inhalt zeigen, wenden Sie den Filter an the_content.

So was:

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

Der Filter the_contentwandelt die Verbindungsbremsen automatisch in <br>und um <p>.

Sisir
quelle
Zum Zeitpunkt der Veröffentlichung dieser Frage war die Funktion wp_editor () nicht verfügbar.
Pippin
1

Eine andere einfache Lösung: Verwenden Sie Shortcodes!

Fügen Sie diesen Code in die Datei functions.php ein und verwenden Sie [br] im Inhaltseditor (HTML oder Visual), wo immer ein br-Tag angezeigt werden soll.

add_shortcode("br", "br_tag");

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

}
Tapefreak
quelle
1

Dies ist für diejenigen, die die Metaboxen für WordPress verwenden: Plugin-Name: Meta-Box Plugin-URI: deluxeblogtips com / meta-box

Ich habe die Datei /vendor/meta-box/inc/fields/wysiwyg.php in der statischen Funktion geändert:

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

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

- ABER DIE BESSERE LÖSUNG IST -

Gib das in die Datei functions.php ein, sie ruft den Filter aus der Metabox Pluggin auf:

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
quelle
Jetzt können Sie das Plugin nicht mehr aktualisieren. Keine gute Lösung.
fuxia
Haben einige eine etwas konstruktivere Meinung? :) Wo kann ich diesen Code auf functions.php setzen?
Claudio
Haken Sie in save_postfrüher als das Plugin und bereitet den Wert in einer separaten Funktion?
fuxia