Вопрос или проблема
Я использую следующие функции, чтобы получить объекты выбранных категорий. Кажется, что они всегда возвращают ноль совпадений, хотя их несколько. Что я здесь упустил?
(function (wp) {
const { useSelect, select, dispatch } = wp.data;
const { subscribe } = wp.data;
function getSelectedCategories() {
const selectedCategories = select('core/editor').getEditedPostAttribute('categories');
const categories = select('core').getEntityRecords('taxonomy', 'category');
if (!categories || !selectedCategories || selectedCategories.length === 0) {
return [];
}
return categories.filter(cat => selectedCategories.includes(cat.id));
}
}
Ответ или решение
Чтобы получить объекты выбранных категорий в редакторе блоков WordPress, необходимо убедиться, что вы правильно используете функции API данных и правильно обрабатываете полученные данные. Давайте рассмотрим ваш код и внесём необходимые исправления, чтобы он корректно возвращал выбранные категории.
Вот обновлённый пример функции getSelectedCategories
, который включает отдельные проверки и обеспечивает правильное извлечение объектов категорий:
(function (wp) {
const { useSelect, select } = wp.data;
function getSelectedCategories() {
// Получаем выбранные категории из поста
const selectedCategories = select('core/editor').getEditedPostAttribute('categories');
// Получаем все категории
const categories = select('core').getEntityRecords('taxonomy', 'category');
// Проверка на наличие полученных категорий и выбранных категорий
if (!Array.isArray(selectedCategories) || selectedCategories.length === 0 || !Array.isArray(categories)) {
return [];
}
// Фильтруем категории по выбранным идентификаторам
return categories.filter(cat => selectedCategories.some(selected => selected.id === cat.id));
}
// Пример использования функции
const selectedCategories = getSelectedCategories();
console.log(selectedCategories);
})(wp);
Объяснение внесённых изменений:
-
Проверка на массив: Я добавил проверки, чтобы убедиться, что
selectedCategories
иcategories
являются массивами, прежде чем выполнять дальнейшие операции. -
Фильтрация по идентификатору: В вашем изначальном коде использовался метод
includes
, однако в случае, еслиselectedCategories
представляет собой массив объектов с полемid
, вам следует использовать методsome
для проверки наличия соответствующего объекта. -
Пример использования: Я добавил пример использования функции с выводом результата в консоль, что поможет в отладке.
Следуйте этому подходу, и вы сможете успешно извлекать объекты выбранных категорий в редакторе блоков WordPress. Проверьте также, что на вашем посте действительно существуют выбранные категории, и что они корректно сохранены в редакторе.