wp_list_pages() — выводит список страниц

Выводит список страниц WordPress в виде ссылок на них. Часто используется в темах в шапке и в сайдбаре.

wp_list_pages($args = '')
$args
(массив) Список значений параметра $args по умолчанию:

$args = array(
	'authors'      => '', // все авторы
	'child_of'     => 0, // и родительские и дочерние страницы
	'date_format'  => get_option('date_format'),
	'depth'        => 0, // любой уровень вложенности
	'echo'         => 1, // вывести результат
	'exclude'      => '', // ничего не исключать
	'include'      => '', // не выводить какие-либо конкретные страницы
	'link_after'   => '', // ничего не добавлять перед ссылкой
	'link_before'  => '', // ничего не добавлять после ссылки
	'post_type'    => 'page', // тип поста - только страницы
	'post_status'  => 'publish', // статус - только опубликованные
	'show_date'    => '', // не указывать дату
	'sort_column'  => 'menu_order, post_title', // сорировать по порядку, а затем по заголовку
        'sort_order'   => '', // порядок сортировки - по возрастанию
	'title_li'     => __('Pages'), // заголовок списка - Страницы
);
authors
(строка) Укажите через запятую ID авторов, страницы, опубликованные которыми, нужно вывести.

<ul>
	<?php wp_list_pages( 'authors=1,15' ) ?>
</ul>
child_of
(целое число) Выводит дочерние страницы, находящихся на всех уровнях вложенности, для страницы с указанным ID.

<ul>
	<?php wp_list_pages( 'child_of=15' ) ?>
</ul>
show_date
(строка) Нужно ли отобразить дату публикации или изменения страницы:

  • modified — выводить дату изменения,
  • created (либо любое другое значение, отличное от пустой строки) — отображать дату публикации;
date_format
(строка) Формат даты (зависит от предыдущего параметра). Пример:

<ul>
	<?php 
		$args = array(
			'show_date' => 'modified',
			'date_format' => 'j M Y'
		);
		wp_list_pages( $args );
	?>
</ul>
sort_column
(строка) По какому параметру сортировать выводимые ссылки на страницы:

  • post_title — по заголовку страниц,
  • menu_order — по порядку (устанавливается в админке при редактировании страниц),
  • post_date — по дате создания,
  • post_modified — по дате последнего изменения,
  • ID — по ID,
  • post_author — по ID автора,
  • post_name — по ярлыку страниц;
sort_order
(строка) Порядок сортировки:

  • ASC — по возврастанию (по умолчанию),
  • DESC — по убыванию;

Сортируем по заголовку в обратном алфавитном порядке:

<ul>
	<?php wp_list_pages( 'sort_column=post_title&sort_order=DESC' ) ?>
</ul>
exclude
(строка) Укажите через запятую ID страниц, которые нужно исключить из списка.
exclude_tree
(строка) Укажите через запятую ID родительских страниц, которые нужно исключить из списка вместе с их дочерними страницами.
include
(строка) Если вам нужно включить только какие-то конкретные страницы в выводимый список, укажите их IDы через запятую, используя этот параметр.
depth
(целое число) Параметр позволяет задать максимальный уровень вложенности выводимых страниц:

  • 0 — любой уровень вложенности, страницы выводятся с учетом иерархии,
  • -1 — любой уровень вложенности, но без учета иерархии,
  • 1 — только страницы с нулевым уровнем вложенности,
  • 2, 3, … — укажите максимальный уровень вложенности страниц.
title_li
(строка) Заголовок списка. Если указать null или пустое значение, заголовок не будет добавлен, а список не будет заключен в тег <ul>.

Например в этих случаях заголовка не будет:

<ul>
	<?php wp_list_pages('title_li='); ?>
</ul>
<ul>
	<?php wp_list_pages('exclude=1,3,7&title_li='); ?>
</ul>
echo
(логическое) Что в итоге нужно сделать с полученным результатом:

  • 1 (true) — вывести,
  • 0 (false) — возвратить.
<?php
$children53 = wp_list_pages('title_li=&child_of=53&echo=0');
if ($children53) { ?>
<ul>
	<?php echo $children53; ?>
</ul>
<?php } ?>
meta_key
(строка) Название произвольного поля (используется в совокупности с параметром meta_value).
meta_value
(строка) Значение произвольного поля (используется в совокупности с параметром meta_key).

