WordPress - 如何从textarea中清理多行文本而不会丢失换行符?

时间:2013-12-07 17:03:15

标签: php wordpress textarea line-breaks sanitize

如果我清理并保存用户输入的一些元文本(称为“消息”),就像这样......

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()函数正在删除换行符。那么如何在不丢失换行符的情况下清理用户输入的文本呢?

5 个答案:

答案 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()) 才能工作。