Come fare l'escape del codice HTML mantenendo l'HTML consentito
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!
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()

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 ); ?>">
- Escape e traduzione HTML:
<label ..><?php esc_html__( 'Testo', 'textdomain' ); ?></label>

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 );

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.

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.
