get_pages()WP 1.5.0

Получает данные страниц (древовидных типов записей) в виде массива объектов. Кэширует результат в объектный кэш.

Полученные данные нужно обрабатывать отдельно через foreach или как-то еще.

Укажите параметр post_type, чтобы получать данные других типов записей.

Функция работает только с древовидными типами записей! Если указать post_type = post функция вернет false.

Для получения данных по «плоским» типам записей используйте функцию get_posts().

Используйте wp_list_pages(), чтобы вывести заголовки страниц в древовидном виде.

С версии WP 6.3 использует WP_Query под капотом.

Основа для: wp_dropdown_pages(), wp_list_pages()
1 раз — 0.004261 сек (очень медленно) | 50000 раз — 6.05 сек (быстро) | PHP 7.1.2, WP 4.7.3
Хуки из функции

Возвращает

WP_Post[]|false.

  • Массив объектов WP_Post.
  • false когда:
    • Указанный тип записи не является иерархическим.
    • Указанный статус записи не зарегистрирован, см. get_post_stati().

Шаблон использования

$pages = get_pages( [
	'sort_order'   => 'ASC',
	'sort_column'  => 'post_title',
	'hierarchical' => 1,
	'exclude'      => '',
	'include'      => '',
	'meta_key'     => '',
	'meta_value'   => '',
	'authors'      => '',
	'child_of'     => 0,
	'parent'       => -1,
	'exclude_tree' => '',
	'number'       => '',
	'offset'       => 0,
	'post_type'    => 'page',
	'post_status'  => 'publish',
] );

foreach( $pages as $post ){
	setup_postdata( $post );
	// формат вывода
}

wp_reset_postdata();

Использование

$pages = get_pages( $args );
$args(строка/массив)
Список аргументов, в соответствии с которыми будет получен результат.
По умолчанию: предустановленные

Аргументы параметра $args

post_type(string)
Тип записи с которым будет работать функция.
Default: 'page'
post_status(строка/массив)
Список статусов страниц, которые должны быть включены в вывод. Указываем через запятую: 'publish,private'
По умолчанию: 'publish'
exclude(строка/массив)
ID постов которые нужно исключить из выборки. Можно указывать через запятую, пр. exclude='3,7,31' или в массиве.
По умолчанию: array()
exclude_tree(число)
Параметр противоположный child_of, вырезает всю ветку страниц начиная с указанной в этом параметре, вырезает его и все уровни дочерних страниц. В этом параметре указываем ID "верхней" страницы.
По умолчанию: array()
include(строка/массив)

ID постов которые нужно получить, нужно разделять запятыми или пробелами: include='45,63,78,94,128,140'.

Важно: установка этого параметра отменяет параметры: child_of, parent, exclude, meta_key, meta_value и устанавливает hierarchical = false.

По умолчанию: array()

child_of(число)

ID страницы, дочернии страницы которой нужно получить. Получит всю иерархию (не только первую вложенность, второй, третий ... n-ный уровень).

Важно: Параметр отменяется если указан параметр include.

Важно: С этим параметром нельзя использовать параметр number, потому что для получения всей иерархии, сначала делается запрос на получения всех страниц указанного типа, а потом из них выбираются подходящие с помощью функции get_page_children( $child_of, $pages ).

По умолчанию: 0 (не установлено)

parent(число/массив)

ID родительской страницы. Можно указать несколько ID в массиве. Получит те страницы, у которых родитель (post_parent) указан в этом параметре.

Важно! Если указан этот параметр, то принудительно устанавливается hierarchical = false.

Разница с параметром child_of в том, что этот параметр возвращает только дочерние страницы, без еще вложенных в них, т.е. возвращает один уровень.

По умолчанию: -1 (нет зависимости от родителя)

hierarchical(логический)

Определяет как выводить страницы:

  • true (или 1) - дочерние с отступом от родительской (по умолчанию).
  • false (или 0) - выводить все в один ряд.

Важно: принудительно устанавливается hierarchical = false, когда указаны любые из параметров: parent, include. Делается так, потому что эти параметры взаимоисключающие (если подумать).

По умолчанию: true

meta_key(строка)
Выведет только те страницы, у которых есть указанный в этом параметре ключ (название произвольного поля).
По умолчанию: ''
meta_value(строка)
Выведет только те страницы, у которых есть указанное в этом параметре значение произвольного поля. Используется в связке с meta_key.
По умолчанию: ''
authors(строка)

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

Заметка: get_posts() использует параметр author вместо authors.

По умолчанию: ''

number(число)

Укажите ограничение по количеству выводимых страниц. Укажет в запросе SQL LIMIT. По умолчанию - без ограничений.

