WordPress – Wie kann man mehrzeiligen Text aus einem Textbereich bereinigen, ohne Zeilenumbrüche zu verlieren?

Lesezeit: 3 Minuten

Wenn ich einen vom Benutzer eingegebenen Metatext (genannt “Nachricht”) wie folgt bereinige und speichere …

update_post_meta($post_id, 'message', sanitize_text_field($_POST['message']));

… und dann den Text abrufen und versuchen, ihn wie folgt erneut anzuzeigen …

echo '<textarea id="message" name="message">' . esc_textarea( get_post_meta( $post->ID, 'message', true ) ) . '</textarea>';

…alle Zeilenumbrüche gehen verloren.

Gemäß dem WordPress-Codex werden die Zeilenumbrüche durch die Funktion sanitize_text_field() entfernt. Wie kann ich also den vom Benutzer eingegebenen Text bereinigen, ohne dass die Zeilenumbrüche verloren gehen?

Seit WordPress 4.7.0

Verwenden sanitize_textarea_field statt sanitize_text_field

  • Danke dafür. Es ist eine Schande, dass es keine Möglichkeit gibt, die oberste Antwort zu ändern – besonders. da es Jahre dauern kann, bis diese Antwort mehr positive Stimmen erhält als die ausgewählte Top-Antwort.

    – Ban-Geoengineering

    8. Mai 2017 um 7:39 Uhr

  • Das ist der, nach dem Sie alle suchen. Sollte die anderen Antworten ersetzen.

    – Henrik Petterson

    13. Mai 2017 um 11:34 Uhr

  • Dies ist die wahre Lösung.

    – Nathan Hangen

    2. November 2017 um 4:21 Uhr

Benutzeravatar von mpatek
mpatek

Eine elegantere Lösung:

update_post_meta(
    $post_id,
    'message',
    implode( "\n", array_map( 'sanitize_textarea_field', explode( "\n", $_POST['message'] ) ) )
);

Verwenden sanitize_text_field wenn Sie das Textfeld bereinigen möchten.

  • Danke – das ist nicht nur elegant, sondern genial.

    – Ryan Burney

    8. Dezember 2014 um 3:58 Uhr

  • Ich würde die Benutzereingabe nicht ändern, sondern einfach ein Post-Meta einfügen, indem ich direkt $wpdb->query() verwende, was die Langeweile von WordPress bei der Meta-Eingabe-Bereinigung vermeiden würde, die Sie für Ihren speziellen Fall nicht benötigen.

    – Meglio

    10. Juli 2015 um 1:29 Uhr

Wenn Zeilenumbrüche das sind nur Ding sanitize_text_field ist das Entfernen, das Sie behalten möchten, könnten Sie gerade str_replace zum "\n" vor und nach dem Anruf sanitize_text_field.

$fake_newline="--OMGKEEPTHISNEWLINE--"; # or some unique string
$escaped_newlines = str_replace("\n", $fake_newline, $_POST['message']);
$sanitized = sanitize_text_field($escaped_newlines);
update_post_meta($post_id, 'message', str_replace($fake_newline", "\n", $sanitized));

Wenn Sie die Bereinigung stärker anpassen möchten, sollten Sie wahrscheinlich auf eine feinere Granularität setzen sanitize_* Funktionen, die von WordPress bereitgestellt werden.

  • Danke dafür. Ein paar Fehler in Ihrem Code, aber ich verstehe die Idee. Hier ist der Arbeitscode: $NEW_LINE = “\n”; $NEW_LINE_SUBSTITUTE = “NEWLINE-SUBSTITUTE”; update_post_meta($post_id, ‘message’, sanitize_text_field( str_replace($NEW_LINE, $NEW_LINE_SUBSTITUTE, $_POST[‘message’] )) ); echo ‘‘;

    – Ban-Geoengineering

    7. Dezember 2013 um 17:43 Uhr

Benutzeravatar von piersb
piersb

Ich habe versucht, diese Methode selbst zu verwenden, und festgestellt, dass Apostrophe im Textbereich beim Hineingehen durch Backslashes maskiert werden, die dann beim Hinausgehen nicht von esc_textarea entfernt werden.

Also habe ich am Ende verwenden müssen

stripslashes( esc_textarea( $THING ) ) 

um sie bei der erneuten Anzeige erfolgreich aus dem Textbereich zu entfernen.

Ich habe alles versucht, der einzige Weg, wie ich das zum Laufen bringen konnte, war folgender:

Funktion.php

wp_customize->add_section('section_id', array(
    'title' => __('custom_section', 'theme_name'),
    'priority' => 10,
    'description' => 'Custom section description',
));

$wp_customize->add_setting('custom_field', array(
    'capability' => 'edit_theme_options',
    'sanitize_callback' => 'sanitize_textarea_field',
));

$wp_customize->add_control('custom_field', array(
    'type' => 'textarea',
    'section' => 'custom_section',
    'label' => __('Custom text area with multiline brakes'),
));

Anzeige im Vordergrund (z. B. footer.php)

<?php $custom_field= get_theme_mod('custom_field');
    if ($custom_field) {
        echo nl2br( esc_html( $custom_field) );
} ?>

Verwenden müssen 'sanitize_callback' => 'sanitize_textarea_field' und nl2br( esc_html()) arbeiten.

1404730cookie-checkWordPress – Wie kann man mehrzeiligen Text aus einem Textbereich bereinigen, ohne Zeilenumbrüche zu verlieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy