Разработка кастомных полей через Meta Box для WordPress
Meta Box — альтернатива ACF для создания кастомных полей в WordPress. Основное преимущество перед ACF: бесплатная версия полноценна для большинства задач, все расширения (Relationships, Group, Frontend Submission) покупаются отдельно и дешевле, а API строится через PHP без зависимости от GUI — что удобно при code-first подходе. Настройка группы полей занимает от нескольких часов до 1 дня.
Регистрация поля через PHP API
add_filter('rwmb_meta_boxes', function (array $meta_boxes): array {
$meta_boxes[] = [
'id' => 'project_details',
'title' => 'Детали проекта',
'post_types' => ['project'],
'priority' => 'high',
'fields' => [
[
'id' => 'project_client',
'name' => 'Клиент',
'type' => 'text',
'required' => true,
'placeholder' => 'Название компании-клиента',
'size' => 50,
'columns' => 6, // 6/12 = половина ширины
],
[
'id' => 'project_year',
'name' => 'Год',
'type' => 'number',
'min' => 2000,
'max' => 2030,
'std' => date('Y'),
'columns' => 3,
],
[
'id' => 'project_status',
'name' => 'Статус',
'type' => 'select',
'options' => [
'active' => 'Активный',
'completed' => 'Завершён',
'paused' => 'На паузе',
],
'std' => 'completed',
'columns' => 3,
],
[
'id' => 'project_url',
'name' => 'URL проекта',
'type' => 'url',
'placeholder' => 'https://',
],
[
'id' => 'project_budget',
'name' => 'Бюджет (тыс. руб.)',
'type' => 'number',
'min' => 0,
'step' => 10,
'placeholder' => '0',
'admin_only' => true, // видно только в /wp-admin
],
[
'id' => 'project_description',
'name' => 'Внутреннее описание',
'type' => 'textarea',
'rows' => 4,
'desc' => 'Не отображается на сайте, только для внутреннего использования',
],
],
];
return $meta_boxes;
});
Поля изображений и файлов
[
'id' => 'project_cover',
'name' => 'Обложка проекта',
'type' => 'image_advanced',
'max_file_uploads' => 1,
'force_delete' => false,
'image_size' => 'large',
'columns' => 6,
],
[
'id' => 'project_gallery',
'name' => 'Галерея',
'type' => 'image_advanced',
'max_file_uploads' => 15,
'image_size' => 'medium',
'add_to' => 'end',
],
[
'id' => 'project_brief',
'name' => 'Бриф (PDF)',
'type' => 'file_advanced',
'mime_type' => 'application/pdf',
'max_file_uploads' => 1,
],
Получение на фронтенде:
// Одно изображение
$cover = rwmb_meta('project_cover', ['size' => 'large'], $post_id);
if ($cover) {
echo '<img src="' . esc_url($cover[0]['url']) . '" alt="' . esc_attr($cover[0]['alt']) . '">';
}
// Галерея
$gallery = rwmb_meta('project_gallery', ['size' => 'medium'], $post_id);
foreach ($gallery as $image) {
echo '<img src="' . esc_url($image['url']) . '" loading="lazy">';
}
Group — вложенные поля
Meta Box Group (платный аддон) позволяет создавать вложенные группы и клонируемые блоки:
[
'id' => 'project_team',
'name' => 'Команда',
'type' => 'group',
'clone' => true,
'sort_clone' => true,
'add_button' => 'Добавить участника',
'fields' => [
['id' => 'member_name', 'name' => 'Имя', 'type' => 'text', 'columns' => 4],
['id' => 'member_role', 'name' => 'Роль', 'type' => 'text', 'columns' => 4],
['id' => 'member_photo','name' => 'Фото', 'type' => 'image', 'columns' => 4],
['id' => 'member_hours','name' => 'Часов/нед', 'type' => 'number','columns' => 3],
],
],
$team = rwmb_meta('project_team', [], $post_id);
foreach ($team as $member) {
echo '<div class="team-member">';
if (!empty($member['member_photo'])) {
$photos = array_values($member['member_photo']);
echo '<img src="' . esc_url($photos[0]['url']) . '">';
}
echo '<strong>' . esc_html($member['member_name']) . '</strong>';
echo '<span>' . esc_html($member['member_role']) . '</span>';
echo '</div>';
}
Условное отображение через visible
[
'id' => 'show_testimonial',
'name' => 'Добавить отзыв клиента',
'type' => 'switch',
'style'=> 'rounded',
],
[
'id' => 'testimonial_text',
'name' => 'Текст отзыва',
'type' => 'textarea',
'visible' => ['show_testimonial', '=', true],
],
[
'id' => 'testimonial_author',
'name' => 'Автор',
'type' => 'text',
'visible' => ['show_testimonial', '=', true],
'columns' => 6,
],
Поля для таксономий и настроек сайта
Meta Box поддерживает метабоксы не только для записей:
// Поле для термина таксономии
$meta_boxes[] = [
'id' => 'category_color',
'title' => 'Дополнительно',
'taxonomies' => ['project_category'],
'fields' => [
['id' => 'color', 'name' => 'Цвет', 'type' => 'color'],
['id' => 'icon', 'name' => 'Иконка SVG', 'type' => 'textarea', 'rows' => 3],
],
];
// Страница настроек
$meta_boxes[] = [
'id' => 'site_settings',
'title' => 'Настройки сайта',
'settings_pages' => ['site-settings'],
'fields' => [
['id' => 'company_phone', 'name' => 'Телефон', 'type' => 'text'],
['id' => 'company_email', 'name' => 'Email', 'type' => 'email'],
['id' => 'company_logo', 'name' => 'Логотип', 'type' => 'image'],
],
];
Meta Box vs ACF: когда что выбирать
Meta Box предпочтительнее, когда проект строится code-first и нужна минимальная зависимость от платного ядра. ACF PRO целесообразен, если команда привыкла к его GUI-конструктору и Flexible Content. Производительность обоих плагинов сопоставима: оба используют wp_postmeta, оба деградируют при тысячах записей с десятками полей.
Для высоконагруженных проектов с большими объёмами данных обе библиотеки стоит заменять кастомными таблицами с оптимизированными индексами.







