WordPress как на ладони
Дешевый WordPress пакет для разработки Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

get_posts() WP 1.2.1

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

Это обертка класса WP_Query, т.е. функция понимает все параметры WP_Query.

У get_posts() есть предустановленные параметры, которые нужно изменить, чтобы они не мешали получить нужный результат, например:

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

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

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

Является основой для: wp_playlist_shortcode(), get_children(), wp_get_recent_posts()
Работает на основе: WP_Query()
✈ 1 раз = 0.0036с = очень медленно | 50000 раз = 99.1с = очень медленно

Хуков нет.

Возвращает

Массив. Если не удалось получить записи, то вернет пустой массив.

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

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){
		...
	}
)

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

get_posts( $args );

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

// параметры по умолчанию
$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 запроса
) );

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

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

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

С версии WordPress 2.6, в дополнении к нижеописанным параметрам, get_posts() может принимать все те же параметры что и WP_Query.

В get_posts() по умолчанию включен параметр suppress_filters (подавлять фильтры), который в query_posts() и WP_Query отключен - т.е. там фильтры работают. Включение suppress_filters отменяет все фильтры изменения SQL запроса, следующего типа: posts_* или comment_feed_*.

suppress_filters не виляет на работу фильтра pre_get_posts - он будет работать независимо от того что указано в suppress_filters.

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

В параметр 'category' нужно передавать ID, а не название категории. Также 'category' можно передать строку: ID через запятую.

numberposts(число)
Количество выводимых постов. Установить на 0, чтобы ограничить вывод максимальным числом постов на страницу (устанавливается в настройках ВП) или поставить -1 чтобы убрать ограничения вывода (LIMIT).
По умолчанию: 5
offset(число)
Отступ от первого поста (записи).
category(строка/число)
Из каких категорий выводить записи. Укажите ID категории из которой нужно получить посты или укажите, -3 вместо 3, если нужно получить все записи, кроме записей из категории 3 (исключить категорию). Можно указать несколько ID через запятую ("3,5,12" или "-3,-5,-12"). Массив передавать нельзя.
По умолчанию: нет
category_name(строка)
Показывать посты только из этой категории (указывается название или альтернативное имя(slug) категории).
По умолчанию: нет
tag(строка)
Получить записи имеющие указанные в этом параметре метки. Нужно указывать альтернативное имя (slug) метки. Если указать несколько имен (меток) через запятую, то будут получены записи соответствующие любой метке, а если разделить пробелами, то будут получены записи имеющие все указанные метки.
По умолчанию: нет
include(строка/число/массив)

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

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

exclude(строка/число)
ID постов которые нужно исключить из выборки, указывать через запятую или пробел.
По умолчанию: нет
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 - запланировано
  • 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(логический)

Включение этого параметра отменяет/пропускает все фильтры изменение SQL запроса, такого типа posts_* или comment_feed_*. На работу фильтра pre_get_posts этот параметр не виляет - он будет работать независимо от того что указано в этом параметре.

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

Примеры

#1. Вывод постов с отступом

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

<ul>
<?php
global $post;
$args = array( 'posts_per_page' => 5, 'offset'=> 1, 'category' => 1 );
$myposts = get_posts( $args );
foreach( $myposts as $post ){ setup_postdata($post);
	?>
	<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
	<?php
}
wp_reset_postdata();
?>
</ul>

#2. Вывод постов с отступом, без нарушения основного цикла.

Если была использована функция get_posts() и после нее нужно использовать стандартный цикл WordPress, то нужно сохранить глобальную переменную $post, делает это так:

<ul>
<?php
global $post;

// записываем $post во временную переменную $tmp_post
$tmp_post = $post;
$args = array( 'posts_per_page' => 5, 'offset'=> 1, 'category' => 1 );
$myposts = get_posts( $args );
foreach( $myposts as $post ){ setup_postdata($post);
	?>
	<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
	<?php
} 

// возвращаем былое значение $post
$post = $tmp_post;
?>
</ul>

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

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

<?php
$args = array( 'posts_per_page' => 3 );
$lastposts = get_posts( $args );

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; ?>

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

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

<?php
global $post;
$postslist = get_posts( array( '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();

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

Получим 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>

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

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

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

#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();
?>

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

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

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

$args = array('cat' =>$cat_add_id);
$posts = get_posts($args);

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

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

Заметки

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

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

Код get_posts: wp-includes/post.php VER 4.9.8

<?php
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
	);

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

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

	$get_posts = new WP_Query;
	return $get_posts->query($r);

}

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

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

Еще из раздела: Запросы

