Описание
Получает записи (посты, страницы, вложения) из Базы Данных по указанным критериям.
Используя эту функцию можно выбрать самые разные данные см. параметры и использование ниже.
Эта функция является заменой query_posts(). С версии WordPress 3.0 get_posts() может, кроме описанных ниже, принимать все те же параметры что и query_posts()! Однако, имейте ввиду, что у get_posts() есть предустановленные параметры, которые возможно, нужно будет изменить, чтобы они не мешали получить нужный результат, например:
- если мы указываем вывод таксономии для типа записей отличного от post, то параметр post_type нужно изменить;
- если мы забудем изменить параметр numberposts, то долго можем недоумевать почему выводится только 5 записей вместо 20.
get_posts() используется в: wp_get_recent_posts().
Функция возвращает массив данных.
Использование
<?php get_posts( $args ); ?>
Шаблон использования
$args = array(
'numberposts' => 5,
'offset' => 0,
'category' => '',
'orderby' => 'post_date',
'order' => 'DESC',
'include' => '',
'exclude' => '',
'meta_key' => '',
'meta_value' => '',
'post_type' => 'post',
'post_mime_type' => '',
'post_parent' => '',
'post_status' => 'published'
);
$posts = get_posts($args);
foreach($posts as $post){ setup_postdata($post);
// формат вывода
}
wp_reset_postdata();
Параметры
- $args (строка/массив)
- Список аргументов, в соответствии с которыми будет получен результат.
По умолчанию: предустановленные
Аргументы параметра $args
WordPress 2.6+
В дополнении к тем параметрам, которые описаны ниже, get_posts() может принимать те же параметры что и функция query_posts(), так как теперь обе функции используют одно и то же ядро запроса к БД.
Важно! Теперь в get_posts() включен по умолчанию параметр 'suppress_filters'=>true - это фильтры выборки, который так же используется в функции query_posts(). Включение этого фильтра может ввести в замешательство, если используются плагины влияющие на стандартный вывод постов в WordPress, такие как WPML.
Для WordPress 2.5 и выше
- numberposts (число)
- Количество выводимых постов. Установить на 0, чтобы ограничить вывод максимальным числом постов на страницу (устанавливается в настройках ВП) или поставить -1 чтобы убрать ограничения вывода (LIMIT).
По умолчанию: 5 - offset (число)
- Отступ от первого поста (записи).
По умолчанию: 0 - category (строка/число)
- Из каких категорий выводить записи. Укажите ID категории из которой нужно получить посты или укажите, -3 вместо 3, если нужно получить все записи, кроме записей из категории 3 (исключить категорию). Можно указать несколько ID через запятую ("3,5,12" или "-3,-5,-12"). Массив передавать нельзя.
По умолчанию: нет - category_name (строка)
- Показывать посты только из этой категории (указывается название или альтернативное имя(slug) категории).
По умолчанию: нет - tag (строка)
- Получить записи имеющие указанные в этом параметре метки. Нужно указывать альтернативное имя (slug) метки. Если указать несколько имен (меток) через запятую, то будут получены записи соответствующие любой метке, а если разделить пробелами, то будут получены записи имеющие все указанные метки.
По умолчанию: нет - orderby (строка)
- Сортировать результат по указанным полям. Можно указывать несколько полей сортировки, через запятую.Допустимые поля:
- 'author' - Сортировать по ID авторов.
- 'category' - Сортировать по ID категорий.
- 'content' - Сортировать по контенту.
- 'date' - Сортировать по дате создания записи.
- 'ID' - Сортировать по ID самой записи. С версии 2.5.
- 'menu_order' - Сортировать по полю menu_order. Используется для постоянных страниц и прикреплений (картинки, файлы и т.п.).
- 'mime_type' - Сортировать по MIME типу. Используется для прикрепленый.
- 'modified' - Сортировать по дате изменения.
- 'name' - Сортировать по альтернативному имени (slug).
- 'rand' - Случайная сортировка. С версии 2.5. Создает повышенную нагрузку на БД.
- 'status' - Сортировать по статусу (черновик, опубликовано и т.п.)
- 'title' - Сортировать по названию.
- 'parent' - Сортировать по ID родителя (parent ID).
- 'password' - Сортировать по паролю.
- 'type' - Сортировать по типу (пост, страница и т.д. ).
По умолчанию: 'post_date'
- order (строка)
- В каком направлении упорядочить, указанное в параметре $orderby, поле:
ASC - По порядку (от меньшего к большему, по алфавиту).
DESC - В обратном порядке (от большего к меньшему).
По умолчанию: 'DESC' - include (строка/число)
- 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). Оба параметра должны быть определены иначе не будет работать ни один.
По умолчанию: нет - post_type (строка)
- Какого типа посты нужно получать, может быть:
- 'post' - посты
- 'page' - постоянные страницы
- 'attachment' - прикрепленные записи
- 'any' - все типы
По умолчанию: 'post'
- post_mime_type (строка)
- Какого типа прикрепления нужно получить. Может быть использовано, когда параметр post_type равен attachment. Может быть:
- 'image/jpeg'
- 'image/png'
- 'image/gif'
- 'audio/mpeg'
- 'application/pdf'
- 'application/zip'
По умолчанию: нет
- post_status (строка)
- Статус записи. Можно передать несколько статусов через запятую. Может принимать:
- 'publish' - опубликовано
- 'private' - личная запись
- 'draft' - черновик
- 'future' - запланировано
- 'inherit' - статус для прикрепленных записей (по умолчанию, если $post_type равно 'attachment')
- ''(пусто) - все статусы (или 'any' для версий выше 2.8)
По умолчанию: publish
- post_parent (число)
- Показать только дочерние записи к указанному ID.
По умолчанию: нет - nopaging (логический)
- Включить или отключить пагинацию, если стоит true параметр $numberposts игнорируется.
По умолчанию: false
Примеры
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 endforeach; ?> </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 endforeach; ?> // возвращаем былое значение $post <?php $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 endforeach; ?>
Данные можно также получить через обращение к свойству объекта (объект->свойство_объекта). Например, для этого примера $post->ID будет равно ID поста, $post->post_content будет содержать контент записи. Свойство объекта это колонка таблицы БД posts. Название колонок можно посмотреть тут.
Не забывайте, что на экран данные выводятся через php оператор echo:
<?php echo $post->ID; ?>
4. Последние записи отсортированные по заголовку
Получим последние посты отсортированные по заголовку в алфавитном порядке. Следующий пример выведет дату, заголовок и цитату поста:
<?php $args = array( 'posts_per_page' => 10, 'order'=> 'ASC', 'orderby' => 'title' ); $postslist = get_posts( $args ); foreach ($postslist as $post) : setup_postdata($post); ?> <div> <?php the_date(); ?> <br /> <?php the_title(); ?> <?php the_excerpt(); ?> </div> <?php endforeach; ?>
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; ?> </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();
}
}
?>
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 );
}
}
?>
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 изменен ряд передаваемых параметров - у параметров с префиксом post_ префикс был удален, например, было post_title, стало просто title
- С версии 3.0 параметрам include и exclude можно передавать и массивы ID.
get_posts()
из файла: /wp-includes/post.php WP 3.3.2function get_posts($args = null) {
$defaults = array(
'numberposts' => 5, 'offset' => 0,
'category' => 0, 'orderby' => 'post_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);
}Связанные Функции
Смотрите также: Функции WordPress и Теги Шаблона.
Реклама двигатель торговли и эта фраза уже знакома всем, она даже уже стала настолько крылатой, что порой не обращаешь внимание на её смысл. Тоже самое можно сказать про продвижение сайтов. Без продвижения сайтов сегодня никуда... Каждый сайт который хочет занять достойную нишу в своей теме, обязан продвигаться. Это не обязательно покупка ссылок, под продвижением понимается любая работа направленная направленная на улучшение позиций в выдаче.

Здравствуйте! Пробую следующий код, но он не работает
<?php $args = array( 'post_type' => 'attachment', 'orderby' => 'rand', 'category' => 1); $attachments = get_posts( $args ); foreach ( $attachments as $post ) { ?> <li><?php the_attachment_link($post->ID, false); ?></li> <?php } ?>без 'category' => 1 работает, но выводит все изображения, а нужно только из категории 1.
Пробовал так же 'category' => -4 (вторая категория, которую нужно исключить) тоже не работает
'category_name' => 'gallery' тоже не хочет работать, грешу на 'post_type' => 'attachment', может из за этого условия...
Если знаете, подскажите как ограничить по категории. Спасибо.
Готовый ответ я не подскажу, но ошибка в том что вложение не может относится к категории, а относится к посту. Т.е. вам нужно сначала получить все посты из нужной категории, а потом получить все вложения (attachment) этих постов.
Мельком пробежался по мануалу параметров query_posts(), мне кажется сделать такое, стандартными средствами ВП не получится.
Попробуйте получить ID всех постов из категории, собрать их в массив, а затем в вашем примере вместо 'category' => 1 вписать 'post_parent' => массив_из_ID_постов. Но для начала проверьте понимает ли вообще параметр post_parent несколько ID, судя по мануалу ему можно передать только 1 ID.
вышел из положения исключением нескольких attachment_id
array(1,2) пригодилось, т.к. просто 'exclude' => 1,2 не сработало
а как вывести название подкатегории, а под ней список названий постов, которые она содержит?
это можно сделать через get_post?
только нужно немного хитро..
всего имеется несколько подкатегорий, и, может можно, не вставлять каждую из них вручную (category=...), а чтобы сразу выводился список из всех.. (т.к. будут появляться новые подкатегории)
не уверена, что получилось вразумительно рассказать, но если вдруг подскажете - буду мегаблагодарна
Добрый день.
Возник вопрос.
Параметры get_posts у меня такие:
$args = array('numberposts' => 5, 'include' => '1,2,3,4,5', 'post_type'=>'any', 'order'=>'ASC');Не подскажите, как можно заставить get_posts выводить записи в порядке их перечисления в пункте include.
А то вариантов orderby море, но такого, казалось бы, очевидного и нет. Есть ли возможность это как-то исправить?
Спасибо!
Вроде штатными методами такое не получиться. Можно пробовать после получения данных отсортировать их в нужном порядке, как-то так.
В интернетах пишут, что задача это известная и нетривиальная. И вроде как решали люди ее вообще не через get_posts. Но мне хотелось бы именно с помощью этой функции, так как я ее везде использую
Странно и почему я query posts использовал везде...
Благодаря развернутой статье тут и на этой странице, я исправил все ошибки. Хочу поделиться результатам - до этого было 102 запроса к бд с главной страницы. сейчас 56! и уменьшилось время на генерацию страницы с 2.2 секунд до 1.4 секунды. и выиграл 200 килобайт оперативы (сейчас 19.9мб)
Очень порадовало что есть возможность в get posts использовать выборку по произвольным полям. Кама - ваш блог уже в сотый раз меня выручил
Небольшой вопрос:
заключать в '' обязательно?
то-есть как я делаю - это верно? тут количество на страницу без этого символа, а слаг тэга в нём ( и подскажите как называется этот символ ', чувствую себя деревней
вроде не апостроф, и не кавычка... )
Это тут не описано: 'orderby' => 'meta_value' делает сортировку по значению произвольного поля (проверил на вп 3.2.1). meta_value_num возможно тогда тоже будет работать - проверить не могу.
Тут в начале отсылка на параметры query_posts() - они одинаковые с get_posts(). Там все это описано подробно. Здесь дублировать не хочу, лень
Ту статью надо обновить уже возможно, кодекс периодически обновляется.
а по поводу вопроса в 15 комментарии?
Надо бы еще добавить meta_query(array) для возможности выборки несколько значений одной функцией, стандартными средствами, а то долго искал, все предлпгпют вытащить все, что можно, а потом разгребать по одному.
подробнее - в кодексе http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters
В этом комментарии уже отвечал на подобный вопрос.
Вот код, который выводит список ВСЕХ постов во ВСЕХ категориях:
<?php $categories = get_categories(); foreach ( (array) $categories as $category ) : $posts = get_posts('cat=' . $category->term_id); ?> <h3><?php echo $category->name; ?></h3> <ul> <?php foreach ( (array) $posts as $post ) : ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endforeach; ?> </ul> <?php endforeach; ?>Подскажите пожалуйста, как исключить из этого списка некоторые категории, чтобы выводились не все категории, а только заданные и к ним посты.
Измучелась совсем, ничего не получается. Помогите, плиззз!!!
Сделал вывод записей на подобие примера 1. Но проблема появилась: если в рубрике всего лишь одна запись, то ничего не выводится, а если 2 и более, то выводятся все, кроме первой. Что с этим можно сделать?
Разобрался самостоятельно. Почитал статью о циклах на wp.org и нашёл полезный код:
<?php $my_query = new WP_Query('cat=2&posts_per_page=10'); ?> <?php while ($my_query->have_posts()) : $my_query->the_post(); ?> <!-- получить записи из рубрики special_cat... --> <?php endwhile; ?>Думаю, лучше использовать его, а не цикл foreach, что, вобщем-то, и сделал у себя в блоге.
А можно ли сделать выборку по ОТСУТСТВИЮ произвольного поля с данным именем? Что-то я как ни пыталась, у меня не вышло.