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
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
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.