166 комментов
Полезные 7 Вопросы 4 Все
  • Здравствуйте. Подскажите, а можно ли в выборке get_posts указать выбор постов, у которых нет определенного дополнительного поля?Мне для плагина необходима выборка записей без определенного поля для последующего его заведения и присвоения значения.
    Проверка на isset проходит, но каждый раз выбирает один и тот же массив постов. У меня 35 тыс записей и хотелось бы выбирать штук по 200

    Ответить2 года назад #
    • Kama6958

      Можно. параметр compare = NOT EXISTS в meta_query. Смотри примеры в описании WP_Query

      2
      Ответить2 года назад #
    • @ campusboy3053 cайт: www.youtube.com/c/wpplus

      Привет

      $args = array(
      	'posts_per_page' => 200,
      	'meta_query' => array(
      		array(
      			'key' => 'название поля',
      			'compare' => 'NOT EXISTS'
      		)
      	)
      );
      $posts = get_posts( $args );
      2
      Ответить2 года назад #
  • Максим

    Очень странно ведет себя функция, пытаюсь выбрать масив постов, только тех которые я передаю в includes, но мне возвращает первый пост какой то левы и только потом идут те которые в includes. Код вроде как совсем простой:

    $list_posts = get_posts(array(
    								'type' => 'post',
    								'orderby' => 'post_date',
    								'order' => 'DESC',
    								'post_in' => array($selected_post1, 
    									$selected_post2, $selected_post3,
    									 $selected_post4),
    								'numberposts' => 4
    							)
    						);

    В чем может скрываться причина такого поведения?

    Ответить2 года назад #
    • Максим

      Сам же отвечу на свой пост) я допустил синтаксическую ошибку в имени параметра, написал post_in а надо было post__in. Правда это после того как с includes у меня так ничего и не вышло

      1
      Ответить2 года назад #
  • Дмитрий

    В первую очередь, огромнейше Вам спасибо, за такой титанический труд! Мои сайты на wp работаю благодаря Вам! И не слушайте тех кто пытается плеваться ядом, это от завистиmosking

    Меня вот мучает такой вопрос. Сколько я не пытался использовать аргумент: numberposts, он не работает, а вместо него работет с тем же функционалом: posts_per_page. Тот же параметр -1 отменяет лимит 5и записей. Можете как-то прокомментировать этот момент?

    Еще отдельное спасибо хочется добавить за то что отвечаете в комментариях. Половину ответов нашел именно в комментах smile

    Ответить1.5 год назад #
    • Kama6958

      В коде функции видно, как numberposts превращается в posts_per_page

      if ( ! empty($r['numberposts']) && empty($r['posts_per_page']) )
      	$r['posts_per_page'] = $r['numberposts'];

      ты что-то не так вызываешь, не может быть что параметр не работает с get_posts().

      П.С. а благодарность любую можно отправить сюда

      Ответить1.5 год назад #
  • Константин cайт: mygeografi.ru

    Приветствую! У вас тут так все доступно написано, но не могу получить результат. Хочу отфильтровать записи по значению меток. Возможно что-то связанное именно с шаблоном. Получается сами записи лежат в таблице wp_posts, но поля tag в этой таблице нет. Сами метки находятся в таблице wp_terms, где есть поля term_id, name, slug.
    Как составить запрос, чтобы выдавались записи с определенным значением term_id например?

    Ответить1.4 год назад #
    • @ campusboy3053 cайт: www.youtube.com/c/wpplus

      Привет! Тут очень важное замечание в начале статьи:

      get_posts() - это обертка класса WP_Query. Это значит, что функция понимает все параметры WP_Query.

      Так что советую туда сходить и поглядеть, какие параметры бывают ещё. В вашем случае на той странице полезен пункт "Параметры Меток".

      1
      Ответить1.4 год назад #
  • Руслан

    Кама, добрый день! Не подскажете как можно вывести уже существующую категорию новостей в отдельной вкладке на новой странице?

    Ответить1.3 год назад #
  • @ campusboy3053 cайт: www.youtube.com/c/wpplus

    Параметр post_mime_type может принимать массив mime типов:

    $my_items  = get_posts( [
    	'post_type'      => 'attachment',
    	'post_mime_type' => [
    		'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    		'image/png'
    	],
    ] );
    1
    Ответитьгод назад #
  • @ андрей

    а как этот код можно дополнить, чтобы выводились посты также но еще учитывая определенные метаданные постов?? помогите пожалуйста

    Ответитьгод назад #
  • Игорь

    Доброго времени суток!
    Подскажите, как можно получить посты после определенного?
    Например: на страницу выводится 10 постов. ID последнего - 28. Как сделать выборку постов, у которых ID меньше 28...?

    • Kama6958

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

      Но можно по другому, получить дату записи 28 и создать запрос через get_posts() который получит записи с датой меньше указанной... См. параметр date_query.

  • Eвгений

    Добрый день, подскажите как реализовать повторную выборку из полученного массива ?
    Пример:
    Есть:
    Главная категория в которой есть посты, так же есть много субкатегорий в которой так же есть посты.

    Как сделать выборку постов с главной категории понятно.

    Но что делать если кроме постов с главной категории надо вывести ещё пару постов с субкатегорий на одной странице. Делать дополнительные выборки нету желания. Можно ли как то отфильтровать по значениям уже полученный массив с постами для главной категории ?

  • Макс

    Здравствуйте, можете помочь с выводом the_posts_pagination(); он не работает с get_posts()

    • Макс

      или можно другой цикл с 5-ти последними постами и с выводом постраничной навигацией

Здравствуйте, !     Войти . Зарегистрироваться