Как вывести список категорий
Я пытаюсь настроить список категорий с кликабельными ссылками на эти категории. Я просмотрел:
и не совсем уверен, куда поместить код или как получить к нему доступ на странице.
Я достаточно хорошо понимаю PHP - он довольно прост, просто я относительно новичок в WP и мне нужна помощь с реализацией.
Я покажу вам, как вывести список категорий в WordPress и пометить активную категорию, смотрите код ниже:
<?php
// Получаем текущий запрашиваемый объект
$term = get_queried_object();
$term_id = ( isset( $term->term_id ) ) ? (int) $term->term_id : 0;
$categories = get_categories( array(
'taxonomy' => 'category', // Таксономия для получения терминов. Мы используем 'category'. Этот параметр по умолчанию 'category', поэтому его можно опустить
'orderby' => 'name',
'parent' => 0,
'hide_empty' => 0, // измените на 1, чтобы скрыть категории без записей
) );
?>
<ul>
<?php
foreach ( $categories as $category )
{
$cat_ID = (int) $category->term_id;
$category_name = $category->name;
// При просмотре конкретной категории добавляем класс [active]
$cat_class = ( $cat_ID == $term_id ) ? 'active' : 'not-active';
// Я не люблю показывать категорию [uncategorized]
if ( strtolower( $category_name ) != 'uncategorized' )
{
printf( '%3$s',
esc_attr( $cat_class ),
esc_url( get_category_link( $category->term_id ) ),
esc_html( $category->name )
);
}
}
?>
</ul>
Примечания к коду выше:
get_queried_object() получает текущий запрашиваемый объект. Например:
- если вы на странице записи, вернётся объект записи
- если вы на странице, вернётся объект страницы
- если вы в архиве, вернётся объект типа записи
- если вы в архиве категории, вернётся объект категории
- если вы в архиве автора, вернётся объект автора
- и т.д.
Но есть нюансы при использовании get_queried_object(), не стоит ожидать, что он вернёт объект типа записи, даже если is_post_type_archive() возвращает true. Проверьте это для получения дополнительной информации.
Также обратите внимание, что get_queried_object() является обёрткой для $wp_query->get_queried_object(), поэтому возвращает тип данных WP.
get_categories()
get_categories() получает список объектов категорий. Принимает только один параметр - $args. Параметр $args задаёт список аргументов для получения категорий. Смотрите get_terms() для дополнительных опций.
Однако, чтобы получить категории для конкретной записи, вот простая функция, которую я написал: Как получить список категорий для записи
Как указано в связанной ветке WPSE и принятом ответе, код выглядит следующим образом (скопировано и вставлено):
$categories = get_categories('child_of=31');
foreach ($categories as $category) {
// Отображаем информацию о подкатегории, используя значения $category, такие как $category->cat_name
echo '<h2>'.$category->name.'</h2>';
echo '<ul>';
foreach (get_posts('cat='.$category->term_id) as $post) {
setup_postdata( $post );
echo '<li><a href="'.get_permalink($post->ID).'">'.get_the_title().'</a></li>';
}
echo '</ul>';
}
Для нас (разработчиков WordPress) Кодекс является ключом к большинству базовых вещей. Согласно WordPress Codex:
get_categories()выполняет запрос для всех категорий сайта и возвращает массив.- Аналогично
get_posts()выполняет запрос для всех записей сайта и возвращает массив.
Оба этих метода являются сокращёнными версиями WP_Query(). Все возможные параметры для них можно найти на страницах Кодекса. Поскольку вы увлекаетесь PHP, вы понимаете, как работает код: переменная $categories получает все категории, и для каждой категории get_posts() получает её записи.
Это очень похоже на запрос mySQL и цикл foreach в чистом PHP. Вы можете поместить этот код в любую из шаблонных страниц активной темы вашего сайта WordPress. Иерархия шаблонов может дать вам более детальное понимание.
Поскольку заголовок вашего вопроса звучит так:
Как отобразить список категорий
Ответ может быть следующим:
$categories = get_categories();
echo '<ul>';
foreach ($categories as $category) {
echo '<li>'. $category->cat_name .'</li>';
}
echo '</ul>';
Я не совсем уверен, куда вставить этот код или как получить к нему доступ на странице.
Я уже говорил: попробуйте вставить код в index.php, front-page.php или куда угодно. Ключевая концепция заключается в том, что это просто SQL-запрос и полезный цикл foreach на PHP.
Этот метод позволяет исключить любую категорию, просто добавив её ID в код.
Вот более удобный способ условного вывода списка категорий из файла функций вашей дочерней темы в любом хуке WordPress или конкретной темы:
add_filter( 'the_content', 'wpsites_list_cats' );
function wpsites_list_cats($content) {
if( is_singular('post') && is_main_query() ) {
$args = array(
'orderby' => 'name',
'exclude' => '',
'include' => '',
'parent' => 0
);
$categories = get_categories( $args );
echo'<nav id="primary-navigation" class="primary-navigation" role="navigation">';
foreach ( $categories as $category ) {
echo '<li><a href="' . get_category_link( $category->term_id ) . '">' . $category->name . '</a></li>';
}
echo'</nav>';
return $content;
}
}
Вот результат:

А вот результат, если вы хотите использовать существующие стили навигационных меню из темы Twenty Fourteen, которые включены в приведённый выше код.

Код также позволяет включать определённые категории или исключать любые, используя их ID.
Вы также можете создать пользовательскую область виджетов и использовать стандартный виджет категорий WordPress.
Просто измените хук the_content, чтобы поменять расположение списка категорий.
Модифицировано из этого источника
Или используйте плагин List Categories с его собственным настраиваемым шорткодом, который работает как ярлык для wp_list_categories( array|string $args = '' ) функции.
Вы можете настроить его аргументы, как описано в документации.