WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

get_posts()WP 1.2.0

Получает записи (посты, страницы, вложения) из базы данных по указанным критериям. Можно выбрать любые посты и отсортировать их как угодно.

У этой функции есть предустановленные параметры. Иногда их нужно изменить, чтобы они не мешали. Предустановленные параметры:

  • post_status = publishWP_Query при неустановленном post_status выбирает по-другому. При post_type = attachment post_status = inherit.

  • post_type = post — если мы указываем вывод таксономии для типа записи отличного от post, то параметр post_type нужно изменить - он по умолчанию равен post.

  • numberposts = 5 — если мы забудем изменить параметр numberposts, то долго можем недоумевать почему выводится только 5 записей вместо нужных 20.

  • suppress_filters = true — этот параметр отключает работу некоторых фильтров (хуков). Читать подробнее.

  • ignore_sticky_posts = true ― нельзя изменить!

  • no_found_rows = true ― нельзя изменить!

Эта функция - аналог query_posts(). Отличается тем, что она не вмешивается в глобальный запрос WP, а создает отдельный экземпляр класса WP_Query. Подробнее читайте здесь.

Работает на основе: WP_Query(), WP_Query::query()
1 раз — 0.0036 сек (очень медленно) | 50000 раз — 99.1 сек (очень медленно)

Хуков нет.

Возвращает

WP_Post[]|int[].

  • Пустой массив, если не удалось получить записи.

  • Массив WP_Post объектов (записей). Каждый объект в массиве выглядит так:

    array(
    	[0]=> object(WP_Post)#4692 (24) {
    		["ID"]                    => int(822)
    		["post_author"]           => string(1) "1"
    		["post_date"]             => string(19) "2016-07-07 10:28:57"
    		["post_date_gmt"]         => string(19) "2016-07-07 07:28:57"
    		["post_content"]          => string(6225) "Контент статьи"
    		["post_title"]            => string(37) "Мертвое море (14 фото)"
    		["post_excerpt"]          => string(15) "Цитата о статье"
    		["post_status"]           => string(7) "publish"
    		["comment_status"]        => string(4) "open"
    		["ping_status"]           => string(4) "open"
    		["post_password"]         => string(0) ""
    		["post_name"]             => string(95) "mertvoe-more-14-foto"
    		["to_ping"]               => string(0) ""
    		["pinged"]                => string(0) ""
    		["post_modified"]         => string(19) "2016-07-07 10:28:57"
    		["post_modified_gmt"]     => string(19) "2016-07-07 07:28:57"
    		["post_content_filtered"] => string(0) ""
    		["post_parent"]           => int(0)
    		["guid"]                  => string(0) ""
    		["menu_order"]            => int(0)
    		["post_type"]             => string(4) "post"
    		["post_mime_type"]        => string(0) ""
    		["comment_count"]         => string(1) "0"
    		["filter"]                => string(3) "raw"
    	}
    	[1] => object(WP_Post){
    		...
    	}
    	[2] => object(WP_Post){
    		...
    	}
    )

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

// параметры по умолчанию
$my_posts = get_posts( array(
	'numberposts' => 5,
	'category'    => 0,
	'orderby'     => 'date',
	'order'       => 'DESC',
	'include'     => array(),
	'exclude'     => array(),
	'meta_key'    => '',
	'meta_value'  =>'',
	'post_type'   => 'post',
	'suppress_filters' => true, // подавление работы фильтров изменения SQL запроса
) );

global $post;

foreach( $my_posts as $post ){
	setup_postdata( $post );

	// формат вывода the_title() ...
}

wp_reset_postdata(); // сброс

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

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

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

Ниже приведен не полный список параметров. Весь список возможных параметров смотрите в WP_Query. Эта функция является оберткой для WP_Query, поэтому может принимать все теже параметры.

numberposts(число)
posts_per_page(число)

Количество выводимых постов. Установить на 0, чтобы ограничить вывод максимальным числом постов на страницу (устанавливается в настройках ВП) или поставить -1 чтобы убрать ограничения вывода (LIMIT).

posts_per_page имеет больший приоритет чем numberposts.

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

offset(число)
Отступ от первого поста (записи).
tax_query(массив)
Фильтрация по нужным таксономиям. Подробнее читайте здесь.
category(число/строка/массив)

Укажите ID категории из которой нужно получить посты. Можно указать ID со знаком минус -3, тогда эта категория будет исключена (будут получены все записи, кроме записей из категории 3). Можно указать несколько ID через запятую в виде строки 3,5,12 или -3,-5,12).

В значении нужно передавать ID, а не название категории.

Смотрите также описание параметра cat у WP_Query.

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

