Home News

Вывод списка подстраниц для текущей страницы

01.09.2018

Одно из самых знаковых отличий постов в wordpress от страниц — возможность иметь определенную иерархию. То есть, вы можете создать на сайте страницу, например, «О компании» и добавить в нее подстраницы «Наша команда», «Наша миссия», «Контакты» и т.п. Если при этом в шаблоне использовать функции wp_list_pages для вывода списка страниц, то иерархия будет видна для посетителей. Это потом уже разработчики добавили раздел меню сайта в wordpress где можно компоновать любые ссылки.

Подобная иерархия может пригодиться для нестандартных требования при разработке веб-проекта — допустим, заказчик захочет выводить в боковой колонке список подстраниц для того или иного раздела. Рассмотрим как это можно сделать (за решение спасибо автору этой статьи ). Вот пример как это может выглядеть на сайте.

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

Но перед этим напомню еще разок как создается подстраница. При создании страницы в специальном блоке «Атрибуты страницы» выбираете родительскую.

Если не видите данный блок, то сверху есть ссылка «Настройки экрана», где можно включить отображение блока.

Добавление функции

Первым делом нам нужно добавить в файл functions.php специальную функцию.

function wpb_list_child_pages ( ) { global $post ; if ( is_page ( ) && $post -> post_parent ) $childpages = wp_list_pages ( 'sort_column=menu_order&title_li=&child_of=' . $post -> post_parent . '&echo=0' ) ; else $childpages = wp_list_pages ( 'sort_column=menu_order&title_li=&child_of=' . $post -> ID . '&echo=0' ) ; if ( $childpages ) { $string = '<ul>' . $childpages . '</ul>' ; } return $string ; } add_shortcode ( 'wpb_childpages' , 'wpb_list_child_pages' ) ;

function wpb_list_child_pages() { global $post; if ( is_page() && $post->post_parent ) $childpages = wp_list_pages( 'sort_column=menu_order&title_li=&child_of=' . $post->post_parent . '&echo=0' ); else $childpages = wp_list_pages( 'sort_column=menu_order&title_li=&child_of=' . $post->ID . '&echo=0' ); if ( $childpages ) { $string = '<ul>' . $childpages . '</ul>'; } return $string; } add_shortcode('wpb_childpages', 'wpb_list_child_pages');

Данный код проверяет имеется ли у текущий страницы какие-то подстраницы или она имеет родительскую:

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

Простой пример. У вас есть такая структура сайта:

О компании

— Наша миссия

— Наша команда

— Контакты

На какой бы из подстраниц вы не были, вы всегда увидите их все. То же самое будет отображаться и для главной страницы «О компании». В противном случае функция просто не будет ничего возвращать.

Нюансы при выводе подстраниц

С выводом подстраниц все немного сложнее. Лично у меня код автора скрипта работать на 100% отказался, поэтому я внес некоторые правки.

Итак, дабы выводить список подстраниц для определенной конкретной страницы (при редактировании ее в текстовом редакторе) вы можете использовать шорткод.

Автор заявляет, что шорткод может также применяться в текстовых виджетах темы. Если это не работает, то в файл functions.php нужно добавить строку:

add_filter ( 'widget_text' , 'do_shortcode' ) ;

add_filter('widget_text', 'do_shortcode');

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

Именно поэтому можно также использовать вызов функции из шаблона — например из файла шаблона страниц page.php. В базовом примере это делается так:

<?php wpb_list_child_pages ( ) ; ?>

<?php wpb_list_child_pages(); ?>

У меня не работало. Дело в том, что функция wpb_list_child_pages, судя по коду, просто возвращает строку. Поэтому ее еще нужно отобразить.

<?php echo ( wpb_list_child_pages ( ) ) ; ?>

<?php echo(wpb_list_child_pages()); ?>

Код работает для файла шаблона страницы page.php. Но отказывается работать в сайдбаре. Для того чтобы функция выводила список подстраниц в боковой панели я добавил в нее еще одну глобальную переменную

Вставляете сразу после global $post в файле functions.php. Если вывод информации в сайдбаре организован через виджеты, то пригодится плагин PHP Code Widget который позволяет использовать php функции для виджетов.

Итак, повторюсь. Дабы работала функция wpb_list_child_pages нужно добавить еще одну глобальную переменную и выводить ее содержимое через echo. Странно, что в основной статье в комментариях никаких замечаний по этому поводу я не нашел. Поэтому пробуйте, если что, разные варианты.

rss