WordPress - Как дезинфицировать многострочный текст из текстового поля без потери разрыва строки?

Если я дезинфицирую и сохраняю некоторый метатекст (называемый "сообщением" ), введенный пользователем, как это...

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

... и затем восстановить и попытаться повторно отобразить текст, как это...

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

... все разрывы строк теряются.

В соответствии с кодом WordPress разрывы строк удаляются функцией sanitize_text_field(). Итак, как я могу дезинфицировать текст, введенный пользователем, не теряя своих разрывов строк?

Ответы

Ответ 1

Более элегантное решение:

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

Ответ 2

Так как Wordpress 4.7.0

Используйте sanitize_textarea_field вместо sanitize_text_field

Ответ 3

Если разрывы строк - это единственное, что sanitize_text_field удаляет, что вы хотите сохранить, вы можете просто str_replace для "\n" до и после вызова 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));

Если вы хотите настроить санитацию больше, вам, вероятно, следует полагаться на более мелкие sanitize_* функции, предоставляемые WordPress.

Ответ 4

Я пытаюсь использовать этот метод самостоятельно и обнаруживаю, что апострофы в текстовом поле сбрасываются обратными косыми чертами на пути, которые затем не удаляются esc_textarea на выходе.

Итак, мне пришлось использовать

stripslashes( esc_textarea( $THING ) ) 

чтобы успешно удалить их из текстового поля при повторном просмотре.