category_name(строка)
Показывать посты только из этой категории (указывается название или альтернативное имя(slug) категории).
По умолчанию: ''
tag(строка)
Получить записи имеющие указанные в этом параметре метки. Нужно указывать альтернативное имя (slug) метки. Если указать несколько имен (меток) через запятую, то будут получены записи соответствующие любой метке, а если разделить пробелами, то будут получены записи имеющие все указанные метки.
По умолчанию: ''
include(строка/число/массив)

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

Важно: Указав этот параметр, бессмысленно указывать параметры posts_per_page, offset, category, exclude, meta_key, meta_value и post_parent.
По умолчанию: ''

exclude(строка/число/массив)
ID постов, которые нужно исключить из выборки. Если указывается строка, то ID нужно разделять запятыми или пробелами (смотри wp_parse_id_list).
По умолчанию: ''
meta_key и meta_value(строка)

Получить посты имеющие указанное произвольное поле (meta_key) со значением (meta_value).

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

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

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

meta_query(массив)
Выборка записей по произвольным полям. Подробнее см. в описании WP_Query (meta_query).
По умолчанию: []
date_query(массив)
Выборка записей по датам. Подробнее см. в описании WP_Query (date_query).
По умолчанию: []
post_type(строка/массив)

Какого типа посты нужно получать, может быть:

  • any - все типы, кроме revision и типов у которых указан параметр exclude_from_search=true.
  • attachment - прикрепленные записи.

    по умолчанию WP_Query ставит статус 'post_status'=>'publish', а вложения имеют статус 'post_status'=>'inherit', поэтому чтобы вывести вложения нужно еще изменить параметр post_status на 'inherit' или 'any'.

  • page - постоянные страницы
  • post - посты
  • revision - ревизии
  • custom_type - название (ярлык) произвольного типа записи
  • array('post','page') - сразу несколько типов в массиве.

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

post_mime_type(строка/массив)

Какого типа вложения нужно получить. Можно использовать, когда параметр post_type = attachment.

  • image/jpeg
  • image/png
  • image/gif
  • image - для любых картинок
  • audio/mpeg
  • application/pdf
  • application/zip

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

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

post_status(строка/массив)

Статус записи. Можно передать несколько статусов через запятую. Может принимать:

  • publish - опубликовано
  • private - личная запись
  • draft - черновик
  • future - запланировано
  • pending- на модерации
  • inherit - вложение, любое вложение получает этот статус. Ставиться автоматически, при $post_type='attachment'
  • any - все статусы

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

post_parent(число)
Показать только дочерние записи к указанному ID.
По умолчанию: '' - необрабатывается
nopaging(логический)
Включить или отключить пагинацию, если стоит true параметр $numberposts игнорируется.
По умолчанию: false
orderby(строка)

Сортировать результат по указанным полям. Можно указывать несколько полей сортировки, через пробел. Допустимые поля:

  • author - сортировать по ID авторов.
  • content - сортировать по контенту.
  • date - сортировать по дате создания записи.
  • ID - сортировать по ID записи. Указываются ID в массиве или через запятую.
  • menu_order - сортировать по полю menu_order. Используется для постоянных страниц и вложений (картинки, файлы и т.п.).
  • mime_type - сортировать по MIME типу. Используется для вложений.
  • modified - сортировать по дате изменения.
  • name - сортировать по альтернативному имени (slug).
  • rand - случайная сортировка. Создает повышенную нагрузку на БД.
  • status - сортировать по статусу (черновик, опубликовано и т.п.)
  • title - сортировать по названию.
  • parent - сортировать по ID родителя (parent ID).
  • password - сортировать по паролю.
  • type - сортировать по типу (пост, страница и т.д. ).
  • comment_count - по количеству комментариев.
  • meta_value - по значению указанного произвольного поля.
  • post__in - учитывает порядок указанных ID в параметре include.

Префикс post_ у полей таблицы опускается для удобства. Например вместо date можно написать post_date, вместо content post_content и т.д.

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

order(строка)
В каком направлении упорядочить, указанное в параметре $orderby, поле:
ASC - по порядку (от меньшего к большему: а,б,в).
DESC - в обратном порядке (от большего к меньшему: в,б,а).
По умолчанию: 'DESC'
suppress_filters(true/false)

При true (по умолчанию) пропускает все хуки изменения SQL запроса, такого типа posts_* или comment_feed_*.

Какие именно фильтры отключаются смотрите здесь.

В функциях WP_Query и query_posts() этот параметр отключен по умолчанию (равен false).

suppress_filters = true не виляет на работу фильтра pre_get_posts.

Такое отключение фильтров по умолчанию, может ввести в замешательство, если есть плагины влияющие на вывод записей, через фильтры SQL запроса, например WPML. В таких случаях suppress_filters нужно отключить.

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

Примеры

6

#1 Выведем записи из рубрики

