С помощью функций WordPress можно довольно просто создать карту сайта или содержание каких-то разделов сайта, например, каталог товаров, информация о которых содержится в записях или на постоянных страницах сайта WordPress. Конечно, уже давно созданы плагины, генерирующие карту сайта, но что-то в них так много кода понаписано, так все запутано! Итак, создадим шаблон постоянной страницы для древовидной карты сайта с использованием функций WordPress wp_list_pages, get_page_by_title, get_categories и пользовательского запроса - объекта WP_Query.
В этой статье: создание простой древовидной карты сайта WordPress - вывод
Страниц (wp_list_pages() и get_page_by_title()) и
Записей (объект WP_Query и get_categories()).
Страница карты сайта

Пример карты сайта
В случае WordPress карта сайта содержит список постоянных страниц (или просто страниц; страница - Page) и список записей (или постов; запись - Post) и обычно находится на отдельной (постоянной) странице. Создадим шаблон страницы с кодом, генерирующим карту сайта WordPress.
О том, что такое шаблон страницы (Page Template), и как его создать, см. в статье Шаблон страницы в WordPress. Напомню, что шаблоном (его можно выбрать для постоянной страницы в разделе Атрибуты страницы) является .php-файл, расположенный в корневой папке темы WordPress, в начале которого задано имя шаблона, например, "Site Map", т.е. "Карта сайта":
<?php
/*
Template Name: Site Map
*/
?>
Затем следует код, который формирует HTML-страницу сайта. Чтобы страница карты сайта имела такой же вид, как и остальные страницы, можно просто взять код из файла page.php в корневой папке темы и вставить в него код карты сайта вместо строки
<?php the_content(); ?>
которая выводит содержимое страницы, или после нее. Если эту строку оставить, можно будет добавлять содержимое страницы как обычно, а карта сайта добавится при генерации HTML-кода автоматически.
Код, генерирующий карту сайта
Сначала выведем (постоянные) страницы, а затем записи блога.
Страницы
Со страницами все просто, т.к. иерархия страниц строится путем добавления дочерних страниц, и в WordPress есть функция wp_list_pages, которая выводит любое заданное иерархическое множество страниц, по умолчанию все страницы с их дочерними страницами, причем в начале выводится заголовок "Страницы" (или в английском варианте "Pages") как элемент списка верхнего уровня.
Если нужно исключить какие-то страницы или вывести только дочерние страницы одной из страниц, нужно указать ID этих страниц, например:
<?php // Исключение страницы с названием 'About': $page = get_page_by_title('About'); // получение объекта страницы wp_list_pages('exclude='. $page->ID); // вывод списка страниц без элемента с указанным ID ?> // Вывод содержания одного раздела (дочерних страниц страницы "Справочник WordPress"): <h3>Справочник WordPress</h3> // только дочерние страницы для страницы с ID=7; // заголовок не выводится: <?php wp_list_pages('child_of=7&title_li='); ?>
*** ID страницы можно указать явно, если это значение известно, или узнать по названию страницы с помощью функции get_page_by_title().
Записи
В WordPress есть функции для вывода записей рубрики (или всех записей) и для вывода иерархии рубрик. Но в WordPress, кажется (?), нет функции, которая выводила бы содержание записей с рубриками как содержание книги или каталог записей. Но именно такая функция нам нужна (get_mycat_contents).
По умолчанию функция get_categories возвращает список всех рубрик (categories) без ограничения вложенности, а parent=0 значит "ID непосредственного родителя = 0", т.е. без родительской рубрики":
<h3>Записи</h3> <?php // рубрики верхнего уровня $cats=get_categories('parent=0'); // вывод содержания рубрик foreach( $cats as $cat ) : get_mycat_contents($cat -> cat_ID); endforeach; ?>
Функция get_mycat_contents сначала создает цикл (см. Циклы WordPress) и выводит записи рубрики. Запрос возвращает список записей, которые входят как в текущую рубрику, так и в ее дочерние рубрики, а их выводить не нужно, т.к. они будут выводиться позже для соответствующих дочерних рубрик.
<?php function get_mycat_contents($mycat_id) { global $post; // Записи рубрики с ID=$mycat_id $my_query = new WP_Query( "cat=" . $mycat_id); if ( $my_query->have_posts() ) { ?> <li>Рубрика "<a href="<?php echo get_category_link($mycat_id); ?>"><?php echo get_cat_name($mycat_id); ?></a>" <ul> <?php while ( $my_query->have_posts() ) { $my_query->the_post(); $cats=get_the_category(get_the_ID()); $c_id=$cats[0]->cat_ID; if ( $c_id == $mycat_id ) { // сравнение ID родительской и текущей рубрик // Далее - ссылка на запись: ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php } } } wp_reset_postdata();// восстановление глобальных переменных
А теперь получаем дочерние рубрики и рекурсивно вызываем для них функцию get_mycat_contents:
// Дочерние рубрики: $cats=get_categories('&parent=' . $mycat_id); foreach( $cats as $cat ) : get_mycat_contents($cat -> cat_ID); endforeach; ?> </ul> </li> <?php } // end of function ?>
Карта сайта готова, остается добавить стили - создать свой неповторимый дизайн для полученного списка ссылок на страницы, рубрики и записи.
У меня ваш код вывода записей почему-то не работает. Вспомнил старый добрый
php wp_get_archives('type=postbypost&limit=макс_число')
Здравствуйте, долго искал способ сделать карту сайта без плагина с выводом иерархии в рубриках, ваш вариант единственный рабочий из всех найденных мною. Способ отличный, единственный минус меня в карте сайта дублируется подрубрика, она есть в родительской рубрике и отдельно от нее выглядит вот так:
Рубрика "Досудебное урегулирование спора" (родительская рубрика)
Досудебное урегулирование спора (запись в родительской рубрике)
Рубрика "Претензия" (подрубрика)
Как правильно вручить претензию (запись в подрубрике)
Как составить претензию самостоятельно (запись в подрубрике)
Рубрика "Претензия"
Как правильно вручить претензию
Как составить претензию самостоятельно
Буду признателен если подскажите как можно убрать дублирование подрубрики