Как гибко управлять контентом на WordPress: Custom Post Types и Custom Fields
Несколько лет назад я столкнулся с задачей, которая заставила меня по-новому взглянуть на WordPress. Клиент хотел каталог недвижимости с десятками параметров для каждого объекта: площадь, этаж, тип отопления, наличие балкона. Стандартные посты и страницы явно не справлялись. Именно тогда я по-настоящему разобрался в Custom Post Types и Custom Fields — и с тех пор эти инструменты стали основой моей работы с WordPress.
Почему обычных постов недостаточно
WordPress из коробки предлагает посты и страницы — универсальные, но безликие сущности. Пытаться впихнуть в них товары, отзывы, портфолио или объекты недвижимости — это как хранить гвозди в холодильнике: технически можно, но неудобно и нелогично.
Custom Post Types (CPT) решают эту проблему, позволяя создавать собственные типы контента со своей структурой, иконками в админке и логикой отображения.
Создаём Custom Post Type правильно
Первое, что я советую: никогда не редактируйте функционал через плагины типа CPT без понимания кода — это ограничивает вас в будущем. Регистрируйте типы записей программно.
Вот базовый код для регистрации CPT «Недвижимость», который я использую как отправную точку:
function register_property_post_type() {
$labels = array(
'name' => 'Объекты недвижимости',
'singular_name' => 'Объект недвижимости',
'add_new' => 'Добавить объект',
'add_new_item' => 'Добавить новый объект',
'edit_item' => 'Редактировать объект',
'new_item' => 'Новый объект',
'view_item' => 'Просмотреть объект',
'search_items' => 'Искать объекты',
'not_found' => 'Объекты не найдены',
'menu_name' => 'Недвижимость'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'menu_icon' => 'dashicons-admin-home',
'supports' => array('title', 'editor', 'thumbnail'),
'rewrite' => array('slug' => 'property'),
'show_in_rest' => true,
);
register_post_type('property', $args);
}
add_action('init', 'register_property_post_type');
Обратите внимание на show_in_rest — этот параметр я включаю всегда, даже если сейчас не планирую использовать REST API. Опыт показывает, что потребность появляется внезапно, а переделывать архитектуру постфактум — боль.
Custom Fields: где хранить дополнительные данные
Теперь самое интересное — как добавить те самые параметры: площадь, этаж, отопление. Здесь у меня есть чёткая позиция: используйте ACF (Advanced Custom Fields), если проект не требует крайней оптимизации, и пишите meta boxes руками, если нужен полный контроль.
Вариант 1: с ACF
ACF — это плагин, который экономит десятки часов разработки. Создаёте группу полей через удобный интерфейс, привязываете к нужному типу записи — и всё, поля появляются в редакторе.
Для вывода данных на фронтенде код простой:
$area = get_field('area');
$floor = get_field('floor');
$heating_type = get_field('heating_type');
echo '<div class="property-details">';
echo '<p>Площадь: ' . esc_html($area) . ' м²</p