Cómo escapar código HTML permitiendo HTML

22 oct 2016, 06:00:29
Vistas: 26.8K
Votos: 6

estoy un poco confundido sobre cómo usar la función de escape en una variable que tiene código HTML. He intentado usar esta guía https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data pero no logré entenderlo. Aquí está mi código:

    $output = '<p>';
    $output .= '<label for="' . esc_attr( $this->get_field_id( 'title' ) ) . '">Título:</label>';
    $output .= '<input type="text" class="widefat" id="' . esc_attr( $this->get_field_id( 'title' ) ) . '" name="' . esc_attr( $this->get_field_name( 'title' ) ) . '" value="' . esc_attr( $title ) . '"';
    $output .= '</p>';   
    echo $output;

Mi pregunta es ¿cómo puedo escapar $output sin perder el HTML que contiene? Lo pregunto porque estoy enviando este código a ThemeForest, donde me han rechazado varias veces por no escapar el código. Así que ahora creo que es mejor escapar estas variables, ¿correcto? ¡gracias!

3
Comentarios

¡Escapar HTML = Perder HTML!

Nabil Kadimi Nabil Kadimi
22 oct 2016 08:13:12

Ten en cuenta que la variable $output es completamente innecesaria aquí, todo lo que hace es introducir una oportunidad para un escape temprano y una variable que es imposible de escapar.

Tom J Nowell Tom J Nowell
20 ago 2021 22:59:41

Me encuentro con un problema similar en la revisión, ¿Cómo pasaste la revisión en este caso?

shababhsiddique shababhsiddique
1 oct 2021 08:00:19
Todas las respuestas a la pregunta 5
0
14

Estás buscando wp_kses(). https://developer.wordpress.org/reference/functions/wp_kses/

Hay más funciones auxiliares como wp_kses_post() y wp_kses_data()

24 sept 2018 00:24:19
1

1. Escapado

  • Escapado de Atributo <label for="<?php esc_attr( $tid ); ?>">

  • Escapado HTML <label ..><?php esc_html( 'Texto' ); ?></label>


2. Traducción y Escapado

Nota:

  • textdomain debe ser un slug único de tu tema/plugin.
  • El texto traducido debe contener un valor estático. Si tienes un valor dinámico no es necesario hacerlo listo para traducción.


1. Escapar y traducir Atributo: <label for="<?php esc_attr( $tid ); ?>">

No es necesario hacerlo listo para traducción. Si tienes un texto estático con $tid entonces necesitas hacerlo listo para traducción, ej:

Inválido:

<label for="<?php esc_attr__( $tid, 'textdomain' ) ); ?>">
<label for="<?php printf( esc_attr__( '%s', 'textdomain' ), $tid ); ?>">

Válido:

<label for="<?php printf( esc_attr__( '%s texto estático', 'textdomain' ), $tid ); ?>">
  1. Escapar y traducir HTML: <label ..><?php esc_html__( 'Texto', 'textdomain' ); ?></label>
8 mar 2018 10:07:19
Comentarios

Este comentario no responde a la pregunta. Tanto esc_attr() como esc_html() eliminan cualquier HTML en la cadena.

Jory Hogeveen Jory Hogeveen
20 sept 2018 15:53:51
1

Prueba con este método. A mí me funciona. Echo con escape HTML.

$output = '<p>';
$output .= '<label for="' . esc_attr( $this->get_field_id( 'title' ) ) . '">Título:</label>';
$output .= '<input type="text" class="widefat" id="' . esc_attr( $this->get_field_id( 'title' ) ) . '" name="' . esc_attr( $this->get_field_name( 'title' ) ) . '" value="' . esc_attr( $title ) . '"';
$output .= '</p>';   

$allowed_html = array(
    'input' => array(
        'type'  => array(),
        'id'    => array(),
        'name'  => array(),
        'value' => array(),
     ),
);

echo wp_kses($output ,$allowed_html );
20 ago 2021 22:00:16
Comentarios

Si estás usando checkbox necesitas agregarlo así

`$allowed_html = array( 'input' => array( 'type' => array(), 'id' => array(), 'name' => array(), 'value' => array(), 'checked' => array(), 'onclick' => array() <== Esto es opcional ),

); `

ApsaraAruna ApsaraAruna
8 sept 2022 13:29:39
0

Tu código se ve y funciona bien para mí. El HTML en value se conserva correctamente.

Mi única recomendación sería envolver todas tus cadenas de texto en __() o _e() para que puedan traducirse fácilmente. Este es un buen punto de venta en sitios de mercado como ThemeForest, ya que no todo el mundo quiere usar inglés.

$output .= '<label for="' . esc_attr( $tid ) . '">' . __( 'Título:', 'your-text-domain' ) . '</label>';

Lee más sobre I18n en el Codex de WordPress.

22 oct 2016 06:19:16
0

Si quieres hacerlo a la "manera WordPress", no almacenarías tu HTML en una variable temporal, sino que lo mostrarías directamente.

?> 
<p>
    <label for="<?php esc_attr_e( $this->get_field_id( 'title' ) ); ?>"> <?php _e('Título:', 'tex-domain'); ?></label>
    <input type="text" class="widefat" id="<?php esc_attr_e( $this->get_field_id( 'title' ) ); ?>" value="<?php esc_attr_e( $title ); ?>" />
</p>
<?php 

P.D: También deberías internacionalizar tus cadenas de texto.

12 dic 2016 18:45:40