PHP-ошибка в JSON-ответе нарушает работу селектора паттернов в редакторе

Вопрос или проблема

У меня есть локальная и продакшн среда. Я зарегистрировал 19 шаблонов с помощью register_block_pattern(). В редакторе постов я вижу их в селекторе шаблонов. В продакшн среде, неожиданно, я больше не вижу мои шаблоны в селекторе. Я обнаружил, что ответ с этого адреса:

/wp-json/wp/v2/block-patterns/patterns?_locale=user

Не является действительным JSON. Вместо того чтобы начинаться как:

[{"name":"core\/query-standard-posts","title":"Standard","block_types":["core\/query"]

Он начинается так:

<br />
<b>Warning</b>:  array_map(): Argument #2 should be an array in <b>/var/www/html/site/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php</b> on line <b>208</b><br />
<br />
<b>Warning</b>:  array_map(): Argument #2 should be an array in <b>/var/www/html/site/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php</b> on line <b>208</b><br />
<br />
<b>Warning</b>:  array_map(): Argument #2 should be an array in <b>/var/www/html/site/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php</b> on line <b>208</b><br />
<br />
<b>Warning</b>:  array_map(): Argument #2 should be an array in <b>/var/www/html/site/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php</b> on line <b>208</b><br />
<br />
<b>Warning</b>:  array_map(): Argument #2 should be an array in <b>/var/www/html/site/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php</b> on line <b>208</b><br />
<br />
<b>Warning</b>:  array_map(): Argument #2 should be an array in <b>/var/www/html/site/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php</b> on line <b>208</b><br />
<br />
<b>Warning</b>:  array_map(): Argument #2 should be an array in <b>/var/www/html/site/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php</b> on line <b>208</b><br />
<br />
<b>Warning</b>:  array_map(): Argument #2 should be an array in <b>/var/www/html/site/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php</b> on line <b>208</b><br />
<br />
<b>Warning</b>:  array_map(): Argument #2 should be an array in <b>/var/www/html/site/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php</b> on line <b>208</b><br />
[{"name":"core\/query-standard-posts","title":"Standard","block_types":["core\/query"],

Я использую WordPress 6.1.1, и это предупреждение связано с $raw_pattern->category_slugs в этой функции, так что, предположительно, шаблоны без категории возвращают пустое значение для “category slugs” и затем выдают предупреждение, когда пытаются их использовать:

/**
 * Подготовить сырой шаблон блока перед его выводом в ответе REST API.
 *
 * @since 5.8.0
 * @since 5.9.0 Переименован '$raw_pattern' в '$item' для поддержки именованных параметров PHP 8.
 *
 * @param object          $item    Сырой шаблон из api.wordpress.org, до любых изменений.
 * @param WP_REST_Request $request Объект запроса.
 * @return WP_REST_Response
 */
public function prepare_item_for_response( $item, $request ) {
    // Восстанавливает более конкретное имя для использования в этом методе.
    $raw_pattern      = $item;
    $prepared_pattern = array(
        'id'             => absint( $raw_pattern->id ),
        'title'          => sanitize_text_field( $raw_pattern->title->rendered ),
        'content'        => wp_kses_post( $raw_pattern->pattern_content ),
        'categories'     => array_map( 'sanitize_title', $raw_pattern->category_slugs ),
        'keywords'       => array_map( 'sanitize_text_field', explode( ',', $raw_pattern->meta->wpop_keywords ) ),
        'description'    => sanitize_text_field( $raw_pattern->meta->wpop_description ),
        'viewport_width' => absint( $raw_pattern->meta->wpop_viewport_width ),
    );

    $prepared_pattern = $this->add_additional_fields_to_object( $prepared_pattern, $request );

    $response = new WP_REST_Response( $prepared_pattern );

    /**
     * Фильтрует ответ REST API для шаблона блока.
     *
     * @since 5.8.0
     *
     * @param WP_REST_Response $response    Объект ответа.
     * @param object           $raw_pattern Необработанный шаблон блока.
     * @param WP_REST_Request  $request     Объект запроса.
     */
    return apply_filters( 'rest_prepare_block_pattern', $response, $raw_pattern, $request );
}

Мой wp-includes находится в контейнере docker, который я не могу редактировать. Я пытаюсь воспроизвести проблему на моем локальном компьютере. Могло ли что-то измениться в содержимом сайта (т.е. в базе данных), что объяснило бы, почему эти предупреждения стали появляться только сейчас? Как я могу воспроизвести это локально?

Ответ или решение

Для решения проблемы с предупреждениями PHP в ответе JSON, которые мешают отображению селектора шаблонов в редакторе, необходимо рассмотреть несколько аспектов, касающихся регистрации и предоставления блоков шаблонов (block patterns) в WordPress, а также возможные изменения в базе данных.

Причина проблемы

Предупреждения, с которыми вы столкнулись:

Warning: array_map(): Argument #2 should be an array in /var/www/html/site/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php on line 208

указывает на то, что переменная $raw_pattern->category_slugs, используемая в функции array_map, не является массивом. Это может произойти, если у некоторых шаблонов не задана категория или параметр category_slugs не инициализирован должным образом (например, он равен null или пустой строке).

Благодаря этой ситуации, в JSON-ответе возникают предупреждения, которые, в свою очередь, мешают корректному формированию ответа API и отображению блоков шаблонов в редакторе.

Шаги по устранению проблемы

  1. Проверка данных в базе данных:
    Проверьте, нет ли недостающих записей или некорректных значений для блоков шаблонов в вашей базе данных. Наиболее вероятные поля, которые могут вызвать проблему:

    • category_slugs в таблице, хранящей шаблоны.
    • Убедитесь, что все зарегистрированные шаблоны имеют корректные категории.

    Вы можете выполнить SQL-запрос для проверки:

    SELECT * FROM wp_block_patterns WHERE category_slugs IS NULL OR category_slugs = '';
  2. Логирование ошибок:
    Включите логирование ошибок в вашем локальном окружении. Это поможет вам увидеть, возникают ли аналогичные предупреждения в вашем локальном окружении. Чтобы включить логирование, добавьте или измените следующие строки в вашем wp-config.php:

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true );
    define( 'WP_DEBUG_DISPLAY', false );
  3. Корректировка функции обработки шаблона:
    Если вы не можете изменить wp-includes, подумайте о создании пользовательского плагина, который будет фильтровать ответ API и устранять предупреждения. Например:

    add_filter( 'rest_prepare_block_pattern', function( $response, $raw_pattern ) {
       if ( ! is_array( $raw_pattern->category_slugs ) ) {
           $raw_pattern->category_slugs = []; // Присваиваем пустой массив
       }
       return $response;
    }, 10, 2 );
  4. Сравнение окружений:
    Проверьте, не обновлялись ли плагины или темы на продакшен-окружении, которые могли бы повлиять на работу блоков шаблонов. Также обратите внимание на версии плагинов и базу данных. Возможно, есть различия, которые могут вызвать такую проблему.

  5. Обновление базы данных:
    Если вы обнаружите записи с пустыми или некорректными значениями, обновите их с помощью правильных данных или удалите эти шаблоны. Вы можете сделать это с помощью интерфейса phpMyAdmin или командой WP-CLI:

    wp pattern delete <pattern_id>

Заключение

Вы должны быть в состоянии локализовать и устранить проблему, следуя вышеизложенным рекомендациям. После исправления данных и обработки ошибок, вы сможете избежать предупреждений PHP и вернуть видимость ваших шаблонов в редакторе. Если проблема сохраняется, попробуйте обратиться в сообщество WordPress или на форумы поддержки для получения дополнительной помощи.

Оцените материал
Добавить комментарий

Капча загружается...