Кастомні Globals в Payload CMS
Global в Payload — одинична запис конфігурації, яка існує в єдиному екземплярі: налаштування сайту, меню навігації, футер, SEO-дефолти. На відміну від колекцій, у глобалів немає списку документів — тільки одна редактована запис.
Базовий Global
// globals/Settings.ts
import { GlobalConfig } from 'payload/types'
const Settings: GlobalConfig = {
slug: 'settings',
label: 'Налаштування сайту',
access: {
read: () => true,
update: ({ req: { user } }) => user?.role === 'admin',
},
fields: [
{
name: 'siteName',
type: 'text',
required: true,
label: 'Назва сайту',
},
{
name: 'logo',
type: 'upload',
relationTo: 'media',
},
{
name: 'contactEmail',
type: 'email',
},
{
name: 'socialLinks',
type: 'array',
fields: [
{
name: 'platform',
type: 'select',
options: ['telegram', 'vk', 'youtube', 'instagram'],
},
{ name: 'url', type: 'text' },
],
},
{
name: 'defaultSeo',
type: 'group',
label: 'SEO за замовчуванням',
fields: [
{ name: 'title', type: 'text' },
{ name: 'description', type: 'textarea' },
{ name: 'ogImage', type: 'upload', relationTo: 'media' },
],
},
],
}
export default Settings
Global навігації з вкладеними посиланнями
// globals/Navigation.ts
const Navigation: GlobalConfig = {
slug: 'navigation',
fields: [
{
name: 'items',
type: 'array',
fields: [
{ name: 'label', type: 'text', required: true },
{
name: 'link',
type: 'group',
fields: [
{
name: 'type',
type: 'radio',
options: ['internal', 'external'],
defaultValue: 'internal',
},
{
name: 'page',
type: 'relationship',
relationTo: 'pages',
admin: { condition: (_, { type }) => type === 'internal' },
},
{
name: 'url',
type: 'text',
admin: { condition: (_, { type }) => type === 'external' },
},
],
},
{
name: 'children',
type: 'array',
fields: [
{ name: 'label', type: 'text' },
{ name: 'page', type: 'relationship', relationTo: 'pages' },
],
},
],
},
],
}
Читання Global в Next.js
// app/(frontend)/layout.tsx
import { getPayload } from 'payload'
import config from '@payload-config'
export default async function RootLayout({ children }) {
const payload = await getPayload({ config })
const settings = await payload.findGlobal({ slug: 'settings' })
const navigation = await payload.findGlobal({ slug: 'navigation' })
return (
<html>
<body>
<Header nav={navigation} logo={settings.logo} />
<main>{children}</main>
<Footer settings={settings} />
</body>
</html>
)
}
REST API для Globals
# Отримати
GET /api/globals/settings
# Оновити (потрібні права)
POST /api/globals/settings
Authorization: Bearer <token>
Версіонування Globals
const Settings: GlobalConfig = {
slug: 'settings',
versions: { drafts: true },
// ...
}
Часові рамки
Налаштування 2–4 глобалів (налаштування, навігація, футер, SEO) — 1 день включаючи інтеграцію з фронтендом.