Этот параметр нельзя использовать вместе с child_of.

Заметка: get_posts() использует параметр numberposts вместо number.

По умолчанию: -1

offset(число)
Укажите сколько страниц вы хотели бы пропустить из указанной выборки, т.е. укажем 5 и 5 верхних страниц, которые могли бы быть, будут срезаны. Требует параметр number.
По умолчанию: 0
sort_column(строка)

По какому полю сортироваться страницы. В этом параметре можно использовать любое поле из таблицы wp_posts.

Можно указать несколько полей через запятую: menu_order, post_title. Возможные значения:

'author'
'post_author'
'date'
'post_date'
'title'
'post_title'
'name'
'post_name'
'modified'
'post_modified'
'modified_gmt'
'post_modified_gmt'
'menu_order'
'parent'
'post_parent'
'ID'
'rand'
'comment_count'

Поля с префиксом post_, можно указать без этого префикса, например sort_column = title.

По умолчанию: по алфавиту (заголовки страниц)

sort_order(строка)

В каком направлении упорядочить, указанное в параметре $orderby, поле:

  • ASC - По порядку (от меньшего к большему, абвг).
  • DESC - В обратном порядке (от большего к меньшему, гвба).

Заметка: get_posts() использует параметр order вместо sort_order

По умолчанию: ASC

Примеры

0

#1 Показ страниц в выпадающем списке

В этом примере мы создадим выпадающий список со всеми страницами. Ссылку на страницу мы получаем функцией get_page_link() в которой предаем ID страницы:

<select name="page-dropdown"
 onchange='document.location.href=this.options[this.selectedIndex].value;'>
	<option value=""><?php echo esc_attr( __( 'Select page' ) ); ?></option>
	<?php
	$pages = get_pages();
	foreach( $pages as $page ){
		echo '<option value="' . get_page_link( $page->ID ) . '">'. esc_html($page->post_title) .'</option>';
	}
	?>
</select>
0

#2 Показ дочерних страниц

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

<?php
$mypages = get_pages( [
	'child_of' => $post->ID,
	'sort_column' => 'post_date',
	'sort_order' => 'desc'
] );

foreach( $mypages as $page ) {
	$content = $page->post_content;

	// пропустим страницу без контента
	if ( ! $content ) continue;

	$content = apply_filters( 'the_content', $content );

	?>
	<h2><a href="<?php echo get_page_link( $page->ID ); ?>"><?php echo $page->post_title; ?></a></h2>
	<div class="entry"><?php echo $content; ?></div>
	<?php
}
0

#3 Страницы с указанным шаблоном

Этот пример показывает как получить страницы для который установлен файл шаблона page-tpl.php. Так как название файла шаблона храниться в метаполе _wp_page_template, то нам нужно получить все страницы имеющие указанное метаполе.

$pages = get_pages( [
	'meta_key'     => '_wp_page_template',
	'meta_value'   => 'page-tpl.php',
	'hierarchical' => 0
] );

foreach( $pages as $page ){
	echo "$page->post_title <br>";
}

Вместо get_pages() можно также использовать get_posts().

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

С версии 1.5.0 Введена.
С версии 6.3.0 Use WP_Query internally.

Код get_pages() WP 6.7.1

