Come fare l'escape del codice HTML mantenendo l'HTML consentito

22 ott 2016, 06:00:29
Visualizzazioni: 26.8K
Voti: 6

Sono un po' confuso su come usare la funzione di escape su una variabile che contiene codice HTML. Ho provato a seguire questa guida https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data ma non sono riuscito a capire come fare. Ecco il mio codice:

    $output = '<p>';
    $output .= '<label for="' . esc_attr( $this->get_field_id( 'title' ) ) . '">Titolo:</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;

La mia domanda è: come posso fare l'escape di $output senza perdere l'HTML al suo interno? Lo chiedo perché sto inviando questo codice su ThemeForest, da dove sono stato rifiutato alcune volte per non aver fatto l'escape del codice. Quindi ora penso sia meglio fare l'escape di queste variabili, giusto? Grazie!

3
Commenti

Escape HTML = Perdi HTML!

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

Nota che la variabile $output è completamente inutile qui, tutto ciò che fa è introdurre un'opportunità per un escape prematuro e una variabile impossibile da gestire.

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

Mi sto imbattendo in un problema simile durante la revisione, come hai superato la revisione in questo caso?

shababhsiddique shababhsiddique
1 ott 2021 08:00:19
Tutte le risposte alla domanda 5
0
14

Stai cercando la funzione wp_kses(). https://developer.wordpress.org/reference/functions/wp_kses/

Ci sono anche altre funzioni di supporto come wp_kses_post() e wp_kses_data()

24 set 2018 00:24:19
1

1. Escape dei dati

  • Escape degli attributi <label for="<?php esc_attr( $tid ); ?>">

  • Escape HTML <label ..><?php esc_html( 'Testo' ); ?></label>


2. Traduzione e Escape

Nota:

  • textdomain dovrebbe essere uno slug univoco del tuo tema/plugin.
  • La stringa tradotta dovrebbe contenere un valore statico. Se hai un valore dinamico allora non è necessario renderlo pronto per la traduzione.


1. Escape e traduzione degli attributi: <label for="<?php esc_attr( $tid ); ?>">

Non è necessario renderlo pronto per la traduzione. Se hai una stringa statica con $tid allora devi renderla pronta per la traduzione, es:

Non valido:

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

Valido:

<label for="<?php printf( esc_attr__( '%s testo statico', 'textdomain' ), $tid ); ?>">
  1. Escape e traduzione HTML: <label ..><?php esc_html__( 'Testo', 'textdomain' ); ?></label>
8 mar 2018 10:07:19
Commenti

Questo commento non risponde alla domanda. Sia esc_attr() che esc_html() rimuovono qualsiasi HTML nella stringa.

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

prova con questo metodo. funziona per me. echo con escape html.

$output = '<p>';
$output .= '<label for="' . esc_attr( $this->get_field_id( 'title' ) ) . '">Titolo:</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
Commenti

Se stai utilizzando checkbox devi aggiungere così

`$allowed_html = array( 'input' => array( 'type' => array(), 'id' => array(), 'name' => array(), 'value' => array(), 'checked' => array(), 'onclick' => array() <== Questo è opzionale ),

); `

ApsaraAruna ApsaraAruna
8 set 2022 13:29:39
0

Il tuo codice sembra funzionare correttamente anche per me. L'HTML nel tag value viene preservato.

La mia unica raccomandazione sarebbe quella di racchiudere tutte le stringhe di testo in __() o _e() in modo che possano essere facilmente tradotte. Questo è un ottimo punto di vendita su marketplace come ThemeForest, dato che non tutti vogliono usare l'inglese.

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

Scopri di più su I18n nel WordPress Codex.

22 ott 2016 06:19:16
0

Se vuoi farlo seguendo lo "stile WordPress", non memorizzeresti il tuo HTML in una variabile temporanea, ma lo visualizzeresti direttamente.

?> 
<p>
    <label for="<?php esc_attr_e( $this->get_field_id( 'title' ) ); ?>"> <?php _e('Titolo:', '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.S: Dovresti anche internazionalizzare le tue stringhe di testo.

12 dic 2016 18:45:40