WordPress: работаем с собственными форматами постов

WordPress: работаем с собственными типами постов

В этой записи пойдет речь о том, как создать собственный тип поста, делать запросы в базу по собственному типу, а так же как добавлять новые данные к уже существующим запросам.Как я уже описал выше, вы можете создать собственные шаблоны для своего типа поста. Точно так же как у определенных типов записей есть собственные шаблоны, например single.php и archive.php — вы можете сделать тоже самое.

  • single-{тип_поста}.php — для просмотра полной записи с собственным типом поста
  • archive-{тип_поста}.php — для архивов

Где указано {post_type} — это и есть $post_type аргумент внутри функции register_post_type().

Теперь из того, что мы выучили ранее, вы можете создать файлы single-bologer_product.php и archive-bologer_product.php для отображения одиночной страницы продукта, а так же страница с архивом.

В дополнении, с помощью функцию is_post_type_archive() вы можете проверить если отображаемая страница имеет тип архивной страницы, а так же отобразить заголовок страницы с помощью post_type_archive_title().

Делаем запрос по типу поста

Вы можете получить данные определенного типа, добавив ключ post_type как аргумент внутри конструктора класса WP_Query.

Делается это следующим образом:

$args = [
    'post_type'      => 'product',
    'posts_per_page' => 10,
];
$loop = new WP_Query($args);
while ($loop->have_posts()) {
    $loop->the_post();
    ?>
    <div class="entry-content">
        <?php the_title(); ?>
        <?php the_content(); ?>
    </div>
    <?php
}

В примере выше, мы взяли 10 записей и в цикле выводим заголовок и контент каждой из них.

Добавляет данные в текущий запрос

Регистрируя новый тип поста не означает, что он автоматически попадает в основной запрос.

Если вы хотите, чтобы ваш собственный тип отображался в стандартном архиве или на главной странице, вместе с другими типами, используйте хук pre_get_posts.

Пример ниже покажет посты из категории postpage и movie на главной странице сайта:

function bologer_add_custom_post_types($query)
{
    if (is_home() && $query->is_main_query()) {
        $query->set('post_type', ['post', 'page', 'movie']);
    }
    return $query;
}
add_action('pre_get_posts', 'bologer_add_custom_post_types');