WordPress nl2br在保存metabox值时不会将换行符转换为html换行符

时间:2019-07-29 作者:Subrata Sarkar

我尝试了可能的解决方案\\n<br /> 从我的自定义帖子类型<textarea> metabox,但它不工作。

我使用的是定制主题,没有安装其他插件。

function abhijaan_itinerary_metabox( $post ) {
    wp_nonce_field( \'trek_itinerary\', \'trek_itinerary_nonce\' );
    $content = get_post_meta( $post->ID, \'_trek_itinerary\', true );
    $content = preg_replace( \'#<br\\s*/?>#i\', "\\n", $content );
    ?>
    <textarea class="trek_inputs required" name="txtItinerary" id="txtItinerary" cols="30" rows="10" placeholder="Itinerary" required><?php echo $content ?></textarea>
    <?php
}


function save_custom_metaboxes( $post_id ) {
   ...
   $itinerary = sanitize_text_field( $_POST[\'txtItinerary\'] );
   $itinerary = nl2br( $itinerary ); // NOT WORKING!
   update_post_meta( $post_id,  \'_trek_itinerary\', $itinerary );
   ...
}

add_action( \'save_post\',  \'save_custom_metaboxes\' );
使用前<textarea>, 我试过了WYSIWYG 还有编辑器。这也有同样的问题。

function abhijaan_itinerary_metabox( $post ) {
    wp_nonce_field( \'trek_itinerary\', \'trek_itinerary_nonce\' );
    $content = get_post_meta( $post->ID, \'_trek_itinerary\', true );

    wp_editor(
            $content,
            \'txtItinerary\',
            array( \'media_buttons\' => false )
    );
}
我希望将数据保存为<br /> 在里面wp_postmeta 表,但它没有发生。我有多个元数据库正在使用<textarea>. 出什么事了?:(

UPDATE 1

事实上,默认的帖子编辑器(内容区域)并没有保存段落!但如果我使用其他HTML格式(如项目符号),它们就会被保存。这只是<p> 任何地方都不会保存的标签!

UPDATE 2<我正在使用WordPress 5.2.2。Classic Editor 插件未安装。然而,在我的CPT中,默认编辑器是旧的,但是当我编写一个普通的Post (非CPT)。我对CPT中的旧编辑器很满意,但不知道为什么这些段落总是被忽略!

UPDATE 3 (Screenshots)

后端:enter image description here

前端:enter image description here

UPDATE 4wpautop( the_content() ) 已解决前端的内容段落问题。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

reference/description 属于sanitize_text_field():

检查是否存在无效的UTF-8,

  • 转换单个(<;字符到实体

    剥离所有标记

  • Removes line breaks, tabs, and extra whitespace

    因此,一个简单的修复方法是sanitize_textarea_field():

    功能如下sanitize_text_field(), 但是preserves new lines (\\n) and other whitespace, 是textarea元素中的合法输入。

    // In save_custom_metaboxes()
    $itinerary = sanitize_textarea_field( $_POST[\'txtItinerary\'] ); // use this one
    //$itinerary = sanitize_text_field( $_POST[\'txtItinerary\'] );   // and not this
    

    其他注释

    此外,您应该使用esc_textarea() (尽管输出可能不包含HTML标记):

    <textarea class="trek_inputs required" name="txtItinerary"...><?php echo // wrapped for clarity
      esc_textarea( $content ); ?></textarea>
    
    您还需要在每次<br />:

    $itinerary = sanitize_textarea_field( $_POST[\'txtItinerary\'] );
    $itinerary = nl2br( $itinerary );
    // Removes line break after each <br />, if any.
    $itinerary = preg_replace( "#<br />(\\r\\n|\\n|\\r)#", \'<br />\', $itinerary );