В последнее время заметил, что 90% сайтов делаю на системе управления WordPress.
Есть у нее свои плюсы, которые существенно перевешивают минусы.
Минусы устраняются ручками. Так что если надо сделать нечто выходящее за функционал, просите спеца.
Недавно на одном из сайтов понадобилось оглавление с подсчетом количества подстраниц.
Стандартными средствами WordPress этого сделать не удалось, а подходящего плагина не нашел.
Написал скрипт:
<?php if (is_page('8')){ ?> <p> <ul class="catogl"> <?php $page = $post->ID; $children=wp_list_pages('echo=0&child_of='.$page); if ($children) { $vsevstroke = wp_list_pages('echo=0&depth=2&child_of='.$page.'&title_li='); } $patterns[0] = "'<li[^>]*?>'si"; //Что заменить $replacements[0] = '<li class="catli">'; //На что заменить $vsevstroke = preg_replace($patterns, $replacements, $vsevstroke); //Модифицировал строку $mass = explode("\n", $vsevstroke);//Создаю массив с разделителем конец строки $flagvivoda = true; //Флаг вывода строки $schet = 0; //Начальный счетчик подстраниц foreach($mass as $key => $val){ if(strpos($mass[$key], 'ul class')){$flagvivoda = false;} //Если вижу начало подстраниц - деактивирую флаг вывода строк if($flagvivoda){echo $mass[$key];} //Если флаг вывода строк активен - вывожу строку if(!$flagvivoda){$schet++;} //Если флаг вывода не активен, увеличиваю счетчик подстраниц на 1 if(strpos($mass[$key], '/ul>')){ //Если подстраницы закончились... $schet= $schet - 2; //Отступ на строку начала списка подстраниц и строку конца $flagvivoda = true; //Флаг вывода строк снова активен echo ' ('.$schet.')';$schet = 0; //Обнуляю счетчик } } ?> </ul> </p> <?php } ?>
Все просто.
Если вызвана нужная нам страница (ID=8), то проверяем ее ID и смотрим есть ли у нее подстраницы с подподстраницами.
Если есть, выводим список подстраниц и их подподстраниц в переменную.
Разбиваем переменную в массив по концам строк.
Листаем массив, выводя названия подстраниц, а натыкаясь на список подподстраниц начинаем их пересчитывать до конца этого списка, после чего в скобках доприсываем к названию подстраницы количество ее подподстраниц.
Выводим название следующей подстраницы и так до конца массива
Результат получился такой:
- Медицинские центры (10)
- Детские театры (1)
- Стоматология (14)
- Курсы иностранных языков (1)
- Детские развивающие центры (19)
- Развлекательные центры (1)
- Телефоны и адреса ЖЭК
- Собес
- Отдел ЗАГС Приморского р-на (4)
- Пенсионный фонд
- Детские поликлиники
- Государственные детские сады
А с вами был Лексиум…
Нда…
Доброй ночи! Подскажите, а куда этот скрипт в вордпрессе вставить надо, чтобы он работала? Я так понимаю если я буду заходить на страницу с ID=8 мне на ней выдаст список подстраниц 1го уровня с количеством подстраниц в них?
Павел
PHP cкрипт обычно вставляют в шаблон, но есть варианты. На счет «списка подстраниц» — все есть в тексте.
Добрый день.
Спасибо. Все получилось. Что-то я вначале протупил и использовал шаблон для страницы не с тем номером, что в скрипте. А как сделать, чтобы отображалась на экране не только родительская страница, а еще и первый уровень вложенности с количеством страниц в них?
Не очень понятен вопрос. Разве приведенный код не отображает подстраницы?
Не смотря на то, что там есть степень вложенность depth=2,выдает только количество для главной родительской страницы. а подстраницу почему-то не показывает.
вот пробная страница:
http://sovmint.ru/?page_id=2454
слева — Ваш скрипт, справа — вывод всех подстраниц каталога обычной функцией wp_list_pages
2 копейки является подстраницей каталога, но она не была показана.
Проверил на этом сайте — работает. Фрагмент кода вносили без изменений?
я в скрипте поменял только номер страницы
т.е. у Вас бы выдалось
Каталог… (22)
*2копейки (1)
?
Да. Скрипт показывает количество, если есть подстраницы.
Попробуйте отключить плагины и сменить тему (шаблон), а затем по очереди включать обратно. Возможно конфликтует.
Только советую вначале сделать полный бэкап сайта (в т.ч. базы). На всякий случай.
Я так понял он выводит и считает число подстраниц только первой вложенности, тогда это все объясняет.
А можно, чтобы он сам определял как-то ID страницы, чтобы этот шаблон можно было использовать для разных случаев?
Да.
Можно убрать условие и он будет отображаться на всех страницах.
Можно сделать, чтобы работал только на подстраницах какой-нибудь конкретной (но это сложнее).
Можно засунуть в функции шаблона и вставлять вызов этого оглавления в каждую нужную страницу шоткодом.
Это же программирование в конце-концов.))
Спасибо! Теперь все отлично. Еще бы научиться выводить список страниц функцией wp_list_pages в строку. Не знаете есть такая возможность?
Программированием не занимался уже лет 12 ;( а до этого всего лишь Паскаль.
Думаю самым простым будет использовать str_replace () или preg_replace ().
Или поискать в «кодексе» вордпресса (возможно есть аналог параметра ‘&title_li=’).
Спасибо! Изучу этот момент. Спасибо за Вашу заметку, она мне очень помогла.