Допустим у нас в категориях есть рубрика «Статьи» (ярлык articles) в которую добавляются записи (post_type=post). Нам нужно вывести 6 таких записей на произвольной странице.

<?php
global $post;

$myposts = get_posts( [
	'posts_per_page' => 6,
	'category_name' => 'articles',
	'post_type' => 'post',
] );

foreach( $myposts as $post ){
	setup_postdata( $post );
	?>
	<div class="article-elem">
		<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
	</div>
	<?php
}
wp_reset_postdata();
?>
3

#2 Вывод постов с отступом

Если у вас на главной выводится один, последний пост, а нужно вывести еще 5 предыдущих из категории 1, то можно использовать такой код:

<ul>
	<?php
	global $post;
	$myposts = get_posts( [
		'posts_per_page' => 5,
		'offset' => 1,
		'category' => 1,
	] );

	foreach( $myposts as $post ){
		setup_postdata( $post );
		?>
		<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
		<?php
	}

	wp_reset_postdata();
	?>
</ul>
1

#3 Получить все прикрепленные файлы

Используется за пределами Цикла WordPress. Следующий код выведет заголовок, ссылку и цитату прикрепленного файла:

$attachments = get_posts( array(
	'post_type'      => 'attachment',
	'posts_per_page' => 500,
	'post_status'    => 'any',
	'post_parent'    => null
) );

if ( $attachments ) {
	foreach ( $attachments as $post ) {
		setup_postdata( $post );
		the_title();
		the_attachment_link( $post->ID, false );
		the_excerpt();
	}
	wp_reset_postdata();
}
0

#4 Возможность использовать специальные функции Цикла ВП

Стандартно в цикле основанном на get_posts() невозможно использовать, например, функцию the_content() или the_date(). Эта проблема решается функцией setup_postdata() которой нужно передать переменную $post:

<?php
$lastposts = get_posts( [
	'posts_per_page' => 3
] );

foreach( $lastposts as $post ){
	setup_postdata($post); // устанавливаем данные
	?>

	<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
	<?php the_content(); ?>

	<?php
}
wp_reset_postdata(); // сброс
?>

Данные можно также получить через обращение к свойству объекта (объект->свойство_объекта). Например, для этого примера $post->ID будет равно ID поста, $post->post_content будет содержать контент записи. Свойство объекта это колонка таблицы БД posts. Название колонок можно посмотреть тут.

Не забывайте, что на экран данные выводятся через php оператор echo:

<?php echo $post->ID; ?>
0

#5 Последние посты отсортированные по заголовку

Получим последние посты отсортированные по заголовку в алфавитном порядке. Следующий пример выведет дату, заголовок и цитату поста:

<?php
global $post;
$postslist = get_posts( [
	'posts_per_page' => 10,
	'order'=> 'ASC',
	'orderby' => 'title'
] );

foreach( $postslist as $post ){
	setup_postdata($post);
	?>
	<div>
		<?php the_date(); ?>
		<br />
		<?php the_title(); ?>
		<?php the_excerpt(); ?>
	   </div>
	<?php
}

wp_reset_postdata();
0

#6 Случайные посты

Получим 5 случайных постов, реализуется за счет параметра 'orderby' => 'rand':

<ul>
<?php
$args = array( 'posts_per_page' => 5, 'orderby' => 'rand' );
$rand_posts = get_posts( $args );
foreach( $rand_posts as $post ) : ?>
	<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
<?php wp_reset_postdata() ?>
</ul>
0

#7 Прикрепленные файлы определенного поста

Код нужно использовать внутри Цикла WordPress, где переменная $post->ID:

<?php
$args = array(
	'post_type' => 'attachment',
	'posts_per_page' => -1,
	'post_status' => null,
	'post_parent' => $post->ID
);
$attachments = get_posts( $args );
if ( $attachments ) {
	foreach ( $attachments as $attachment ) {
		echo apply_filters( 'the_title' , $attachment->post_title );
		the_attachment_link( $attachment->ID , false );
	}
}
wp_reset_postdata();
?>
0

#8 Последние записи из той же рубрики

Выведем список последних записей текущей рубрики, в которой находится запись. При этом исключим текущую запись:

<?php
$category = get_the_category();
rsort( $category );
$cat_add_id = $category[0]->term_id;

$posts = get_posts( array(
	'cat' => $cat_add_id,
	'posts_per_page' => 4,
	'exclude' => $GLOBALS['post']->ID,
) );

foreach( $posts as $post ){
	setup_postdata($post);
	?>
	<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
	<?php
}
wp_reset_postdata();
?>

Другая версия этого кода в комментариях.

0

#9 Параметры таксономии

Покажем посты, связанные с определенной таксономией. Если вы указываете таксономию, зарегистрированную для типа поста, то вместо category можно использовать {имя_таксономии}. Например, если у вас есть таксономия genre'' и вы хотите показывать только посты из жанраjazz'', вы можете использовать следующий код.

