WordPress get posts


I will not tell you that using get_posts() is the right thing to do…but here is some basic pagination code I setup using get_posts().

EDIT: As Pieter pointed out, this isn’t meant to be used in production code. But just something I was playing around with anyway to see if I could get pagination working with get_posts(). If you are in a production environment you wouldn’t want to use this.

$cpt_name = 'post-type'; //add your own post type  //what pagination page are we on? if(! empty($_GET['pag']) && is_numeric($_GET['pag']) ){  $paged = $_GET['pag']; }else{  $paged = 1; } //you could use this if you want, just make sure to use "/page/2" instead of "?pag=2" in the pagination links. //$paged = (get_query_var('paged')) ? get_query_var('paged') : 0;  //how many posts should we display? $posts_per_page = (get_option('posts_per_page')) ? get_option('posts_per_page') : 10;   //let's first get ALL of the possible posts $args = array(  'posts_.  

he posts we want to display $args = array( 'posts_per_page' => $posts_per_page, 'orderby' => 'title', 'order' => 'ASC', 'post_type' => $cpt_name, 'paged' => $paged ); $my_posts = get_posts($args); //did we find any? if(! empty($my_posts)){ echo '<div id="my-posts-wrapper">'; //THE FAKE LOOP foreach($my_posts as $key => $my_post){ //do stuff with your posts echo '<div class="my-post">'.$my_post->post_title.'</div>'; } echo '</div>'; //we need to display some pagination if there are more total posts than the posts displayed per page if($post_count > $posts_per_page ){ echo '<div class="pagination"> <ul>'; if($paged > 1){ echo '<li><a class="first" href="?pag=1">&laquo;</a></li>'; }else{ echo '<li><span class="first">&laquo;</span></li>'; } for($p = 1; $p <= $num_pages; $p++){ if ($paged == $p) { echo '<li><span class="current">'.$p.'</span></li>'; }else{ echo '<li><a href="?pag='.$p.'">'.$p.'</a></li>'; } } if($paged < $num_pages){ echo '<li><a class="last" href="?pag='.$num_pages.'">&raquo;</a></li>'; }else{ echo '<li><span class="last">&raquo;</span></li>'; } echo '</ul></div>'; } }

I hope someone gets some use out of this 🙂

EDIT: What the heck! Going to do something the wrong way…might as well do it right! Here is some LESS as well (without any mixins).

