WordPress: ¿cómo desinfectar el texto de varias líneas de un área de texto sin perder los saltos de línea?

3 minutos de lectura

Si desinfecto y guardo un metatexto (llamado ‘mensaje’) ingresado por el usuario de esta manera…

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

…y luego recupere e intente volver a mostrar el texto de esta manera…

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

… todos los saltos de línea se pierden.

De acuerdo con el códice de WordPress, la función sanitize_text_field() elimina los saltos de línea. Entonces, ¿cómo puedo desinfectar el texto ingresado por el usuario sin perder sus saltos de línea?

Desde WordPress 4.7.0

Usar sanitize_textarea_field en lugar de sanitize_text_field

  • Gracias por esto. Es una pena que no haya forma de cambiar la respuesta principal, especialmente. ya que podría tomar años para que esta respuesta obtenga más votos a favor que la respuesta principal seleccionada.

    – ban-geoingeniería

    8 de mayo de 2017 a las 7:39

  • Este es el que todos ustedes están buscando. Debería reemplazar las otras respuestas.

    –Henrik Petterson

    13 de mayo de 2017 a las 11:34

  • Esta es la verdadera solución.

    –Nathan Hangen

    2 de noviembre de 2017 a las 4:21

avatar de usuario
patek

Una solución más elegante:

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

Usar sanitize_text_field si desea desinfectar el campo de texto.

  • Gracias, esto no solo es elegante, sino brillante.

    –Ryan Burney

    8 de diciembre de 2014 a las 3:58

  • No cambiaría la entrada del usuario, sino que simplemente insertaría una publicación meta usando $wpdb->query() directamente, lo que evitaría el aburrimiento de WordPress de la desinfección de la meta entrada, que no necesita para su caso particular.

    – Meglio

    10 de julio de 2015 a las 1:29

Si los saltos de línea son los solamente cosa sanitize_text_field está eliminando lo que desea conservar, podría simplemente str_replace por "\n" antes y despues de llamar 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));

Si desea personalizar más la higienización, probablemente deba confiar en métodos más detallados. sanitize_* Funciones proporcionadas por WordPress.

  • Gracias por esto. Un par de errores en tu código, pero entiendo la idea. Aquí está el código de trabajo: $NEW_LINE = “\n”; $NEW_LINE_SUBSTITUTE = “NEWLINE-SUSTITUTO”; update_post_meta($post_id, ‘mensaje’, sanitize_text_field( str_replace($NEW_LINE, $NEW_LINE_SUBSTITUTE, $_POST[‘message’] )) ); echo ‘‘;

    – ban-geoingeniería

    7 dic 2013 a las 17:43

avatar de usuario
muellesb

He estado tratando de usar este método yo mismo, y descubrí que los apóstrofes en el área de texto se escapan con barras invertidas al entrar, que luego no se eliminan con esc_textarea al salir.

Así que terminé teniendo que usar

stripslashes( esc_textarea( $THING ) ) 

para eliminarlos con éxito del área de texto al volver a mostrarlos.

Intenté todo, la única forma en que pude hacer que esto funcionara fue así:

función.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'),
));

Mostrar al frente (ej. footer.php)

<?php $custom_field= get_theme_mod('custom_field');
    if ($custom_field) {
        echo nl2br( esc_html( $custom_field) );
} ?>

Debe usar 'sanitize_callback' => 'sanitize_textarea_field' y nl2br( esc_html()) trabajar.

¿Ha sido útil esta solución?