Ответ 1
Более элегантное решение:
update_post_meta(
$post_id,
'message',
implode( "\n", array_map( 'sanitize_text_field', explode( "\n", $_POST['message'] ) ) )
);
Если я дезинфицирую и сохраняю некоторый метатекст (называемый "сообщением" ), введенный пользователем, как это...
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(). Итак, как я могу дезинфицировать текст, введенный пользователем, не теряя своих разрывов строк?
Более элегантное решение:
update_post_meta(
$post_id,
'message',
implode( "\n", array_map( 'sanitize_text_field', explode( "\n", $_POST['message'] ) ) )
);
Так как Wordpress 4.7.0
Используйте sanitize_textarea_field вместо sanitize_text_field
Если разрывы строк - это единственное, что 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.
Я пытаюсь использовать этот метод самостоятельно и обнаруживаю, что апострофы в текстовом поле сбрасываются обратными косыми чертами на пути, которые затем не удаляются esc_textarea на выходе.
Итак, мне пришлось использовать
stripslashes( esc_textarea( $THING ) )
чтобы успешно удалить их из текстового поля при повторном просмотре.