$show_albums = get_posts( [
	 'posts_per_page' => 8,
	 'orderby'        => 'rand',
	 'post_type'      => 'albums',
	 'genre'          => 'jazz',
	 'post_status'    => 'publish'
] );

Следующий пример отображает сообщения, помеченные jazz, в таксономии genre, используя tax_query:

$args = array(
	'tax_query' => array(
		array(
			'taxonomy' => 'genre',
			'field'    => 'slug',
			'terms'    => 'jazz'
		)
	)
);
$postslist = get_posts( $args );

Дополнительные примеры см. в разделе "Параметры таксономии" документации WP_Query.

0

#10 Сортировка по порядку из параметра include

orderby также принимает значение post__in. Если использовать include для получения определенных постов, то посты будут получены в том порядке, который вы указали для include. Например:

$posts = get_posts( [
	'include'   => '3,8,1,17',
	'post_type' => 'attachment',
	'orderby'   => 'post__in',
] );
0

#11 Получите 10 последних записей:

$args = [
	'numberposts' => 10
];

$latest_posts = get_posts( $args );

Вы также можете передать аргумент post_type, когда нужно получить записи из типа поста, например:

$args = [
  'numberposts' => 10,
  'post_type'   => 'book'
];

$latest_books = get_posts( $args );
0

#12 Массив ID постов

Чтобы вернуть идентификаторы вместо объектов post, используйте аргумент fields.

$args = [ 'fields' => 'ids' ];
$posts = get_posts( $args );
// if any posts are found $posts will be an array with their ids

Аргумент fields может быть установлен в ids, all (по умолчанию) или id=>parent. Последние два (аргумента) возвращают массив объектов stdClass.

0

#13 Параметры произвольного поля

Показать посты, связанные с определенным кастомным полем. Следующий пример отображает посты из типа постов product, которые имеют мета-ключ featured со значением yes, используя meta_query:

$args = [
	'post_type'  => 'product',
	'meta_query' => [
		[
			'key'   => 'featured',
			'value' => 'yes',
		]
	],
];

$postslist = get_posts( $args );

Дополнительные примеры см. в разделе "Параметры пользовательских полей" документации WP_Query.

Заметки

  • С версии 2.6 изменен ряд передаваемых значений у параметра orderby - префикс post_ был удален, например, было post_title, стало просто title.

  • С версии 3.0 параметрам include и exclude можно передавать и массивы ID.

Хотите дешево купить просмотры в Инстаграме на видео или ТВ-трансляцию, но не знаете, где? Попробуйте посетить сайт Doctor SMM, где Вам будет предложена одна из самых низких цен по рунету на просмотры. Торопитесь, так как предложение действует ограниченное время! К тому же здесь Вы сможете очень быстро приобрести ресурс с оптимальным, конкретно для Вашей страницы, скоростным режимом. Развивайте аккаунт быстро и легко!

Заметки

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

С версии 1.2.0 Введена.

Код get_posts() WP 6.4.3

function get_posts( $args = null ) {
	$defaults = array(
		'numberposts'      => 5,
		'category'         => 0,
		'orderby'          => 'date',
		'order'            => 'DESC',
		'include'          => array(),
		'exclude'          => array(),
		'meta_key'         => '',
		'meta_value'       => '',
		'post_type'        => 'post',
		'suppress_filters' => true,
	);

	$parsed_args = wp_parse_args( $args, $defaults );
	if ( empty( $parsed_args['post_status'] ) ) {
		$parsed_args['post_status'] = ( 'attachment' === $parsed_args['post_type'] ) ? 'inherit' : 'publish';
	}
	if ( ! empty( $parsed_args['numberposts'] ) && empty( $parsed_args['posts_per_page'] ) ) {
		$parsed_args['posts_per_page'] = $parsed_args['numberposts'];
	}
	if ( ! empty( $parsed_args['category'] ) ) {
		$parsed_args['cat'] = $parsed_args['category'];
	}
	if ( ! empty( $parsed_args['include'] ) ) {
		$incposts                      = wp_parse_id_list( $parsed_args['include'] );
		$parsed_args['posts_per_page'] = count( $incposts );  // Only the number of posts included.
		$parsed_args['post__in']       = $incposts;
	} elseif ( ! empty( $parsed_args['exclude'] ) ) {
		$parsed_args['post__not_in'] = wp_parse_id_list( $parsed_args['exclude'] );
	}

	$parsed_args['ignore_sticky_posts'] = true;
	$parsed_args['no_found_rows']       = true;

	$get_posts = new WP_Query();
	return $get_posts->query( $parsed_args );
}
161 комментарий
Полезные 15Вопросы 5 Все
    Войти