Cum să escapi codul HTML permițând HTML-ul
Sunt puțin confuz în legătură cu modul de utilizare a funcției de escapare pentru o variabilă care conține cod HTML. Am încercat să folosesc acest ghid https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data dar nu am reușit să înțeleg exact cum.
$output = '<p>';
$output .= '<label for="' . esc_attr( $this->get_field_id( 'title' ) ) . '">Title:</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;
Întrebarea mea este cum pot escapa variabila $output fără a pierde HTML-ul din ea? Întreb acest lucru pentru că trimit acest cod pe ThemeForest, de unde am fost respins de câteva ori din cauza că nu am escapt codul. Așa că acum cred că este mai bine să escap aceste variabile, corect? Mulțumesc!
Cauți funcția wp_kses()
. https://developer.wordpress.org/reference/functions/wp_kses/
Există și alte funcții ajutătoare precum wp_kses_post()
și wp_kses_data()

1. Escapare
Escapare Atribut
<label for="<?php esc_attr( $tid ); ?>">
Escapare HTML
<label ..><?php esc_html( 'Text' ); ?></label>
2. Traducere și Escapare
Notă:
textdomain
ar trebui să fie un identificator unic pentru tema/plugin-ul tău.- Șirul tradus ar trebui să conțină o valoare statică. Dacă ai o valoare dinamică, atunci nu este necesar să o faci gata pentru traducere.
1. Escapare și traducere Atribut: <label for="<?php esc_attr( $tid ); ?>">
Nu este necesar să o faci gata pentru traducere. Dacă ai un șir static cu $tid
, atunci trebuie să îl faci gata pentru traducere, de exemplu:
Invalid:
<label for="<?php esc_attr__( $tid, 'textdomain' ) ); ?>">
<label for="<?php printf( esc_attr__( '%s', 'textdomain' ), $tid ); ?>">
Valid:
<label for="<?php printf( esc_attr__( '%s text static', 'textdomain' ), $tid ); ?>">
- Escapare și traducere HTML:
<label ..><?php esc_html__( 'Text', 'textdomain' ); ?></label>

încearcă cu această metodă. funcționează pentru mine. echo cu escapare HTML.
$output = '<p>';
$output .= '<label for="' . esc_attr( $this->get_field_id( 'title' ) ) . '">Titlu:</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 );

Codul tău arată și funcționează bine pentru mine. HTML-ul din value
este păstrat.
Singura mea recomandare ar fi să înfășori toate șirurile de text în __()
sau _e()
astfel încât acestea să poată fi ușor traduse. Acesta este un punct de vânzare frumos pe site-uri de piață precum ThemeForest, deoarece nu toată lumea dorește să folosească limba engleză.
$output .= '<label for="' . esc_attr( $tid ) . '">' . __( 'Titlu:', 'your-text-domain' ) . '</label>';
Citește mai multe despre I18n în WordPress Codex.

Dacă dorești să faci acest lucru în modul "WordPress", nu ai stoca HTML-ul într-o variabilă temporară, ci ai afișa direct.
?>
<p>
<label for="<?php esc_attr_e( $this->get_field_id( 'title' ) ); ?>"> <?php _e('Titlu:', '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: De asemenea, ai internationaliza șirurile de text.