function get_pages( $args = array() ) {
	$defaults = array(
		'child_of'     => 0,
		'sort_order'   => 'ASC',
		'sort_column'  => 'post_title',
		'hierarchical' => 1,
		'exclude'      => array(),
		'include'      => array(),
		'meta_key'     => '',
		'meta_value'   => '',
		'authors'      => '',
		'parent'       => -1,
		'exclude_tree' => array(),
		'number'       => '',
		'offset'       => 0,
		'post_type'    => 'page',
		'post_status'  => 'publish',
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	$number       = (int) $parsed_args['number'];
	$offset       = (int) $parsed_args['offset'];
	$child_of     = (int) $parsed_args['child_of'];
	$hierarchical = $parsed_args['hierarchical'];
	$exclude      = $parsed_args['exclude'];
	$meta_key     = $parsed_args['meta_key'];
	$meta_value   = $parsed_args['meta_value'];
	$parent       = $parsed_args['parent'];
	$post_status  = $parsed_args['post_status'];

	// Make sure the post type is hierarchical.
	$hierarchical_post_types = get_post_types( array( 'hierarchical' => true ) );
	if ( ! in_array( $parsed_args['post_type'], $hierarchical_post_types, true ) ) {
		return false;
	}

	if ( $parent > 0 && ! $child_of ) {
		$hierarchical = false;
	}

	// Make sure we have a valid post status.
	if ( ! is_array( $post_status ) ) {
		$post_status = explode( ',', $post_status );
	}
	if ( array_diff( $post_status, get_post_stati() ) ) {
		return false;
	}

	$query_args = array(
		'orderby'                => 'post_title',
		'order'                  => 'ASC',
		'post__not_in'           => wp_parse_id_list( $exclude ),
		'meta_key'               => $meta_key,
		'meta_value'             => $meta_value,
		'posts_per_page'         => -1,
		'offset'                 => $offset,
		'post_type'              => $parsed_args['post_type'],
		'post_status'            => $post_status,
		'update_post_term_cache' => false,
		'update_post_meta_cache' => false,
		'ignore_sticky_posts'    => true,
		'no_found_rows'          => true,
	);

	if ( ! empty( $parsed_args['include'] ) ) {
		$child_of = 0; // Ignore child_of, parent, exclude, meta_key, and meta_value params if using include.
		$parent   = -1;
		unset( $query_args['post__not_in'], $query_args['meta_key'], $query_args['meta_value'] );
		$hierarchical           = false;
		$query_args['post__in'] = wp_parse_id_list( $parsed_args['include'] );
	}

	if ( ! empty( $parsed_args['authors'] ) ) {
		$post_authors = wp_parse_list( $parsed_args['authors'] );

		if ( ! empty( $post_authors ) ) {
			$query_args['author__in'] = array();
			foreach ( $post_authors as $post_author ) {
				// Do we have an author id or an author login?
				if ( 0 == (int) $post_author ) {
					$post_author = get_user_by( 'login', $post_author );
					if ( empty( $post_author ) ) {
						continue;
					}
					if ( empty( $post_author->ID ) ) {
						continue;
					}
					$post_author = $post_author->ID;
				}
				$query_args['author__in'][] = (int) $post_author;
			}
		}
	}

	if ( is_array( $parent ) ) {
		$post_parent__in = array_map( 'absint', (array) $parent );
		if ( ! empty( $post_parent__in ) ) {
			$query_args['post_parent__in'] = $post_parent__in;
		}
	} elseif ( $parent >= 0 ) {
		$query_args['post_parent'] = $parent;
	}

	/*
	 * Maintain backward compatibility for `sort_column` key.
	 * Additionally to `WP_Query`, it has been supporting the `post_modified_gmt` field, so this logic will translate
	 * it to `post_modified` which should result in the same order given the two dates in the fields match.
	 */
	$orderby = wp_parse_list( $parsed_args['sort_column'] );
	$orderby = array_map(
		static function ( $orderby_field ) {
			$orderby_field = trim( $orderby_field );
			if ( 'post_modified_gmt' === $orderby_field || 'modified_gmt' === $orderby_field ) {
				$orderby_field = str_replace( '_gmt', '', $orderby_field );
			}
			return $orderby_field;
		},
		$orderby
	);
	if ( $orderby ) {
		$query_args['orderby'] = array_fill_keys( $orderby, $parsed_args['sort_order'] );
	}

	$order = $parsed_args['sort_order'];
	if ( $order ) {
		$query_args['order'] = $order;
	}

	if ( ! empty( $number ) ) {
		$query_args['posts_per_page'] = $number;
	}

	/**
	 * Filters query arguments passed to WP_Query in get_pages.
	 *
	 * @since 6.3.0
	 *
	 * @param array $query_args  Array of arguments passed to WP_Query.
	 * @param array $parsed_args Array of get_pages() arguments.
	 */
	$query_args = apply_filters( 'get_pages_query_args', $query_args, $parsed_args );

	$pages = new WP_Query();
	$pages = $pages->query( $query_args );

	if ( $child_of || $hierarchical ) {
		$pages = get_page_children( $child_of, $pages );
	}

	if ( ! empty( $parsed_args['exclude_tree'] ) ) {
		$exclude = wp_parse_id_list( $parsed_args['exclude_tree'] );
		foreach ( $exclude as $id ) {
			$children = get_page_children( $id, $pages );
			foreach ( $children as $child ) {
				$exclude[] = $child->ID;
			}
		}

		$num_pages = count( $pages );
		for ( $i = 0; $i < $num_pages; $i++ ) {
			if ( in_array( $pages[ $i ]->ID, $exclude, true ) ) {
				unset( $pages[ $i ] );
			}
		}
	}

	/**
	 * Filters the retrieved list of pages.
	 *
	 * @since 2.1.0
	 *
	 * @param WP_Post[] $pages       Array of page objects.
	 * @param array     $parsed_args Array of get_pages() arguments.
	 */
	return apply_filters( 'get_pages', $pages, $parsed_args );
}
17 комментариев
Полезные 3 Все
    Войти