.pagination { margin: 30px 0px;  ul { display:block; list-style-type:none; margin:0 auto; padding: 0px;   li { display:inline-block; list-style-type:none; margin:0; padding:0;  a, span { display:inline-block; font-size: 14px; width:auto; min-width:26px; height:26px; line-height: 26px; border: 1px solid #dddddd; border-right: 0px; background:#FFFFFF; color:#FF0000; padding: 5px; text-align: center;  &:hover { cursor:pointer; text-decoration:none; }   &.first { border-top-left-radius: 3px; border-bottom-left-radius: 3px; }  &.last { border-top-right-radius: 3px; border-bottom-right-radius: 3px;}  }   span.last,  span.first { color: #FF0000;  &:hover { cursor: default; }  }   a.last,  a.first {   &:hover { }  }   a:hover,   &.active a,   .current { background:#FF0000; color:#ffffff; border-color: #b21712; }   &:last-child {   a, span { border-right: 1px solid #dddddd; }   a {   &:hover { border-color: #FF0000; }  }  }  }  } }   

stackoverflow.com

WordPressWordPress has a feature called “Sticky Posts” (it’s under the “Visibility” section for WordPress posts). As the name implies, the post will be pinned to the front page if checked.

Unfortunately, get_posts seems to ignore this … and will show (by default) in Chronological Order…Which is fine usually. That’s how news should be.

There are other ways to go about this. Using WP_Query for example. But what if you are pretty darn happy with your get_posts and don’t want to change your (possibly) complicated, already-implemented, get_posts variation?

The solution is pretty simple. It isn’t elegant, but it works (for my needs, anyway). If you are starting from scratch, then I would go the wp_query route.

In my example, I want 6 total posts for the front page from a specific category.

Anyway, you basically run two get_posts (redundant, yep). One grabs sticky posts specifically. The other one grabs all posts that are NOT sticky posts. You then combine the two using PHP’s array_merge (making sure sticky posts is the parent that is absorbing the non-sticky array), then you shed off the extras (if they exist) using array_slice.


Here’s what the beginning of the loop would look like.

$args = array( 'category' => 17, 'numberposts' => 6, 'order'=> 'DES', 'orderby' => 'date', 'include' => implode(',', get_option('sticky_posts')) );  $args2 = array( 'post__not_in'=>get_option('sticky_posts'), 'category' => 17, 'numberposts' => 6, 'order'=> 'DES', 'orderby' => 'date' );    $postslist = get_posts( $args );  $postslist2 = get_posts( $args2 );    $postslist = array_merge($postslist, $postslist2);    $postslist= array_slice($postslist, 0, 6);    foreach ($postslist as $post) : setup_postdata($post); ?>

Boom. Sticky posts added.

Incoming search terms:

  • wordpress get_posts

ageekandhisblog.com

Я не скажу вам, что использование get_posts() — это правильная вещь… но вот какой-то базовый код разбивки на страницы, который я устанавливаю, используя get_posts().

EDIT: Как отметил Питер, это не предназначено для использования в производственном коде. Но только что-то я играл в любом случае, чтобы увидеть, могу ли я рисовать страницы с помощью get_posts(). Если вы находитесь в рабочей среде, вы не захотите использовать это.

 

$cpt_name = 'post-type'; //add your own post type //what pagination page are we on? if(! empty($_GET['pag']) && is_numeric($_GET['pag']) ){ $paged = $_GET['pag']; }else{ $paged = 1; } //you could use this if you want, just make sure to use "/page/2" instead of "?pag=2" in the pagination links. //$paged = (get_query_var('paged')) ? get_query_var('paged') : 0; //how many posts should we display? $posts_per_page = (get_option('posts_per_page')) ? get_option('posts_per_page') : 10; //let first get ALL of the possible posts $args = array( 'posts_per_page' => -1, 'orderby' => 'title', 'order' => 'ASC', 'fields' => 'ids', 'post_type' => $cpt_name ); $all_posts = get_posts($args); //how many total posts are there? $post_count = count($all_posts); //how many pages do we need to display all those posts? $num_pages = ceil($post_count / $posts_per_page); //let make sure we don't have a page number that is higher than we have posts for if($paged > $num_pages || $paged < 1){ $paged = $num_pages; } //now we get the posts we want to display $args = array( 'posts_per_page' => $posts_per_page, 'orderby' => 'title', .

t_count > $posts_per_page ){ echo '<div class="pagination"> <ul>'; if($paged > 1){ echo '<li><a class="first" href="?pag=1">&laquo;</a></li>'; }else{ echo '<li><span class="first">&laquo;</span></li>'; } for($p = 1; $p <= $num_pages; $p++){ if ($paged == $p) { echo '<li><span class="current">'.$p.'</span></li>'; }else{ echo '<li><a href="?pag='.$p.'">'.$p.'</a></li>'; } } if($paged < $num_pages){ echo '<li><a class="last" href="?pag='.$num_pages.'">&raquo;</a></li>'; }else{ echo '<li><span class="last">&raquo;</span></li>'; } echo '</ul></div>'; } }

Я надеюсь, что кто-то воспользуется этим:)

РЕДАКТОР: Что за черт! Идти делать что-то не так… может так же правильно! Здесь также немного МЕНЬШЕ (без каких-либо миксинов).

 

.pagination { margin: 30px 0px; ul { display:block; list-style-type:none; margin:0 auto; padding: 0px; li { display:inline-block; list-style-type:none; margin:0; padding:0; a, span { display:inline-block; font-size: 14px; width:auto; min-width:26px; height:26px; line-height: 26px; border: 1px solid #dddddd; border-right: 0px; background:#FFFFFF; color:#FF0000; padding: 5px; text-align: center; &:hover { cursor:pointer; text-decoration:none; } &.first { border-top-left-radius: 3px; border-bottom-left-radius: 3px; } &.last { border-top-right-radius: 3px; border-bottom-right-radius: 3px;} } span.last, span.first { color: #FF0000; &:hover { cursor: default; } } a.last, a.first { &:hover { } } a:hover, &.active a, .current { background:#FF0000; color:#ffffff; border-color: #b21712; } &:last-child { a, span { border-right: 1px solid #dddddd; } a { &:hover { border-color: #FF0000; } } } } } }

qaru.site

Как выводить посты с помощью get_posts

Предположим, что нужно вывести заголовки последних 6 записей из рубрики «Новости» в отдельном блоке в сайдбаре (к примеру, рубрика «Новости» имеет id=3). Тогда в файл sidebar.php нужно добавить следующий код:

<?php  $my_posts = get_posts('numberposts=6&category=3');  foreach ($my_posts as $post) :  setup_postdata($post);  ?>  <h2 class="entry-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>  <?php endforeach; ?>

Критерии отбора записей могут быть различны. Например вы можете вывести записи из нескольких категорий, указав их id через запятую в параметре «category=номер категорий», или наоборот исключить записи определенных категорий, указав их id со знаком «-«.

Параметры вывода постов для функции get_posts

Функция get_posts может принимать различные параметры, знакомтесь.

numberposts — определяет количество выводимых постов. Чтобы убрать это ограничение нужно поставить значение -1. Значение 0 будет выводить столько постов, сколько уазано в настройках WordPress.

category — определяет из каких категорий нужно выводить посты. Необходимо указывать ID категорий. ID категорий со знаком минус будут исключены из вывода. Можно указать сразу несколько id категорий, указав из через запятую.

tag — выводит записи имеющие определенные метки. Необходимо указывать slug метки — альтернативное имя. Если указать несколько меток через запятую, то будут выведены все записи, имеющие хотя бы одну из этих меток. Если указать несколько меток через пробел, то будут выведены только те посты, которые имеют все эти метки одновременно.

orderby — сортирует показанные посты. Сортировать посты можно по нескольким критериям:


  • ‘author’ — сортировка по ID авторов
  • ‘category’ — сортировка по ID категорий
  • ‘content’ — сортировка по контенту
  • ‘date’ — сортировка по дате создания записи
  • ‘ID’ — сортировка по ID самой записи
  • ‘menu_order’ — сортировка по полю menu_order. Используется для постоянных страниц и прикреплений (картинки, файлы и т.п.)
  • ‘mime_type’ — сортировка по MIME типу
  • ‘modified’ — сортировка по дате изменения
  • ‘name’ — сортировка по альтернативному имени (slug)
  • ‘rand’ — Случайная сортировка
  • ‘status’ — сортировка по статусу (черновик, опубликовано и т.п.)
  • ‘title’ — сортировка по названию
  • ‘parent’ — сортировка по ID родителя (parent ID)
  • ‘password’ — сортировка по паролю
  • ‘type’ — сортировка по типу

order — порядок сортировки, «ASC» — сортирует в прямом порядке, «DESC» — сортирует записи в обратном порядке.


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

post_type — выводит посты определенного типа: post — посты, page — страницы, attachment — прикрепленные записи, any — все записи.

Я привел неполный список параметров, по которым можно выводить посты в любом месте шаблона, полный список можно посмотреть в кодексе WordPress.

www.onwordpress.ru

Пример использования функции get_post

Данный код позволит нам получить все данные записи 1 в виде объекта.

Обратите внимание, что номер записи в функцию get_post должен передаваться как переменная, в противном случае это приведёт к ошибке:

Получение данных записи WordPress в виде массива или объекта

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

  • ARRAY_N — получим данные в виде простого массива;
  • ARRAY_A — получим данные как ассоциативный массив;
  • OBJECT — получим объект с всеми данными;

Давайте посмотрим на примере:

Какие данные мы можем получить с помощью get_post

После того как мы сделали запрос в базу данных с помощью функции WordPress — get_post, мы получим следующие данные:

  • ID — Номер ID записи;
  • post_author — Идентификатор автора запрашиваемой записи;
  • post_date — Дата создания запрашиваемой записи в виде YYYY-MM-DD HH:MM:SS;
  • post_date_gmt — Дата создания запрашиваемой записи по Гринвичу — YYYY-MM-DD HH:MM:SS;
  • post_modified — Дата последнего изменения запрашиваемой записи в виде YYYY-MM-DD HH:MM:SS;
  • post_modified_gmt — Дата последнего изменения запрашиваемой записи по Гринвичу YYYY-MM-DD HH:MM:SS;
  • post_content — Сам текст (контент) запрашиваемой записи;
  • post_title — Заголовок запрашиваемой записи;
  • post_excerpt — Анонс (вводный текст) запрашиваемой записи;
  • post_status — Статут запрашиваемой записи, который может быть: private, publish, inherit, pending, draft, static, future, object, attachment, trash;
  • comment_status — Можно ли комментировать запись, ответ может быть: closed, open, registered_only;
  • ping_status — Статус трэкбэков/пингов запрашиваемой записи, может быть следующим: closed, open;
  • post_password — Пароль запрашиваемой записи;
  • post_name — Слаг записи — название которое указывается в ЧПУ адресе записи(home иди about и т.п.);
  • to_ping — URL из записи, на которые необходимо отправить уведомления в случае обновлении записи;
  • pinged — URL из записи, которыми уже было получено уведомление об обновлении;
  • post_parent — ID идентификатор родительской страницы записи;
  • guid — Ссылка на запрашиваемую запись;
  • menu_order — Порядковый номер записи для создания меню WordPress;
  • post_type — Тип запрашиваемой записи. Может быть: page, post, attachment;
  • post_mime_type — MIME-тип запрашиваемой записи. К примеру: zip, png, gif, pdf, jpg;
  • comment_count — Кол-во комментариев запрашиваемой записи;

Пример вывода данных с помощью функции get_post

Как видите использование функции WordPress — get_post() очень просто.

www.school-wp.net

Основные и вторичные запросы

Основной запрос (или основной цикл) в WordPress это тот, который выполняется на раннем этапе загрузки ядра, он строится из запрошенного URL, настроек постоянных ссылок и т.д. Во время основного запроса WordPress определяет такие параметры как количество записей на страницу, используемый шаблон в теме и прочие. Основной запрос делает сам WordPress.

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

  • Вывести в боковой колонке список самых популярных записей
  • Вывести выделенные записи в слайдере на главной странице
  • Вывести записи из той же категории в блоке «похожие записи»

Вторичные запросы выполняются с помощью класса WP_Query, или с помощью одной из вспомогательных функций get_posts(), query_posts() и т.д. Если вы не знакомы с WP_Query, советуем прочитать нашу статью.

Основным отличием query_posts() от других вспомогательных функций является то, что query_posts() заменяет основной цикл на новый, вторичный цикл WordPress. Это значит, что в цикле с query_posts() мы можем работать так же, как и в обычном основном цикле.

Для сравнения рассмотрим цикл для вывода популярных записей с помощью WP_Query:

// Вторичный цикл  $popular = new WP_Query( ... );  while ( $popular->have_posts() ) {   $popular->the_post();     the_title(); // вывести название   the_content(); // вывести содержимое  }

Этот же цикл с помощью query_posts():

// Вторичный цикл  query_posts( ... );  while ( have_posts() ) {   the_post();     the_title(); // вывести название   the_content(); // вывести содержимое  }  

Безусловно второй вариант выглядит немного чище и привычнее, поскольку такая конструкция чаще всего встречается при работе с основным циклом WordPress.

Именно поэтому разработчики часто думают, что query_posts() изменяет основной запрос WordPress, но это не так. Функция query_posts() заменяет основной цикл новым вторичным циклом, и происходит это после выполнения основного запроса.

$wp_query и $wp_the_query

После выполнения основного запроса WordPress помещает его результат в глобальную переменную $wp_the_query, а в глобальной переменной $wp_query хранится всего лишь ссылка на $wp_the_query. Функции have_posts(), the_post() и прочие работают именно с глобальным объектом $wp_query.

Чтобы в этом убедиться достаточно взглянуть на реализацию подобных функций:

function have_posts() {   global $wp_query;   return $wp_query->have_posts();  }

Функция query_posts() создает новый вторичный запрос с помощью WP_Query и помещает результат в эту же глобальную переменную $wp_query:

function query_posts( $query ) {   $GLOBALS['wp_query'] = new WP_Query();   return $GLOBALS['wp_query']->query( $query );  }

Таким образом функции, которые предназначены для работы с основным циклом WordPress начинают работать с нашим вторичным запросом, а основной запрос остался в глобальной переменной $wp_the_query, ссылку на которую можно восстановить с помощью функции wp_reset_query().

function wp_reset_query() {   $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];   wp_reset_postdata();  }

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

Пагинация

Самым частым результатом использования query_posts() является сломанная пагинация, когда например первые две страницы работают, а третья и четвертая возвращают ошибку 404. Давайте рассмотрим как, и почему это происходит.

По умолчанию WordPress показывает десять записей на одной странице. Допустим у нас всего двадцать записей, это всего две страницы. Изменить количество записей на страницу можно легко с помощью query_posts() в начале нашего шаблона index.php или archive.php:

global $query_string;  query_posts( $query_string . '&posts_per_page=5' );  

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

Напоминаем, что основной запрос WordPress происходит еще до того, как обрабатываются шаблоны index.php или archive.php, где происходит наша «подмена». В основном запросе количество записей на страницу — десять, и всего две страницы. Третей и четвертой страниц в основном запросе нет.

Именно основной запрос определяет какой шаблон темы будет использоваться, и при запросе третей или четвертой страницы WordPress будет использовать шаблон 404.php.

Изменение количества записей на страницу это самый простой и явный пример ошибок с query_posts(). Гораздо сложнее подобные ошибки отловить, если вы например исключаете метку или категорию из списка записей на главной, или добавляете произвольный тип записей в поток.

Событие pre_get_posts

Наиболее правильным способом изменить основной цикл WordPress является событие pre_get_posts, которое происходит перед каждым запросом WP_Query. Работать с этим событием можно в плагине или в файле functions.php вашей темы:

function my_pre_get_posts( $query ) {   if ( ! is_admin() && $query->is_main_query() ) {   $query->set( 'posts_per_page', 5 );   }  }  add_action( 'pre_get_posts', 'my_pre_get_posts' );  

Важно отметить, что pre_get_posts вызывается для каждого запроса WP_Query, включая основной запрос, навигационное меню, вторичные запросы в виджетах и прочее. С помощью метода is_main_query() мы изменяем параметры только основного запроса, а с помощью проверки is_admin() мы меняем запрос только на лицевой части сайта и не в административной панели.

Результат такого подхода тот же, что и с query_posts(), но в этот раз будет работать пагинация, а загрузка страницы будет происходить быстрее, поскольку с pre_get_posts мы действительно изменили основной запрос перед его выполнением и не выполняли вторичных запросов.

Альтернативы query_posts()

Если вам необходимо выполнить вторичный запрос в WordPress, воспользуйтесь функцией get_posts() или конструкцией new WP_Query(). При работе с ними ваш код будет более явным и понятным для читающих.

Когда вам необходимо изменить основной запрос WordPress перед его выполнением, самым простым способом является событие pre_get_posts, или фильтр request, который выполняется еще раньше, чем pre_get_posts и только для основного запроса.

Если у вас возникли вопросы про query_posts() или WP_Query, оставьте комментарий и мы обязательно вам ответим.

wpmag.ru

Что это за функция

Функция get posts стала доступна в ядре WordPress еще с версии 1.2.0.

Она предназначена для того, чтобы извлекать списки постов из базы данных, применяя на них пользовательские фильтры для сортировки конечного результата.

По своей сути, эта функция подобна классу wp query, поскольку также возвращает объекты wp post из базы данных. Более того, внутри она использует все тот же класс wp query для построения и исполнения SQL запросов. Однако, в ней задаются несколько другие аргументы, о которых более подробно можно узнать из кодекса WordPress.

date_query-1024x576

Как работает эта функция

Механика работы get posts достаточно проста. Сперва, вы задаете массив аргументов, по которым будет извлечено заданное количество записей из базы данных и их сортировка. При этом, можно отсортировать их по множеству параметров, таких как ID, заголовок, дата публикации, значение meta ключа и т.д. После чего, вы разбираете этот массив на отдельные объекты wp post (иными словами, отдельные записи) и задаете определенные свойства, которые будут отображаться в шаблоне WordPress.

Почему бы не использовать wp_query напрямую

В плагинах рекомендуется применение именно get posts, а не класса wp query, для получения объектов wp post. Так сделано потому, что этот класс изменяет основной цикл, который по умолчанию используется для отображения записей в WordPress. Из-за этого, он может вызвать некоторые проблемы в работе сайта. Кроме того, использование wp query может значительно увеличить время загрузки страницы, так как сценарий будет выполнять в 2 раза больше работы.

wp_query

Примеры использования функции

Чтобы лучше понять механику работы get posts, давайте рассмотрим некоторые примеры ее использования, такие как:

  • Отображение последних статей по ID;
  • Отображение статей в случайном порядке;
  • Отображение статей с определенным произвольным полем.

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

Последние записи

Если вы хотите отобразить определенное число последних постов, находящихся на вашем сайте, то вы можете использовать эту функцию для извлечения объектов wp post и сортировке по ID. Вот пример:

<?php
$args = array ("posts_per_page" => 10, "order" => "DESC", "orderby" => "ID");
$lastarticles = get_posts ($args);
foreach ($lastarticles as $article)
{
echo "<h1>" . $article - > post_title . "</h1><br>";
echo "<p>" . $article - > post_content . "</p><br>";
}
?>

Здесь используется параметр «OrderBy» для сортировки сообщений по убыванию значения их ID (идентификатора). Таким образом, вы получаете 10 самых последних записей, так как каждый новый пост сохраняется в БД под следующим по счету ID.

Случайные записи

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

<?php
$args = array ("posts_per_page" => 1, "orderby" => "rand");
$randarticles = get_posts ($args);
foreach ($randarticles as $article)
{
echo "<h1>" . $article -> post_title . "</h1><br>";
echo "<p>" . $article -> post_content . "</p><br>";
}
?>

В данном примере, параметру «OrderBy» передается значение «rand», что означает случайную сортировку объектов wp post.

Записи с определенным значением произвольного поля

Бывают ситуации, в которых нужно получить все посты, имеющие определенный meta ключ с конкретным значением. Например, на некоторых блогах используется имя ревьювера для каждого обзора. Используя следующий код, можно получить объекты wp post, в которых имеется заданный meta ключ:

<?php
$args = array ("posts_per_page" => - 1, "meta_key" => "reviewer", "meta_value" => "victordark");
$metaarticles = get_posts ($args);
foreach ($metaarticles as $article)
{
echo "<h1>" . $article -> post_title . "</h1><br>";
echo "<p>" . $article -> post_content . "</p><br>";
}
?>

Здесь извлекаются все посты ревьювера «victordark». Обратите внимание, что имя ревьювера для каждого поста должно быть сохранено с помощью meta ключа «reviewer». Но вы можете использовать любое другое название для сохранения meta ключа, а потом извлекать его по этому названию.

Заключение

Функция get posts является наиболее часто используемой в WordPress, потому что имеет огромное количество возможностей. Практически каждый плагин так или иначе применяет ее в своей работе. Если вы разрабатываете свой плагин или тему, или просто хотите вывести определенные записи в каком-то месте своего сайта, то вам не обойтись без нее.

Peakmqc5liY

Похожие статьи

wordpresslib.ru

What is the get_posts() Function?

The get_posts function has been available in WordPress core since WordPress 1.2.0. This function is basically used to retrieve posts from the database by applying custom filters and sorting the final result based on a set of parameters.

The get_posts() function returns an array of WP_Post objects. Each WP_Post object represents an individual post.

Internally get_posts uses the WP_Query object to construct and execute the SQL queries based on the passed set of parameters.

Note: Posts means post, page and custom post type.

Why Not Use the WP_Query Object Directly?

Plugins use get_posts function instead of WP_Query object because using the WP_Query object directly alters the main loop (i.e., the global $wp_query variable) which would cause site issues.

What Is the Difference Between get_posts() and get_pages() Functions?

Both of them are used to retrieve posts from the WordPress database, however, here are some of the differences between them:

  • Several of the parameter names and values differ between them. Although they behave the same way regardless of the names of the parameters.
  • The get_pages() function currently does not retrieve posts based on meta_key and meta_value parameters.
  • The get_pages() function doesn’t use the WP_Query object. Instead, it constructs and executes SQL queries directly.

get_posts() Function Parameters

The get_posts function takes only one argument as an array. The array contains the different parameters to apply custom filters and sort the result.

Here’s a code example which shows how to call this function and the various parameters available:

<?php     $args = array(  	"posts_per_page" => 5,  	"paged" => 1  	"tax_query" => array(  		array(  			"taxonomy" => "category",  			"field" => "slug",  			"terms" => "videos,movies",  		)  	),  	"orderby" => "post_date",  	"order" => "DESC",  	"exclude" => "1123, 4456",  	"meta_key" => "",  	"meta_value" => "",  	"post_type" => "post",  	"post_status" => "publish"  );    $posts_array = get_posts($args);     ?>

There are more parameters available, but these are the most commonly used ones. Let’s look at each of these parameters:

  1. posts_per_page: This parameter defines the number of posts to return. Use -1 if you want all the posts.
  2. paged: Allows us to navigate between a set of posts while using the posts_per_page parameter. It is used for pagination. For example: suppose posts_per_page is 10 and there are 20 posts in the result, then if you assign paged to 2 then last 10 posts are returned.
  3. tax_query: Display posts of a particular taxonomy slug i.e., filter out posts of the other taxonomy slug. terms can take a comma separated string representing multiple taxonomy slugs.
  4. orderby: It’s used to sort the retrieved posts. Some possible values are: “none”, “date”, “rand”, “comment_count”, “meta_value”, “meta_value_num” etc. While sorting using “meta_value” and “meta_value_num” you need to provide the meta_key parameter.
  5. order: Designates the ascending or descending order of the orderby parameter. Possible values are “DESC” or “ASC”.
  6. exclude: It takes a comma separated list of post IDs which will be excluded from a database search.
  7. meta_key and meta_value: If you provide only meta_key, then posts which have the key will be returned. If you also provide meta_value then posts matching the meta_value for the meta_key is returned.
  8. post_type: Retrieves content based on post, page or custom post type. Remember that the default post_type is only set to display posts but not pages.
  9. post_status: Retrieves posts by status of the post. Possible values are: “publish”, “pending”, “draft”, “future”, “any” or “trash”.

The WP_Post Object

The get_posts function returns an array that contains WP_Post objects. Here are the important properties of the WP_Post object:

  1. ID: ID of the post
  2. post_author: Author name of the post
  3. post_type: Type of the post
  4. post_title: Title of the post
  5. post_date: Date on which post was published. Format: 0000-00-00 00:00:00
  6. post_content: Content of the post.
  7. post_status: Status of the post
  8. comment_count: Number of comments for the post

Examples of get_posts

Let’s check out some examples using the get_posts function.

If you want to display the top n number of the most discussed posts on your site, then you can use get_posts to retrieve them. Here’s an example:

<?php  	$args = array("posts_per_page" => 10, "orderby" => "comment_count");  	$posts_array = get_posts($args);  	foreach($posts_array as $post)  	{  	 echo "<h1>" . $post->post_title . "</h1><br>";  	 echo "<p>" . $post->post_content . "</p><br>";  	}   ?>

Here, we are using the orderby parameter to sort the posts based on the number of comments, retrieving the top 10 posts.

Random Posts

You can also easily retrieve random posts. This is helpful to recommend users another article on your site once they’ve finished reading the current one. Here’s the code for this:

<?php   $args = array("posts_per_page" => 1, "orderby" => "rand");   $posts_array = get_posts($args);   foreach($posts_array as $post)   {   echo "<h1>" . $post->post_title . "</h1><br>";   echo "<p>" . $post->post_content . "</p><br>";   }   ?>

In the above example, we passed the value rand to the order_by parameter.

Posts with Matching Meta Key and Value

We might want to retrieve all posts which have a particular meta key and value assigned. For example: some blogs have a reviewer for every article. We might want to retrieve articles reviewed by a particular reviewer.

Here is the code to do just that:

<?php   $args = array("posts_per_page" => -1, "meta_key" => "reviewer", "meta_value" = "narayanprusty");   $posts_array = get_posts($args);   foreach($posts_array as $post)   {   echo "<h1>" . $post->post_title . "</h1><br>";   echo "<p>" . $post->post_content . "</p><br>";   }   ?>

Here, we’re retrieving all the posts reviewed by “narayanprusty”. We’re assuming the reviewer name is stored via the meta key “reviewer” for every post.

Custom Post Type with Custom Taxonomy

We may want to retrieve posts of a custom post type with a custom taxonomy name. Consider this code example:

<?php   $args = array("posts_per_page" => -1, "post_type" => "coupons", "tax_query" => array(   array(   "taxonomy" => "coupon_category",   "field" => "slug",   "terms" => "plugins,themes",   )   ));   $posts_array = get_posts($args);   foreach($posts_array as $post)   {   echo "<h1>" . $post->post_title . "</h1><br>";   echo "<p>" . $post->post_content . "</p><br>";   }   ?>

In this example, we’re retrieving the posts of a custom post type named “coupons” which belong to the “plugins” and “themes” custom taxonomies.

Conclusion

In this article we saw how the get_posts function works, the various parameters it supports, looping through the returned result and some sample use cases. The get_posts function is one of the most used WordPress functions, I hope you can now start using it your own projects.

www.sitepoint.com


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.