如果我清理并保存用户输入的一些元文本(称为“消息”),就像这样......
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 codex,sanitize_text_field()函数正在删除换行符。那么如何在不丢失换行符的情况下清理用户输入的文本呢?
答案 0 :(得分:33)
更优雅的解决方案:
update_post_meta(
$post_id,
'message',
implode( "\n", array_map( 'sanitize_text_field', explode( "\n", $_POST['message'] ) ) )
);
答案 1 :(得分:32)
自Wordpress 4.7.0起
使用sanitize_textarea_field代替sanitize_text_field
答案 2 :(得分:1)
如果换行符只是 件事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));
1}}。
sanitize_*
如果您想更多地自定义清理,您可能应该依赖WordPress提供的更细粒度的{{1}}函数。
答案 3 :(得分:0)
我一直在尝试自己使用这个方法,并发现textarea中的撇号在进入途中被反斜杠转义,然后在出路时不被esc_textarea删除。
所以我最终不得不使用
stripslashes( esc_textarea( $THING ) )
在重新显示时成功从textarea中删除它们。
答案 4 :(得分:0)
尝试了一切,我能够完成这项工作的唯一方法是这样的:
function.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'),
));
显示在前面(例如footer.php)
<?php $custom_field= get_theme_mod('custom_field');
if ($custom_field) {
echo nl2br( esc_html( $custom_field) );
} ?>
必须使用 'sanitize_callback' => 'sanitize_textarea_field'
和 nl2br( esc_html())
才能工作。