ворд-пресс.рф
Разработка

Как вывести поля ACF в шаблоне WordPress и не допустить XSS

Практический разбор ACF: вывод текстовых полей, ссылок и форматированного содержимого с правильным экранированием.

Значения ACF получают через get_field(), но перед выводом в HTML нужно выбрать экранирование по контексту. Поле «текст» и поле «ссылка» нельзя выводить одинаково: для первого обычно нужен esc_html(), для второго — esc_url().

Подготовка поля

  1. Установите ACF на тестовом сайте и создайте группу полей для записей или вашего CPT.
  2. Добавьте текстовое поле project_subtitle и URL-поле project_link.
  3. Заполните оба поля в тестовой записи и проверьте фактический формат значения каждого поля.
  4. Выведите значения в шаблоне темы или в callback собственного блока.

Минимальный пример

<?php
if ( ! function_exists( 'get_field' ) ) {
    return;
}

$subtitle = get_field( 'project_subtitle', get_the_ID() );
$link     = get_field( 'project_link', get_the_ID() );

if ( is_string( $subtitle ) && $subtitle !== '' ) {
    echo '<p class="project-subtitle">' . esc_html( $subtitle ) . '</p>';
}

if ( is_string( $link ) && wp_http_validate_url( $link ) ) {
    echo '<a href="' . esc_url( $link ) . '" rel="noopener noreferrer">Сайт проекта</a>';
}

Пример рассчитан на URL-поле, возвращающее строку. Для поля Link ACF может вернуть массив с url, title, target: сначала проверяйте структуру массива и только потом выводите его части.

Если поле содержит форматированный текст

Для WYSIWYG-поля, где разрешена безопасная HTML-разметка, при необходимости используйте wp_kses_post(). Но не применяйте его к произвольному JavaScript, iframe или данным, которым нельзя доверять.

<?php
$details = get_field( 'project_details', get_the_ID() );
if ( is_string( $details ) && $details !== '' ) {
    echo wp_kses_post( $details );
}

Что проверить

  • Пустое значение не создаёт пустой тег или невалидную ссылку.
  • Строки с <script> не становятся исполняемым кодом.
  • URL с недопустимым протоколом не отображается как внешняя ссылка.
  • Объекты, массивы и числовые значения обрабатываются с учётом типа поля.
  • При отключённом ACF страница не падает с fatal error.

Частые ошибки

  • echo get_field(...) без экранирования.
  • Вызов the_field() в месте, где нужен контроль HTML-контекста.
  • Предположение, что Image/Relationship/Link всегда возвращает строку.
  • Использование sanitize_text_field() как замены экранирования при выводе.

Для каталога дополнений и альтернатив ACF см. плагины ACF.

Источник: https://www.advancedcustomfields.com/resources/get_field/

Материал был полезен?

Помогите нам сделать материалы точнее и понятнее.