<ul>
	<?php wp_list_pages( 'meta_key=color&meta_value=white' ) ?>
</ul>
link_before
(строка) Текст или код HTML, который нужно добавить перед анкором ссылки внутри тега <a>.
link_after
(строка) Текст или код HTML, который нужно добавить после анкора ссылки внутри тега <a>.
number
(целое число) Количество ссылок на страниц, которое нужно вывести (по умолчанию — все).
offset
(целое число) Количество страниц с начала списка, которые нужно пропустить.
post_type
(строка) Вы можете выводить не только страницы, но и другие типы постов с иерархией.

Например выведем работы из портфолио:

$args = array(
	'post_type'=> 'portfolio',
	'title_li'=> 'Портфолио'
);
wp_list_pages( $args );
post_status
(строка) Страницы с какими статусами следует включить в список. Например, опубликованные или черновики. Список всех статусов здесь. Можно указать несколько статусов через запятую.

Список изменений:

  • 2.7 : Добавлены параметры link_before, link_after и exclude_tree.
  • 2.8 : Добавлены параметры number и offset.

Комментарии 16

  • Андрей12 октября 2014 в 17:10 #

    Здравствуйте!

    У меня на Главной странице адаптивного сайта предусмотрены 4 колонки на одной строке. В каждой колонке надо вывести название страницы, картинку к ней, описание-анонс и ссылку на полный вариант страницы. Как этого достичь с помощью чистого Html Css понятно. Но, может быть, правильнее использовать возможности самого движка? Данная функция может реализовать такой функционал или лучше использовать чистый код Html или текстовый виджет?

    Первый раз сам создаю тему. В голове пока каша.

    • Миша12 октября 2014 в 19:10 #

      Добрый день!
      Думаю вам поможет эта статья. Если вы планируете серьёзно заниматься созданием темы, вам просто необходимо её прочитать и освоить.

      • Андрей13 октября 2014 в 19:10 #

        Большое спасибо за ответ.
        Вариант использования WP_Query я тоже рассматривал. Ваша статья-подробнейшее изложение, которое я встречал по этой теме. Жаль, раньше не нашел Ваш сайт.
        Использовал для достижения цели такой код:

        $query = new WP_Query(
        array( 'post_type' => 'page', 'post__in' => array( 38, 44, 54, 50 ) )
        );
        while ( $query->have_posts() ) :
        $query->the_post();
         
        the_title(); // вывести название статьи
        the_content(); // ввести содержание
        endwhile;

        И он даже вывел именно то, что мне нужно. В этом случае возникает вопрос иерархии.

        Я вывожу эти страницы на Главной. В настройках Чтение установлена статическая страница. Для вывода Главной использую специальный файл page-template-home. В этом файле я и прописываю код вторичного цикла. Смущает то, что в исходном коде сайтов, которые я просматриваю в учебных целях, в коде Главной присутствуют:

        <body class="home page page-id-105 page-parent page-template page-template-default">/body>

        т.е в качестве домашней установлена какая-то статическая страница

        и

        <div id="post-105" class="post-105 page type-page status-publish hentry"></div>

        Вот эта строка-обертка всей страницы и вызывает вопрос. post class можно использовать только внутри цикла.
        Если страница простенькая, то текст страницы вносится через админку и вопросов нет. В файле шаблона главной прописываем дефолтный цикл и всей странице будет присвоен этот класс с помощью post class в цикле, а сам текст выведет the content внутри цикла.
        Но, если весь контент страницы предполагается выводить с помощью вторичных циклов в файле-шаблоне страницы, то как всей странице присвоить этот класс? Получается, что я должен в шаблоне главной все-таки прописать дефолтный цикл, а уже внутри него с помощью вторичных циклов и выводить весь нужный мне контент. Т.е будет такой код в шаблоне Главной:

        <?php while ( have_posts() ) : the_post(); ?>
        				< div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                                          вторичный цикл1 new WP_Query
                                          вторичный цикл2 new WP_Query
        				</div>	
        			<?php endwhile; ?>

        Можно вкладывать один цикл внутрь другого или я слишком наворотил?

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

        • Миша13 октября 2014 в 19:10 #

          На самом деле решение вашей проблемы очень простое — если для создания вторичных циклов вы будете использовать WP_Query, то, после завершения цикла вам надо добавить функцию wp_reset_postdata().

          Если я описал недостаточно подробно, пожалуйста, спрашивайте, буду рад вам помочь :)

          • Андрей13 октября 2014 в 20:10 #

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

          • Андрей13 октября 2014 в 20:10 #

            Можно еще каким-то способом получить этот класс обертку? Я кроме описанного выше другого способа не вижу,но это не значит, что его нет. Я только учусь.

            • Миша13 октября 2014 в 23:10 #

              Можно получить массив классов при помощи функции get_post_class( $class, $post_id )

              • Андрей14 октября 2014 в 19:10 #

                Функцию нашел только в оригинальном англоязычном Кодексе. Видимо, она нечасто используется. Но возьму на заметку. Спасибо.
                Вложить циклы друг в друга для меня на данном этапе проще. Тем более, как я понял, вкладывать можно не только new WP Query, но и get posts внутрь дефолтного цикла. Главное- не забывать про wp_reset_postdata().
                У меня последний вопрос по этой теме. В каком случае лучше использовать цикл WP Query, а в каком get posts? get posts вроде предназначен только для сортировки стандартных постов и страниц. У меня как раз такой случай. Но мне больше нравится WP Query. Есть какие -то правила использования или рекомендации по этим двум циклам? Может быть скорость загрузки страниц при использовании get posts выше?

                • Миша14 октября 2014 в 19:10 #

                  Если хотите делать много циклов один в другом — используйте get_posts(), во всех остальных случаях — WP_Query.

                  • Андрей14 октября 2014 в 22:10 #

                    Еще раз спасибо за терпение и потраченное время. Вы мне здорово помогли. Утащил сайт в закладки.

  • VRS18 января 2015 в 02:01 #

    Привет, Миша!
    Можешь ли подсказать?
    Задача у меня вывести список родственных страниц через запятую, текущую вывести без ссылки. Состряпала Walker для функции wp_list_pages().

    function start_el( &$output, $page, $depth = 0, $args = array(), $current_page) {
     
    		$link_title = apply_filters( 'the_title', $page->post_title, $page->ID );
     
     
            if ( $page->ID == $current_page )
               {
    		   $output .= $link_title;
    		   } else {
    		   $output .= '<a href="' . get_permalink($page->ID) . '" >' . $link_title . '</a>';
    		   }          
     
    	}

    Никак не соображу как их разделять запятыми? Последний элемент тоже выводится с запятой..

  • VRS1 марта 2015 в 18:03 #

    Привет, Миш.
    Я так и лечу сайт после попытки обновления движка (((.. После восстановления из бекапа файлов и базы даже небольшая посещаемость дает непомерную нагрузку. Поставила плаг Query Monitor, чтобы разобраться в причинах.
    Заодно выяснила, что wp_list_pages() жутко медленный. Он перебирает ВСЕ страницы (а их около 1500) и сравнивает с заданными параметрами (совпадение id родителя).
    Чем посоветуешь его заменить?
    Сейчас код такой

    global $post;
    	$id_parent = $post->post_parent;
    	$title_parent = get_the_title($post->post_parent);
     
    	$sp_name = 'Все коллекции фабрики '.$title_parent.':';
     
    	$all_collection = array(
    	'title_li'=>'',
    	'child_of' => $id_parent,
    	'echo' => 0,
    	'walker'=> new collection_walker
    	);
    	$all_collection = wp_list_pages($all_collection);
     
    	return '
    	<div class="collection-head"><strong>'.$sp_name.'</strong></div>
    	<div class="collection-body"><strong>'.$all_collection.'</strong></div>';
     
     
    class collection_walker extends Walker_page {
     
     
        function start_el( &$output, $page, $depth = 0, $args = array(), $current_page) {
     
    		$link_title = apply_filters( 'the_title', $page->post_title, $page->ID );
     
            if ( $page->ID == $current_page )
               {
    		   $output .= '<span>' . $link_title . '</span>';
    		   } else {
    		   $output .= '<a href="' . get_permalink($page->ID) . '">' . $link_title . '</a>';
    		   }
     
     
    	}
     
    		function end_el(&$output, $page, $depth) {
    		$output .= "";
    	}
     
     
    }
  • VRS2 марта 2015 в 14:03 #

    да, с get_post переписала)

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.

  • Артем: Ага, понял. Вот только почему $args? Она же нигде не определена, по логике должна быть переменная $true_field_params или...