Привет, друзья! Сегодня я хочу поделиться с вами своим опытом. На моем сайте была задача: отобразить записи из подкатегорий, используя многоуровневую структуру. Звучит просто, но, поверьте, есть свои нюансы! Давайте разберем, как я это сделал.
Структура категорий
Итак, у меня была такая структура:
- Каталог
- Подкаталог(1) (1 уровень)
- -Подкаталог(1) (2 уровень)
- - Подкаталог(2) (2 уровень)
- Подкаталог(2) (1 уровень)
Например в Каталоге мне нужно вывести все непустые подкатегории с их записями - название Подкаталога(1), а под ним — список из 6 записей.
Подход к решению задачи
Для начала мне нужно было получить текущую категорию. Вот как это делается:
$category = get_queried_object(); // Получаем текущую категорию
$category_id = $category->term_id; // Извлекаем ID категории
В этом коде я использую функцию `get_queried_object()`, чтобы получить информацию о текущей категории, и затем извлекаю ее ID. Этот ID мне понадобится для запроса подкатегорий.
Теперь, когда я знаю, с какой категорией работаю, я перехожу к следующему шагу — получению подкатегорий:
$li_args = array(
'parent' => $category_id,
'hide_empty' => 1,
);
$categories = get_categories($li_args); // Получаем массив категорий
Здесь я создаю массив `$li_args`, в котором указываю параметры для получения подкатегорий. Уровень вложенности (`hide_empty`) равен 1, чтобы получить только подкатегории в которых есть записи.
Нужно сделать проверку в какой категории мы находимся в родительской или подкатегории.
if (empty($categories)) {
if ($category->parent) { // Если подкатегорий нет, проверяем, есть ли у текущей категории родитель
$parent_id = $category->parent; // Получаем родительскую категорию
$li_args['parent'] = $parent_id; // Получаем подкатегории родительской категории
$categories = get_categories($li_args);
}
}
Теперь, когда у меня есть массив подкатегорий, я могу пройтись по ним и вывести записи:
foreach($categories as $cat) {
echo '<h2>' . $cat->name . '</h2>';
$args = array(
'category__in' => array($cat->term_id),
'posts_per_page' => 6
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// Вывод информации о посте
the_title();
the_content();
}
}
wp_reset_postdata();
}
В этом блоке кода я перебираю каждую подкатегорию, вывожу ее название и формирую запрос для получения записей. Параметр `posts_per_page` установлен в `6`, чтобы получить 6 записей из подкатегории. Если нужно вывести все, то ставим -1
Теперь мне нужно проверить, есть ли записи, и если да, то вывести их:
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post(); // Устанавливаем пост
// Вывод информации о посте
the_title('<h3>', '</h3>'); // Название поста
the_content(); // Содержимое поста
}
}
wp_reset_postdata(); // Сбрасываем данные запроса
}
В этом фрагменте я проверяю, есть ли записи в запросе. Если да, то выводим заголовок и содержимое каждой записи. Не забываем в конце сбросить данные запроса с помощью `wp_reset_postdata()`, чтобы избежать конфликтов с другими запросами на странице.
Заключение
Вот и все! Таким образом, я смог вывести записи из подкатегорий на своем сайте. Этот процесс требует внимания к деталям, но, следуя шагам, можно добиться желаемого результата. Если у вас возникнут вопросы или вы захотите обсудить другие аспекты работы с WordPress, пишите в комментариях!
Полный код выложил в своем телеграм канале.