В этой статье: создание простой древовидной карты сайта 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=макс_число')
Здравствуйте, долго искал способ сделать карту сайта без плагина с выводом иерархии в рубриках, ваш вариант единственный рабочий из всех найденных мною. Способ отличный, единственный минус меня в карте сайта дублируется подрубрика, она есть в родительской рубрике и отдельно от нее выглядит вот так:
Рубрика "Досудебное урегулирование спора" (родительская рубрика)
Досудебное урегулирование спора (запись в родительской рубрике)
Рубрика "Претензия" (подрубрика)
Как правильно вручить претензию (запись в подрубрике)
Как составить претензию самостоятельно (запись в подрубрике)
Рубрика "Претензия"
Как правильно вручить претензию
Как составить претензию самостоятельно
Буду признателен если подскажите как можно убрать дублирование подрубрики
Я обычно с помощью WP Sitemap Page делаю, чтобы с кодом не ковыряться. И стараюсь как-то ещё апгрейдить, что ли, оживить, ...