В этом уроке мы завершаем важный этап разработки собственного плагина WordPress — вывод данных, созданных через пользовательские типы записей (Custom Post Types), таксономии и метабоксы. Мы уже реализовали регистрацию этих сущностей и подготовили шаблоны для отображения контента. Теперь пришло время объединить всё это в единую работающую систему отображения данных на фронтенде.
1. Подготовка шаблонов и структура архива
Для вывода контента создаём шаблон архивной страницы — например, archive-property.php. Этот файл отвечает за отображение списка наших объектов (например, недвижимости, товаров, проектов и т.п.).
Основная структура архива выглядит так:
<div class="wrapper">
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
        <article <?php post_class('property'); ?> id="post-<?php the_ID(); ?>">
            <h2><?php the_title(); ?></h2>
            <div class="description"><?php the_excerpt(); ?></div>
        </article>
    <?php endwhile; endif; ?>
</div>
Использование post_class() добавляет WordPress-классы, необходимые для совместимости с плагинами и темами.
Не забываем про пагинацию — она обеспечит навигацию по страницам архива.
2. Вывод данных из метабоксов
Ранее мы добавляли в записи пользовательские мета-поля — например, цена, период, агент, тип и другие. Для их вывода используется функция get_post_meta():
<?php
$price = get_post_meta( get_the_ID(), 'property_price', true );
$period = get_post_meta( get_the_ID(), 'property_period', true );
if ( $price ) {
    echo '<span class="price">' . esc_html( $price ) . ' / ' . esc_html( $period ) . '</span>';
}
?>
Важно: все данные, полученные из базы, нужно экранировать через функции esc_html(), esc_attr() и т.п., чтобы предотвратить XSS-уязвимости.
3. Работа с таксономиями
Таксономии позволяют привязать записи к категориям или локациям (например, «город», «тип недвижимости» и т.д.).
Чтобы получить и вывести термины, используем get_the_terms():
<?php
$locations = get_the_terms( get_the_ID(), 'location' );
if ( $locations && ! is_wp_error( $locations ) ) {
    foreach ( $locations as $location ) {
        echo '<span class="location">' . esc_html( $location->name ) . '</span>';
    }
}
?>
Аналогично можно вывести и тип объекта:
$types = get_the_terms( get_the_ID(), 'property_type' );
Такой подход позволяет гибко связывать объекты с категориями, фильтровать их и строить навигацию по типам.
4. Индивидуальные страницы объектов
Для отдельной записи создаётся шаблон single-property.php.
Он похож на архив, но выводит полный контент (the_content()), а не краткое описание (the_excerpt()), и не содержит пагинации.
Пример:
<article <?php post_class('property-single'); ?> id="post-<?php the_ID(); ?>">
    <h1><?php the_title(); ?></h1>
    <div class="description"><?php the_content(); ?></div>
    <div class="property-info">
        <span class="price"><?php echo esc_html( $price ); ?></span>
        <span class="agent"><?php echo esc_html( $agent_name ); ?></span>
    </div>
</article>
Если вы используете связь между постами (например, “агент” как отдельный post_type), то агентские данные можно получить через get_post() по ID, сохранённому в метаполе.
5. Настройка и переопределение шаблонов
Один из ключевых плюсов такой архитектуры — возможность переопределения шаблонов темой.
Пользователь может скопировать шаблон из папки плагина (templates/) в папку своей темы и изменить его дизайн без потери функциональности.
Например:
/wp-content/plugins/my-plugin/templates/archive-property.php
↓ копируем в
/wp-content/themes/mytheme/archive-property.php
WordPress автоматически подхватит версию из темы. Это делает ваш плагин гибким и дружественным к кастомизации.
6. Стилизация карточек и сетки
Для аккуратного вывода карточек используем flex-контейнер:
.wrapper {
    display: flex;
    flex-wrap: wrap;
    gap: 20px;
    justify-content: center;
}
.property {
    width: 30%;
    background: #fff;
    padding: 40px;
    box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
Таким образом, все объекты аккуратно выстраиваются в сетку по три в ряд.
7. Проверка пагинации
Не забудьте проверить, что пагинация работает корректно.
Для этого в настройках чтения (Settings → Reading) укажите количество записей на странице, например 2 поста. При переходе по страницам (next page) вы должны видеть подгрузку новых объектов.
8. Расширение функционала
Теперь, когда шаблоны для архивов и одиночных страниц готовы, можно добавлять дополнительные функции — например, форму бронирования, блоки с похожими объектами, или фильтрацию по таксономиям.
Заключение
В результате мы реализовали полный цикл вывода контента в плагине WordPress:
- Отображение пользовательских пост-типов в архиве и на одиночных страницах;
 - Вывод данных из метаполей и таксономий;
 - Реализацию пагинации;
 - Возможность переопределять шаблоны через тему.
 
Такой подход обеспечивает масштабируемость, совместимость с экосистемой WordPress и простоту дальнейшей кастомизации дизайна без вмешательства в код плагина.