get_pages() WP 1.5.0

Отримує дані сторінок (деревоподібних типів записів) як масиву об’єктів. Кешує результат в об’єктний кеш.

Отримані дані потрібно обробляти окремо через foreach або ще.

Вкажіть параметр post_type, щоб отримати дані інших типів записів.

Функція працює лише з деревоподібними типами записів! Якщо вказати post_type = post, функція поверне false.

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

Використовуйте wp_list_pages() , щоб вивести заголовки сторінок у деревоподібному вигляді.

Основа для:
wp_dropdown_pages() ,
wp_list_pages()
1 раз – 0.004261 сек
(дуже повільно) | 50000 разів – 6.05 сек
(швидко) |
PHP 7.1.2, WP 4.7.3

Хуки з функції

Повертає

WP_Post[]|int[]|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() .

нотатки

  • Global. wpdb. $wpdb WordPress database abstraction object.

список змін

З версії 1.5.0Введено.

Код get_pages() WP 6.0.2

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

	$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;
	}

	// $args can be whatever, тільки use the args defined in defaults to compute the key.
	$key = md5( serialize( wp_array_slice_assoc( $parsed_args, array_keys( $defaults ) ) ) ));
	$last_changed = wp_cache_get_last_changed( 'posts' );

	$cache_key = "get_pages:$key:$last_changed";
	$ cache = wp_cache_get ($ cache_key, 'posts');
	if ( false !== $cache ) {
		_prime_post_caches ($ cache, false, false);

		// Convert to WP_Post instances.
		$pages = array_map( 'get_post', $cache);
		/** Цей filter is documented в wp-includes/post.php */
		$pages = apply_filters( 'get_pages', $pages, $parsed_args );

		return $pages;
	}

	$inclusions = '';
	if ( ! empty( $parsed_args['include'] ) ) {
		$ child_of = 0; // Ignore child_of, parent, exclude, meta_key, і meta_value params if using include.
		$ parent = -1;
		$exclude = '';
		$meta_key = '';
		$meta_value = '';
		$hierarchical = false;
		$incpages = wp_parse_id_list( $parsed_args['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( $parsed_args['authors'] ) ) {
		$post_authors = wp_parse_list( $parsed_args['authors'] );

		if ( ! empty( $post_authors ) ) {
			foreach ( $post_authors as $post_author ) {
				// Do we have an author id або 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;
				}

				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', $parsed_args['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')", $parsed_args['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( ',', $parsed_args['sort_column'] ) as $orderby ) {
		$ orderby = trim ($ orderby);
		if ( ! in_array( $orderby, $allowed_keys, true ) ) {
			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( $parsed_args['sort_order'] );
	if ( '' !== $sort_order && ! in_array( $sort_order, array( 'ASC', 'DESC' ), true ) ) {
		$ 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 ) ) {
		wp_cache_set($cache_key, array(), 'posts');

		/** Цей filter is documented в wp-includes/post.php */
		$pages = apply_filters( 'get_pages', array(), $parsed_args );

		return $pages;
	}

	// Sanitize becae caching so it'll тільки 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( $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]);
			}
		}
	}

	$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 WP_Post[] $pages Array of page objects.
	 * @param array $parsed_args Array of get_pages() arguments.
	 */
	return apply_filters( 'get_pages', $pages, $parsed_args );
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *