W klasycznym WP mamy większą kontrolę niż w „wyklikiwanym” (frameworki) tudzież blokowym (Gutenberg), musimy za to kodować w czystym PHP wspomaganym przez WP. Dotyczy to także funkcji zapewniających bezpieczeństwo, które pora poznać.

Jeżeli chcemy zabezpieczyć treść pokazywaną wewnątrz tagu HTML (to jest między otwierającym i zamykającym tagiem, text content po prostu) używamy esc_html:

<h4><?php echo esc_html( $title ); ?></h4>

Do zabezpieczania atrybutów tagów html mamy funkcję esc_attr:

<ul class="<?php echo esc_attr( $stored_class ); ?>">

Każdy URL zaciągnięty z backendu i wstrzykiwany np. do hrefa przepuszczamy przez esc_url:

<img alt="" src="<?php echo esc_url( $media_url ); ?>" />

Java-scripty nie powinny być zaciągane z backendu, na pewno nie tak jak pokażę to zaraz, ale specjalne atrybuty javascriptowe przepuszczamy przez esc_js:

<div onclick='<?php echo esc_js( $value ); ?>' />

Nigdy tego robić nie będziemy – do podczepania JS mamy w functions.php coś takiego:

function additional_styles() {
    //(...)
    wp_enqueue_script( 'navbar-script',  get_template_directory_uri() .'/navbar.js' );
}
add_action('wp_enqueue_scripts', 'additional_styles');

I ten plik js zawiera normalne query-selectory i event-listenery. Tym niemniej, funkcja esc_js istnieje, ale jeżeli jej używamy, to raczej coś jest nie tak z naszą logiką.

Dalej, mamy funkcję esc_html_e, która w dodatku robi od razu echo:

<h1><?php esc_html_e( 'Title', 'text-domain' )?></h1>

Jeżeli nie piszemy pluginu tylko szablon możemy olać text-domain (drugi argument).

Kolejne funkcje to wp_kses_post i wp_kses_data:

echo wp_kses_post( $partial_html );
echo wp_kses_data( $partial_html );

Post pozwala na tylko te HTMLe, które może mieć post (wpis). Data pozwala tylko na takie, które są dozwolone w komentarzach.

Mamy jeszcze wp_kses, też ciekawy przypadek:

echo wp_kses(
    $another_partial_html,
    array(
        'a'      => array(
            'href'  => array(),
            'title' => array(),
        ),
        'br'     => array(),
        'em'     => array(),
        'strong' => array(),
    )
); ?>

Tutaj pozwalamy tylko na tagi br, em, strong oraz tag a, tylko z atrybutami href i title, żadnymi innymi.

Mamy jeszcze esc_url_raw (gdybyśmy chcieli zapisać do bazy danych url od użytkownika) oraz esc_xml, gdybyśmy tego potrzebowali. I to w zasadzie wszystko jeżeli o sekwencje ucieczkowe chodzi.