Вопрос или проблема
У меня есть локальная и продакшн среда. Я зарегистрировал 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 и отображению блоков шаблонов в редакторе.
Шаги по устранению проблемы
-
Проверка данных в базе данных:
Проверьте, нет ли недостающих записей или некорректных значений для блоков шаблонов в вашей базе данных. Наиболее вероятные поля, которые могут вызвать проблему:category_slugs
в таблице, хранящей шаблоны.- Убедитесь, что все зарегистрированные шаблоны имеют корректные категории.
Вы можете выполнить SQL-запрос для проверки:
SELECT * FROM wp_block_patterns WHERE category_slugs IS NULL OR category_slugs = '';
-
Логирование ошибок:
Включите логирование ошибок в вашем локальном окружении. Это поможет вам увидеть, возникают ли аналогичные предупреждения в вашем локальном окружении. Чтобы включить логирование, добавьте или измените следующие строки в вашемwp-config.php
:define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false );
-
Корректировка функции обработки шаблона:
Если вы не можете изменить 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 );
-
Сравнение окружений:
Проверьте, не обновлялись ли плагины или темы на продакшен-окружении, которые могли бы повлиять на работу блоков шаблонов. Также обратите внимание на версии плагинов и базу данных. Возможно, есть различия, которые могут вызвать такую проблему. -
Обновление базы данных:
Если вы обнаружите записи с пустыми или некорректными значениями, обновите их с помощью правильных данных или удалите эти шаблоны. Вы можете сделать это с помощью интерфейса phpMyAdmin или командой WP-CLI:wp pattern delete <pattern_id>
Заключение
Вы должны быть в состоянии локализовать и устранить проблему, следуя вышеизложенным рекомендациям. После исправления данных и обработки ошибок, вы сможете избежать предупреждений PHP и вернуть видимость ваших шаблонов в редакторе. Если проблема сохраняется, попробуйте обратиться в сообщество WordPress или на форумы поддержки для получения дополнительной помощи.