WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

get_pages() WP 1.5

Получает данные о постоянных страниц в виде массива объектов. Аналог get_posts().

get_pages() получает данных о постоянных страницах, но полученные данные нужно отдельно обрабатывать через foreach или как-то еще. Чтобы вывести заголовки страниц в древовидном виде используйте wp_list_pages().

Эта функция также как и get_posts() может выводить посты, вложения и т.д. если указать в ней параметр post_type.

Несмотря на то, что функция идентична get_posts() некоторые из параметров и их значения отличаются.

Используется в: wp_list_pages().
✈ 1 раз = 0.004261с = очень медленно | 50000 раз = 6.05с = быстро PHP 7.1.2, WP 4.7.3
Хуки из функции:
Возвращает

массив данных.

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

$pages = get_pages( $args );

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

$args = array(
	'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',
); 
$pages = get_pages( $args );
foreach( $pages as $post ){
	setup_postdata( $post );
	// формат вывода
}  
wp_reset_postdata();
$args(строка/массив)
Список аргументов, в соответствии с которыми будет получен результат.
По умолчанию: предустановленные

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

Оглавление:
sort_order(строка)

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

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

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

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

sort_column(строка)

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

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

  • post_title - по заголовку;
  • menu_order - по указанному в админ-панели номеру. Не путайте этот параметр с ID поста;
  • post_date - по дате создания страницы;
  • post_modified - по дате изменения данных на странице;
  • ID - по идентификационному номеру (ID);
  • post_author - по автору создания страницы;
  • post_name - по слагу (альтернативному названию, которое указывается в УРЛ) страницы.

Направление сортировки указывается в параметре sort_order:

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

к началу
exclude(строка/массив)
ID постов которые нужно исключить из выборки, указывать через запятую. (пр. exclude=3,7,31)
По умолчанию: нет
include(строка/массив)

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

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

По умолчанию: нет

child_of(число)
Список дочерних страниц к родительской, которую мы указываем в этом параметре, т.е. укажем 10 и получим все дочерние страницы, страницы 10, не только первого уровня, но и второго, третьего и т.д. - получим всю иерархию.
По умолчанию: 0 - все страницы
parent(число)

Выведет те страницы, у которых родитель указанный в этом параметре ID. По умолчанию: -1 (выведет все страницы, независимо он родителей).

Важно, чтобы параметр hierarchical был установлен в 0 (false), который по умолчанию true, иначе мы не получим никакого результата от использования этого параметра, кроме страниц верхнего уровня (которые не имеют родительских страниц (ID=0)) и значения по умолчанию (ID=-1).

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

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

к началу
exclude_tree(число)
Параметр противоположный "child_of", вырезает всю ветку страниц начиная с указанной в этом параметре, вырезает его и все уровни дочерних страниц. В этом параметре указываем ID "верхней" страницы. Доступен с версии 2.7.
По умолчанию: нет
hierarchical(логический)

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

Важно: дефолтное значение этого параметра будет мешать (конфликтовать) с параметрами meta_key и parent - они будут распространятся только на верхний, главный уровень дерева. Чтобы эти параметры работали правильно нужно установить этот параметр в 0 ('hierarchical' => 0).

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

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

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

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

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

offset(число)
Укажите сколько страниц вы хотели бы пропустить из указанной выборки, т.е. укажем 5 и 5 верхних страниц, которые могли бы быть, будут срезаны. С верии 2.8.
По умолчанию: нет
post_status(строка/массив)
Список статусов страниц, которые должны быть включены в вывод. Указываем через запятую: 'publish,private'
По умолчанию: 'publish'

Примеры

#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 ) {
	$option = '<option value="' . get_page_link( $page->ID ) . '">';
	$option .= $page->post_title;
	$option .= '</option>';
	echo $option;
  }
 ?>
</select>

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

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

