Вопрос или проблема
У меня есть пользовательский блок, в котором я хочу получить размеры шрифтов темы и пользовательские размеры шрифтов.
Это настройки в theme.json
"settings": {
"typography": {
"fontSizes": [
{
"name": "XS",
"slug": "sm",
"size": "12px"
},
{
"name": "SM",
"slug": "sm",
"size": "14px"
},
{
"name": "Base",
"slug": "base",
"size": "16px"
},
{
"name": "LG",
"slug": "lg",
"size": "18px"
},
{
"name": "XL",
"slug": "xl",
"size": "20px"
},
{
"name": "2XL",
"slug": "2xl",
"size": "24px"
},
{
"name": "3XL",
"slug": "3xl",
"size": "30px"
},
{
"name": "4XL",
"slug": "4xl",
"size": "36px"
},
{
"name": "5XL",
"slug": "5xl",
"size": "48px"
}
]
},
}
Пользователь также может добавлять новые размеры шрифтов в редакторе темы.
Если там не установлены пользовательские размеры шрифтов, и я пытаюсь загрузить fontSizes
через useSetting('typography.fontSizes')
, я получаю список из theme.json
.
Однако, как только создается пользовательский размер шрифта, useSetting('typography.fontSizes')
возвращает только список, сохраненный в редакторе темы.
Однако я хочу получить оба списка: один из theme.json
и тот, что сохранен в бэкенде WordPress Gutenberg. Как я могу достичь этого?
const customFontSizes = useSetting('typography.fontSizes') || [];
// Получить стандартные размеры шрифтов из theme.json
const themeFontSizes = useSelect((select) => {
const settings = select('core/block-editor').getSettings();
console.log('settings', settings);
return settings?.typography?.fontSizes || [];
}, []);
Обе функции customFontSizes
и themeFontSizes
возвращают список пользовательских размеров шрифтов.
Ответ или решение
Теория:
Для достижения цели объединения списков шрифтов из файла theme.json
и пользовательских шрифтов из редактора WordPress Gutenberg, необходимо разобраться с основными механизмами работы системы стилей WordPress, а также функциями, которые позволяют извлекать данные об этих стилях. В WordPress, начиная с версии 5.8, появилась поддержка глобальных стилей через файл theme.json
, что позволяет задавать параметры стилей, включая размеры шрифтов непосредственно в темах. Однако, редактор также позволяет пользователям добавлять и настраивать свои собственные стили, которые записываются в пользовательские параметры темы.
В редакторе Gutenberg также присутствует библиотека, которая позволяет извлекать настройки тем, используя функции типа useSetting
и useSelect
. Однако, вызовы этих функций в вашем примере возвращают разные значения в зависимости от наличия пользовательских настроек.
Пример:
Рассмотрим ваш текущий подход. Вы используете два основных способа для извлечения размеров шрифтов:
-
useSetting(‘typography.fontSizes’): Эта функция возвращает список размеров шрифтов. Однако, если пользователь задает свои собственные размеры шрифтов в редакторе, этот метод вернет только пользовательский список, игнорируя те, что заданы в
theme.json
. -
useSelect((select) => {…}): Данный подход также использует глобальное состояние редактора для получения размеров шрифтов. Однако при использовании вашего специфичного написания также может возвращать измененные пользователем значения.
Применение:
Чтоб получить объединенный список размером шрифтов как из theme.json
, так и из пользовательских настроек, можно предпринять следующие шаги:
-
Получение размеров шрифтов из
theme.json
: Можно напрямую загрузить и разобратьtheme.json
файл, если у вас есть такой доступ, или использовать серверные методы, чтобы извлечь эти настройки через PHP. Например, воспользовавшись функциейwp_get_theme_json_data()
. -
Извлечение пользовательских настроек: Продолжайте использовать
useSetting('typography.fontSizes')
для динамического извлечения пользовательских настроек. -
Объединение данных: Сначала используете данные, полученные из
theme.json
, а затем с помощью функции JavaScript, такой какArray.prototype.concat
, объединяете с массивом пользовательских данных. Это позволит получить все текущие данные о шрифтах.
Ниже приведен пример кода, который демонстрирует данный подход:
import { useSelect } from '@wordpress/data';
import { store as blockEditorStore } from '@wordpress/block-editor';
import { useSetting } from '@wordpress/block-editor';
const MyCustomBlock = () => {
// Получаем пользовательские размеры шрифтов
const customFontSizes = useSetting('typography.fontSizes') || [];
// Извличение размеров шрифтов из theme.json
const themeFontSizes = useSelect((select) => {
const settings = select(blockEditorStore).getSettings();
return settings?.typography?.fontSizes || [];
}, []);
// Объединение пользовательских и стандартных размеров шрифтов
const combinedFontSizes = [...themeFontSizes, ...customFontSizes];
// Фильтрация дубликатов по slug
const uniqueFontSizes = combinedFontSizes.filter((fontSize, index, self) =>
index === self.findIndex((t) => t.slug === fontSize.slug)
);
console.log('Все доступные размеры шрифтов:', uniqueFontSizes);
return (
<div>
<h3>Доступные размеры шрифтов:</h3>
<ul>
{uniqueFontSizes.map((fontSize) => (
<li key={fontSize.slug}>
{fontSize.name} - {fontSize.size}
</li>
))}
</ul>
</div>
);
};
export default MyCustomBlock;
Вывод:
Подход, описанный выше, поможет вам объединить и сохранить уникальные значения, полученные как из статических файлов темы, так и из пользовательских настроек. Данный метод не только предоставляет пользователю весь спектр доступных возможностей, но и позволяет избежать конфликтов или дублирования, обеспечивая плавный опыт работы с темами и стилями в WordPress.