В стандартном WordPress категории создаются и обновляются вручную. Но что делать, если нужны категории, которые автоматически формируются на основе определённых условий, например, по количеству постов, тегам или дате публикации? В этой статье разберём, как создать динамические категории в WordPress с помощью собственного кода и когда это может быть полезно.
Зачем нужны динамические категории в WordPress
Динамические категории позволяют автоматически структурировать контент, не требуя постоянного ручного обновления. Это полезно для сайтов с большим объёмом информации или регулярно обновляющимся контентом.
Например, можно автоматически создавать категории для:
- Постов, опубликованных за последние 30 дней;
- Постов, в которых встречается определённое ключевое слово;
- Тем, которые набирают популярность по количеству просмотров;
- Материалов, сгруппированных по авторам или пользовательским полям.
Такой подход экономит время редакторов и улучшает навигацию для пользователей.
Основные методы создания динамических категорий
Использование фильтров и хуков WordPress
WordPress предоставляет гибкую систему хуков, с помощью которых можно модифицировать существующие таксономии или создавать новые категории на лету. Например, можно использовать фильтр get_terms, чтобы подменять список категорий в зависимости от условий.
Однако такой способ не создаёт категории в базе данных, а лишь изменяет вывод. Это подходит для отображения, но не для полноценного взаимодействия с категориями.
Программное создание и обновление категорий
Для полноценного создания категорий удобнее использовать функции WordPress для работы с таксономиями — wp_insert_term, wp_update_term и wp_delete_term. Это позволяет создавать категории в базе данных и управлять ими программно.
Для автоматизации можно написать функцию, которая будет запускаться по расписанию (через WP-Cron) и обновлять список категорий.
Пример: автоматическое создание категории по количеству постов
Рассмотрим пример, как создать категории, которые будут отражать диапазоны количества постов, например: «Менее 10 постов», «От 10 до 50 постов», «Более 50 постов».
function wpfind_create_dynamic_categories() {
$counts = [
'less-10' => 'Менее 10 постов',
'10-50' => 'От 10 до 50 постов',
'more-50' => 'Более 50 постов'
];
foreach ($counts as $slug => $name) {
$term = term_exists($slug, 'category');
if (!$term) {
wp_insert_term($name, 'category', ['slug' => $slug]);
}
}
$posts_count = wp_count_posts()->publish;
if ($posts_count < 10) {
$category_slug = 'less-10';
} elseif ($posts_count <= 50) {
$category_slug = '10-50';
} else {
$category_slug = 'more-50';
}
$term = get_term_by('slug', $category_slug, 'category');
if ($term) {
// Присваиваем всем постам эту категорию (пример для всех постов)
$args = [
'post_type' => 'post',
'posts_per_page' => -1
];
$posts = get_posts($args);
foreach ($posts as $post) {
wp_set_post_terms($post->ID, [$term->term_id], 'category', true);
}
}
}
add_action('wp_find_cron_hook', 'wpfind_create_dynamic_categories');
// Регистрируем событие в WP-Cron, если его нет
if (!wp_next_scheduled('wp_find_cron_hook')) {
wp_schedule_event(time(), 'daily', 'wp_find_cron_hook');
}Этот код ежедневно проверяет количество опубликованных постов и присваивает соответствующую категорию всем постам. В реальных условиях стоит адаптировать логику под задачи проекта.
Динамические категории на основе пользовательских полей
Иногда категории хочется формировать, опираясь на данные из метаполей. Например, у вас есть метаполе product_type для постов, и хочется создавать категории по значениям этого поля.
Для этого алгоритм будет следующим:
- Собрать уникальные значения метаполя
product_type. - Проверить, существуют ли категории с такими именами.
- Создать недостающие категории.
- Присвоить постам соответствующие категории.
Пример кода:
function wpfind_dynamic_categories_from_meta() {
global $wpdb;
// Получаем уникальные значения метаполя
$meta_key = 'product_type';
$values = $wpdb->get_col($wpdb->prepare(
"SELECT DISTINCT meta_value FROM {$wpdb->postmeta} WHERE meta_key = %s",
$meta_key
));
if (!$values) {
return;
}
foreach ($values as $value) {
$slug = sanitize_title($value);
$term = term_exists($slug, 'category');
if (!$term) {
wp_insert_term($value, 'category', ['slug' => $slug]);
}
// Получаем посты с этим значением
$posts = get_posts([
'post_type' => 'post',
'posts_per_page' => -1,
'meta_key' => $meta_key,
'meta_value' => $value
]);
foreach ($posts as $post) {
wp_set_post_terms($post->ID, [$slug], 'category', true);
}
}
}
add_action('wp_find_cron_hook_meta', 'wpfind_dynamic_categories_from_meta');
if (!wp_next_scheduled('wp_find_cron_hook_meta')) {
wp_schedule_event(time(), 'daily', 'wp_find_cron_hook_meta');
}Такой подход хорошо подходит для сайтов с большим количеством товаров или материалов с метаданными, когда ручное создание категорий становится неудобным.
Как улучшить производительность и безопасность
Автоматическое создание и обновление категорий может влиять на производительность сайта. Чтобы избежать проблем, придерживайтесь следующих рекомендаций:
- Используйте WP-Cron для запуска задач в фоне, чтобы не замедлять загрузку страниц.
- Ограничивайте количество обрабатываемых постов за один запуск, если их слишком много.
- Кэшируйте результаты запросов к базе данных, если они используются несколько раз.
- Добавляйте проверку прав пользователя и используйте nonce при ручном запуске функций.
Также следите за тем, чтобы категории не создавались дублирующимися и не нарушали логику сайта — используйте term_exists и корректные слаги.
Полезные плагины для работы с таксономиями
Если хочется упростить задачу или получить расширенный функционал, можно посмотреть на плагины, которые помогают создавать и управлять таксономиями:
- Clearfy Pro — плагин для оптимизации WordPress, который имеет функции управления таксономиями и может помочь убрать лишние категории.
- WPRemark — плагин с расширенными возможностями для комментариев и таксономий.
Однако для полностью кастомных задач лучше использовать собственный код, как показано выше.