<?php
$mypages = get_pages( array( '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
}

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

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

$pages = get_pages(
	array( '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().

Код get pages: wp-includes/post.php WP 4.8.1

<?php
function get_pages( $args = array() ) {
	global $wpdb;

	$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',
	);

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

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

	// Make sure the post type is hierarchical.
	$hierarchical_post_types = get_post_types( array( 'hierarchical' => true ) );
	if ( ! in_array( $r['post_type'], $hierarchical_post_types ) ) {
		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;
	}

	// $args can be whatever, only use the args defined in defaults to compute the key.
	$key = md5( serialize( wp_array_slice_assoc( $r, array_keys( $defaults ) ) ) );
	$last_changed = wp_cache_get_last_changed( 'posts' );

	$cache_key = "get_pages:$key:$last_changed";
	if ( $cache = wp_cache_get( $cache_key, 'posts' ) ) {
		// Convert to WP_Post instances.
		$pages = array_map( 'get_post', $cache );
		/** This filter is documented in wp-includes/post.php */
		$pages = apply_filters( 'get_pages', $pages, $r );
		return $pages;
	}

	$inclusions = '';
	if ( ! empty( $r['include'] ) ) {
		$child_of = 0; //ignore child_of, parent, exclude, meta_key, and meta_value params if using include
		$parent = -1;
		$exclude = '';
		$meta_key = '';
		$meta_value = '';
		$hierarchical = false;
		$incpages = wp_parse_id_list( $r['include'] );
		if ( ! empty( $incpages ) ) {
			$inclusions = ' AND ID IN (' . implode( ',', $incpages ) .  ')';
		}
	}

	$exclusions = '';
	if ( ! empty( $exclude ) ) {
		$expages = wp_parse_id_list( $exclude );
		if ( ! empty( $expages ) ) {
			$exclusions = ' AND ID NOT IN (' . implode( ',', $expages ) .  ')';
		}
	}

	$author_query = '';
	if ( ! empty( $r['authors'] ) ) {
		$post_authors = preg_split( '/[\s,]+/', $r['authors'] );

		if ( ! empty( $post_authors ) ) {
			foreach ( $post_authors as $post_author ) {
				//Do we have an author id or an author login?
				if ( 0 == intval($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;
				}

				if ( '' == $author_query ) {
					$author_query = $wpdb->prepare(' post_author = %d ', $post_author);
				} else {
					$author_query .= $wpdb->prepare(' OR post_author = %d ', $post_author);
				}
			}
			if ( '' != $author_query ) {
				$author_query = " AND ($author_query)";
			}
		}
	}

	$join = '';
	$where = "$exclusions $inclusions ";
	if ( '' !== $meta_key || '' !== $meta_value ) {
		$join = " LEFT JOIN $wpdb->postmeta ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id )";

		// meta_key and meta_value might be slashed
		$meta_key = wp_unslash($meta_key);
		$meta_value = wp_unslash($meta_value);
		if ( '' !== $meta_key ) {
			$where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_key = %s", $meta_key);
		}
		if ( '' !== $meta_value ) {
			$where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_value = %s", $meta_value);
		}

	}

	if ( is_array( $parent ) ) {
		$post_parent__in = implode( ',', array_map( 'absint', (array) $parent ) );
		if ( ! empty( $post_parent__in ) ) {
			$where .= " AND post_parent IN ($post_parent__in)";
		}
	} elseif ( $parent >= 0 ) {
		$where .= $wpdb->prepare(' AND post_parent = %d ', $parent);
	}

	if ( 1 == count( $post_status ) ) {
		$where_post_type = $wpdb->prepare( "post_type = %s AND post_status = %s", $r['post_type'], reset( $post_status ) );
	} else {
		$post_status = implode( "', '", $post_status );
		$where_post_type = $wpdb->prepare( "post_type = %s AND post_status IN ('$post_status')", $r['post_type'] );
	}

	$orderby_array = array();
	$allowed_keys = array( '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' );

	foreach ( explode( ',', $r['sort_column'] ) as $orderby ) {
		$orderby = trim( $orderby );
		if ( ! in_array( $orderby, $allowed_keys ) ) {
			continue;
		}

		switch ( $orderby ) {
			case 'menu_order':
				break;
			case 'ID':
				$orderby = "$wpdb->posts.ID";
				break;
			case 'rand':
				$orderby = 'RAND()';
				break;
			case 'comment_count':
				$orderby = "$wpdb->posts.comment_count";
				break;
			default:
				if ( 0 === strpos( $orderby, 'post_' ) ) {
					$orderby = "$wpdb->posts." . $orderby;
				} else {
					$orderby = "$wpdb->posts.post_" . $orderby;
				}
		}

		$orderby_array[] = $orderby;

	}
	$sort_column = ! empty( $orderby_array ) ? implode( ',', $orderby_array ) : "$wpdb->posts.post_title";

	$sort_order = strtoupper( $r['sort_order'] );
	if ( '' !== $sort_order && ! in_array( $sort_order, array( 'ASC', 'DESC' ) ) ) {
		$sort_order = 'ASC';
	}

	$query = "SELECT * FROM $wpdb->posts $join WHERE ($where_post_type) $where ";
	$query .= $author_query;
	$query .= " ORDER BY " . $sort_column . " " . $sort_order ;

	if ( ! empty( $number ) ) {
		$query .= ' LIMIT ' . $offset . ',' . $number;
	}

	$pages = $wpdb->get_results($query);

	if ( empty($pages) ) {
		/** This filter is documented in wp-includes/post.php */
		$pages = apply_filters( 'get_pages', array(), $r );
		return $pages;
	}

	// Sanitize before caching so it'll only get done once.
	$num_pages = count($pages);
	for ($i = 0; $i < $num_pages; $i++) {
		$pages[$i] = sanitize_post($pages[$i], 'raw');
	}

	// Update cache.
	update_post_cache( $pages );

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

	if ( ! empty( $r['exclude_tree'] ) ) {
		$exclude = wp_parse_id_list( $r['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 ) ) {
				unset( $pages[$i] );
			}
		}
	}

	$page_structure = array();
	foreach ( $pages as $page ) {
		$page_structure[] = $page->ID;
	}

	wp_cache_set( $cache_key, $page_structure, 'posts' );

	// Convert to WP_Post instances
	$pages = array_map( 'get_post', $pages );

	/**
	 * Filters the retrieved list of pages.
	 *
	 * @since 2.1.0
	 *
	 * @param array $pages List of pages to retrieve.
	 * @param array $r     Array of get_pages() arguments.
	 */
	return apply_filters( 'get_pages', $pages, $r );
}

Cвязанные функции

Из метки: page

Еще из метки: query (запрос)

Еще из раздела: Страницы

get_pages 21 комментарий
Полезные 2 Вопросы 1 Все
  • campusboy1749 cайт: wp-plus.ru

    Раз речь идёт о страницах, то может привести пример, как получить страницы, которые используют тот или иной шаблон? К примеру, я так делаю:

    $services_list = get_posts( array( 'meta_key' => '_wp_page_template', 'meta_value' => 'page-tpl-one-service.php' ) );

    Где page-tpl-one-service.php - это полное имя файла-шаблона для страницы.

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

    Ответить1.3 года назад #
    • Kama4477

      Эта функцию собирает отельный запрос к БД, а get_posts() работает на основе WP_Query

      Пример интересный, добавлю в примеры, спасибо!

      Ответить1.3 года назад #
      • lincaseidhe21 cайт: ardeya.ru

        Кама, спасибо! огонь статья. только у тебя нашел про параметр 'hierarchical' => 0

        подправь кстати 3-ий пример, чтоб народ не заблуждать... а то если страницы дочерние - он пустой массив возвращает...

        Ответить1.3 года назад #
        • lincaseidhe21 cайт: ardeya.ru

          я вот так использую:

          $page = get_pages(array(
          		'meta_key' => '_wp_page_template',
          		'meta_value' => $template_name . '.php',
          		'hierarchical' => 0
          	));
          	if(!empty($page)){
          		echo get_permalink( $page[0]->ID );
          	}
          Ответить1.3 года назад #
        • Kama4477

          Спасибо подправил пример!

          1
          Ответить1.3 года назад #
  • Георгий
    @

    Здравствуйте!
    Скажите, как можно узнать page_id страницы по её названию?
    Очень важно!!!

    Ответить1.2 года назад #
  • marie

    как можно узнать количество элементов внутри $post из этого примера?

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

    При распечатке массива $post он выдает

    WP_Post Object
    (
       //данные элемента
    )

    мне нужно количество этих WP_Post Object. возможно как-то его получить?

    Ответить1.1 года назад #
    • lincaseidhe21 cайт: ardeya.ru

      так вам количество в $pages может надо? количество постов?
      в $post будут хранится данные об одном посте.
      ну а вообще - конвертируйте в массив, и подсчитайте перебором.

      $arr = (array) $post;
      foreach( $arr as $k) {
      	$i++;
      }
      1
      Ответить1.1 года назад #
      • marie

        да, вы правы, мне были нужны $pages. решила уже вопрос, оказывается, тут все еще проще
        $pages = get_pages($args);
        count($pages);

        Ответить1.1 года назад #
  • Михаил

    Спасибо за сайт!

    В примере

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

    неправильно условие

    if ( ! $content ) // Check for empty page

    должно быть наоборот

    if ( $content )

    • Kama4477

      Все правильно там... Правда пример не совсем удачный. А с чего вы взяли, что наоборот должно быть?

  • Сергей

    Добрый день
    Подскажите пожалуйста, у меня есть слайдер в котором 40 итемов (картинок), каждая картинка это отдеьная страница
    При нажатии на картинку открывается модальное окно в котором отображается контент определенной страницы
    я это сделал для одного случая

    <div id="modal_form">
    				<span id="modal_close"><i class="fa fa-times-circle-o fa-5px" aria-hidden="true"></i></span>
    				<?php
    					$postId = 46;
    					$post = get_post($postId);
    					echo $post->post_content;
    					echo do_shortcode('[_moneyGame]');
    				?>
    			</div>
    			<div id="overlay"></div>

    ну соответсвенно в js стоит обработчик на картинки по клику

    Как можно в одной и тойже модалке отображать контент с разных страниц?

  • Слава

    Я только начал все это изучать , подскажите пожалуйста как изменить 2й пример что бы он выводил только 1уровень дочерних страниц , заранее спасибо

    Ответить3 месяца назад #
  • @

    Добрый день
    Ни как не выходит вывести произвольное поле страницы, подскажите пожалуйста, что нужно изменить

    <?php 
      $pages = get_pages( array('child_of' => 10) ); 
      foreach ( $pages as $page ) {
    	$name = get_the_title( $page->ID );
    	$title = get_post_meta($post->ID, 'page_trainer_title', true);
    	$link = get_page_link( $page->ID );
    ?>
    
    <div class="trn_main">
    	<div class="trn_photo">
    		<a href="<?php echo $link; ?>"><?php echo get_the_post_thumbnail($page->ID, 'full'); ?></a>
    	</div>
    	<div class="trn_info">
    		<a href="<?php echo $link; ?>"><?php echo $name; ?></a>
    		<p><?php echo $title; ?></p>
    	</div>
    </div>
    
    <?php } ?>
    Ответить2 месяца назад #

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

Ваш комментарий