HTML карта сайта на WordPress (со сложной иерархией рубрик)

Опубликовано: Понедельник, Май 26, 2014 Комментарии (20)

Еще одна карта на WordPress

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

Задача: в блоге есть рубрики и подрубрики. Один пост может входить в несколько подкатегорий. Например:

Нужно выводить пост во всех подрубриках последнего уровня, чтобы не было дублей в родительских категориях. Все решения, включая реализацию через плагины и без них, предлагают просто выводить запись в одной из подкатегорий. Но мне это не подходило.

Итак, что получилось, можно посмотреть на странице моего блога “Содержание блога“.

Стандартные шаги создания карты сайта для пользователей

1. Создадим php шаблон

Общая структура шаблона:

Обратите внимание, что комментарием Template Name задается имя шаблона. У меня шаблон для карты блога называется “HTML SITEMAP”.

2. Создадим страницу для вывода карты сайта

Ну как создавать страницу в WordPress, думаю, уж точно описывать не надо. Главное не забудьте указать шаблон для страницы (у меня – HTML SITEMAP).

Вывод рубрик, подрубрик и записей на последнем уровне категорий

Итак, теперь я приведу код всего шаблона карты сайта с комментариями.

Самое главное условие, которое забрало у меня немного времени и сил это:

А точнее функция level_last. Не буду вдаваться в детали, но методы, которые я нашла в поисковике не работали. А решение, по-моему, лежало на поверхности. Просто получить массив из id всех категорий, в которые входит запись. Затем, пройтись по массиву, записывая в переменную наибольшее значение уровня вложенности.

Поделитесь с друзьями:

Читайте также:

Комментируйте:

  • Евгений

    Не работает данный код. При инициализации переменная $cats возвращает пустоту. При попытках изменить функцию получаем бесконечный вложенный массив с категориями, подкатегориями и постами. Отсюда вопрос: под какую версию движка писался данный код?

    • http://positivecrash.com/ Настя Бакай

      Надо разбираться почему у вас не работает. Писалось давно, но работает и на самой последней версии. У меня на сайте абсолютно такой же механизм: http://positivecrash.com/sitemap/

      • Евгений

        Я разобрался, в чем была проблема. У меня структура сайта такая: категория -> подкатегория -> пост. Для корректной работы представленного вами кода необходимо, чтобы в каждой категории первого уровня был минимум 1 пост. Без этого функции не работают, и весь контейнер с контентом просто пропадает, а сайдбар съезжает -) Если несложно, добавьте в вашу статью данное уточнение, дабы люди вроде меня не ломали себе голову -)

        • http://positivecrash.com/ Настя Бакай

          Если я правильно вас поняла, то у вас возникла ошибка из-за пустой категории верхнего уровня. Я создала для теста такую пустую категорию. Вроде бы все так же работает.

          Это, конечно, странное предположение, но может у вас где-то hide_empty (не получать пустые категории, по умолчанию true) проставлен false (получать). Тогда бы это все объяснило.

          • Евгений

            Поясню на примере вашей карты сайта: у вас есть “Категория: Web заметки”, в которой находятся вложенные подкатегории с постами в каждой из них. Если бы у вас не было ни одного поста в “Категория: Web заметки”, то данная категория со вложенными подкатегориями и вовсе бы не вывелась.

            • http://positivecrash.com/ Настя Бакай

              Так?

              • Евгений

                Хм, вот теперь я ничего не понимаю. В таком варианте, как у вас, у меня не работает. Но, как бы то ни было, я вам благодарен за выше предоставленный код иерархической карты сайта, пусть он у меня и работает несколько не так, как задумывалось. Кстати, ваш блог единственный, в котором я нашел нужную информацию, за что вам огромное спасибо -)

                • http://positivecrash.com/ Настя Бакай

                  Это очень приятно, спасибо :) Жаль правда, что вам я не смогла помочь.. Могу лишь посоветовать, если интересно поотлаживать, установить плагин на подобие “Theme Test Drive” (чтобы на “живом” сайте ничего не ломать) и попробовать то же самое с шаблоном проделать на теме по умолчанию.

  • Светлана

    Подскажите, пожалуйста, как поменять цвет шрифта. У меня светло-зеленый текст на зеленом фоне не очень хорошо смотрится…

    • http://positivecrash.com/ Настя Бакай

      Цвет ссылок нужно менять в css файле. Как правило, стили в WordPress теме задаются в файле style.css (его можно найти в административной панели внешний вид->редактор), но если вы не знакомы с css, лучше попросить кого-нибудь, кто хотя бы чуть-чуть разбирается в верстке (ну и, разумеется, кому вы доверяете доступ к своему сайту).

      • Светлана

        Через функцию “просмотр кода элемента” в Хроме нашла место в style.css, где нужно было поменять цвет.

        • http://positivecrash.com/ Настя Бакай

          здорово, что сами разобрались! и что сюда написали, вдруг еще кому-то пригодится)))

          • Светлана

            Кстати, еще вопрос! А как мне страницу “Карта сайта” сделать такой же по формату, как все остальные страницы? Чтобы текст был на сером фоне, “бордер” светло-зеленый, отступы и т.д. ?

            • http://positivecrash.com/ Настя Бакай

              Можно так: скопировать файл шаблона из вашей темы (лучше наверное page.php или single.php) и нужно определить где у вас там контентная часть. И туда вставить код карты (из моего поста это часть последнего куска кода Ну и весь код, который в этом теге, разумеется)

              • Светлана

                Пришлось попыхтеть, но получилось… Копировать пришлось не только из page.php, но еще из post-single.php небольшой кусочек. Оцените, как получилось… И еще один вопрос: можно ли в код карты вписать код, отвечающий за размер шрифта выводимых записей (см. скрин)
                P.S. Спасибо за ответы!

                • http://positivecrash.com/ Настя Бакай

                  Можно проставить классы уровней и задать стили (размеры шрифтов) в style.css :)
                  Для этого нужно в выводе категорий (в коде из поста это 62 строчка) добавить примерно следующее:

                  • http://positivecrash.com/ Настя Бакай

                    В разметке это выглядит, как на прикрепленном здесь скриншоте.
                    п.с. всегда рада помочь :)

  • ifox3000

    Спасибо Вам ОГРОМНОЕ за код!!! Все работает на 100%!!!

  • http://keblog.ru/ Александр

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

    map(0,’Раздел’);//вызов 1
    map($cat->cat_ID,’Подраздел’);//вызов 2
    function map($parentID,$sub)//принимаем
    echo ” $sub : category_nicename.”‘>”.$cat->cat_name.”“;//подставляем

    • http://positivecrash.com/ Настя Бакай

      Спасибо за дополнение!