ACF 6.2.5: шорткод acf экранируется через wp_kses

С ACF 6.2.5 шорткод по умолчанию прогоняет значение поля через wp_kses. Небезопасный HTML (скрипты, iframe и подобное) вырезается. Это security release: закрыли сценарий, когда contributor и выше без unfiltered_html мог подсунуть вредоносный HTML в meta вне ACF и вывести его через шорткод.

Если вы через шорткод выводите textarea/WYSIWYG с iframe (подкасты, карты, виджеты) или скриптами – после обновления вывод может «сломаться». Ниже: что именно изменилось, как увидеть затронутые поля и как точечно разрешить unsafe HTML, не отключая защиту глобально.

Что ломается на практике

Шорткод ACF раньше мог отдать поле «как есть». С 6.2.5 значение проходит kses WordPress: безопасные теги (картинки, таблицы и т.п.) остаются, <script> и <iframe> по умолчанию уходят.

Пример привычного вывода:


Если в поле лежал embed-iframe, на фронте он исчезнет, а в админке ACF покажет уведомление со списком затронутых полей – удобно понять, что чинить.

Уведомление ACF о экранировании небезопасного HTML в шорткоде

the_field() и the_sub_field()

В 6.2.5 ACF уже детектит, когда экранированное значение отличается от «сырого», и показывает предупреждение для the_field() / the_sub_field(). С 6.2.7 (анонс на февраль 2024) то же экранирование по умолчанию включается и для этих функций: HTML не запрещают целиком, а оставляют только безопасный набор kses.

Список разрешённых тегов и атрибутов – в kses.php ядра WordPress. iframe и script туда по умолчанию не входят.

Точечно разрешить unsafe HTML

Если пользователям с ролью contributor и выше вы доверяете (или HTML кладёте только вы сами), есть два фильтра. Лучше ограничивать по ключу/имени поля, а не возвращать true для всего сайта.

  • acf/shortcode/allow_unsafe_html – для шорткода
  • acf/the_field/allow_unsafe_html – для the_field / the_sub_field

Сигнатура фильтра шорткода:

apply_filters( 'acf/shortcode/allow_unsafe_html', false, $attributes, $field_type, $field_object );

Пример: поле podcast_iframe через шорткод должно отдавать iframe:

add_filter( 'acf/shortcode/allow_unsafe_html', function ( $allowed, $atts ) {
    if ( isset( $atts['field'] ) && $atts['field'] === 'podcast_iframe' ) {
        return true;
    }
    return $allowed;
}, 10, 2 );

Сигнатура для the_field:

apply_filters( 'acf/the_field/allow_unsafe_html', false, $selector, $post_id, $field_type, $field_object );

Пример для поля-карты Google:

add_filter( 'acf/the_field/allow_unsafe_html', function ( $allowed, $selector ) {
    if ( $selector === 'google_maps_iframe' ) {
        return true;
    }
    return $allowed;
}, 10, 2 );

Включить новое поведение заранее

Если небезопасный HTML в ACF-полях не храните (или сами экранируете вывод), можно сразу включить жёсткий режим для the_field:

add_filter( 'acf/the_field/escape_html_optin', '__return_true' );

Небезопасный HTML будет срезаться сразу, а в админке появится сообщение, когда это сработало.

Что сделать после обновления

  1. Обновите ACF до 6.2.5+ и зайдите в админку – посмотрите предупреждения по полям.
  2. Пройдитесь по страницам, где выводите embeds через шорткод или the_field().
  3. Для нужных ключей полей добавьте allow_unsafe_html-фильтры; остальное оставьте под kses.
  4. По возможности вынесите embeds в отдельные поля и не давайте неадминам править HTML вручную.

Источники и ссылки


Комментарии загружаются…