Простая карта сайта для WordPress


В этой статье: создание простой древовидной карты сайта 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 ?>

Карта сайта готова, остается добавить стили - создать свой неповторимый дизайн для полученного списка ссылок на страницы, рубрики и записи.

Опубликовано в рубрике Создание и изменение темы | с метками . |

Еще записи

3 комментария на «Простая карта сайта для WordPress»

  1. Andrews32 говорит:

    У меня ваш код вывода записей почему-то не работает. Вспомнил старый добрый

  2. Andrews32 говорит:

    php wp_get_archives('type=postbypost&limit=макс_число')

  3. Денис говорит:

    Здравствуйте, долго искал способ сделать карту сайта без плагина с выводом иерархии в рубриках, ваш вариант единственный рабочий из всех найденных мною. Способ отличный, единственный минус меня в карте сайта дублируется подрубрика, она есть в родительской рубрике и отдельно от нее выглядит вот так:

    Рубрика "Досудебное урегулирование спора" (родительская рубрика)
    Досудебное урегулирование спора (запись в родительской рубрике)
    Рубрика "Претензия" (подрубрика)
    Как правильно вручить претензию (запись в подрубрике)
    Как составить претензию самостоятельно (запись в подрубрике)
    Рубрика "Претензия"
    Как правильно вручить претензию
    Как составить претензию самостоятельно

    Буду признателен если подскажите как можно убрать дублирование подрубрики

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *