Как гибко управлять контентом на WordPress: Custom Post Types и Custom Fields

Как гибко управлять контентом на 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