WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

get_posts() WP 1.2.1

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

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

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

  • post_type = post - если мы указываем вывод таксономии для типа записи отличного от post, то параметр post_type нужно изменить - он по умолчанию равен post.
  • numberposts = 5 - если мы забудем изменить параметр numberposts, то долго можем недоумевать почему выводится только 5 записей вместо нужных 20.
  • suppress_filters = true — этот параметр отключает работу некоторых фильтров (хуков). Читать подробнее.

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с = очень медленно

Хуков нет.

Возвращает

WP_Post[]/[].

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

  • Массив 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){
    		...
    	}
    )

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

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"). Массив передавать нельзя.

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

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

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(true/false)

Включение этого параметра отменяет/пропускает все фильтры изменение 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.

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

Заметки

  • Смотрите: WP_Query::parse_query()

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

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

Код get posts: wp-includes/post.php WP 5.2.2

<?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 (запрос)

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

127 комментов
Полезные 9 Вопросы 4 Все
  • campusboy3409 cайт: www.youtube.com/c/wpplus

    Почему не срабатывает вот так:

    $reviews = get_posts( 'post_type=reviews' );

    А вот так срабатывает

    $args = array( 'post_type' => 'reviews' );
    $reviews = get_posts( $args );

    Хотел просто сокращенно записать, такие примеры в wp_query есть, а они же одинаковые параметры принимают, так ведь?

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

      Нашёл косяк, прошу прощения. Но непонятно почему именно так. Пишу и не пашет:

      $reviews = get_posts( 'post_type=reviews' );
      foreach($reviews as $review) : setup_postdata($review);

      А вот так пишу- пашет:

      $reviews = get_posts( 'post_type=reviews' );
      foreach($reviews as $post) : setup_postdata($post);

      Я сейчас имею ввиду, что the_title() выводит названия записей, а не отзывов.

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

        Пришлось the_title() заменить на echo $post->post_title, тогда нормально стало отображать.

        А в чём прикол? Как будто the_title() только на $post срабатывает.

        P.S.: Разобрался, прочитав, как работает get_the_title(). Небольшая выписка:

        По умолчанию: Берется ID, который находится в переменной $post: $post->ID

        Ответить3.9 года назад #
      • Kama7534

        Теги шаблона работают именно с глобальной переменной $post! После обработки цикла не забудь сбросить её с помощью wp_reset_postdata().

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

          Спасибо за совет, конечно, использую. А названия переменной я решил сменить по одной причине: писал с товарищем тему одну для себя, там было крайне много циклов через get_posts. Делил их по правилам, используя wp_reset_postdata() и сохраняя $post в произвольную переменную, а после действий возвращая обратно из переменной, но всё равно обнаруживались лаги. Некоторые циклы влияли на другие, пока я переменные $post не начал называть по-другому. Это было год назад, на тот момент мы так и не смогли понять почему так происходит, но желание отойти от имени этой переменной от греха подальше осталось.

          Ответить3.9 года назад #
          • Kama7534

            Я думаю, в таких случаях лучше не использовать setup_postdata($post); а пользоваться произвольной переменной и обрабатывать данные вручную, вроде:

            get_the_title( $foo->ID );
            apply_filters('the_content', $foo->post_content );

            Или вообще можно, если это частный сайт а не тема ВП:

            esc_html( $foo->post_title );
            1
            Ответить3.9 года назад #
            • campusboy3409 cайт: www.youtube.com/c/wpplus

              Благодарю. Согласен, пусть этот вариант и менее удобный, зато исключает ряд таких вот проблем, что экономит время при разработке.

              Ответить3.9 года назад #
    • Kama7534

      Очень странно, у меня работает все!

      $rev = get_posts( 'post_type=page' );
      print_r( $rev );
      Ответить3.9 года назад #
  • campusboy3409 cайт: www.youtube.com/c/wpplus

    Можно как-то отменить сортировку (orderby)? У меня собираются с помощью foreach с произвольных полей ID связных записей, к примеру 334 1702 63 61 2821. Мне надо, чтобы в таком порядке и записи вывелись. Это очень важно.

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

      P.S.: Вопрос решен, залез в WP_Query, а там есть для этого случая команда post__in, которая в get_posts не описана была. А так get_posts поддерживает атрибуты WP_Query, то использовал и всё получилось. Такой вид теперь:

      $args = array( 'post_type' => 'any', 'include' => $cnt, 'orderby' => 'post__in' );
      1
      Ответить3.8 года назад #
  • Денис2 cайт: classikby.ru

    Можно ли через get_posts выводить пользовательский тип записей или для этого нужно использовать query_post?

    Ответить3.7 года назад #
  • К сожалению с get_posts не работает пагинация. Как можно с этим бороться?

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

      использовать wp_query

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

      Можно, конечно. Если надо именно get_posts, то механизм такой:
      1) Подсчет кол-во постов для рубрики (если пагинация там). Затем количество постов делим на число выводимых записей. Полученное число округляем в сторону большего (если 6,2, то делаем 7).
      2) На основе полученного числа генерируем (с помощью цикла) ссылки типа

      <ul>
       <li><a href="&page=1">Страница 1</a></li>
       <li><a href="&page=2">Страница 2</a></li>
       <li><a href="&page=3">Страница 3</a></li>
       <li><a href="&page=4">Страница 4</a></li>
       <li><a href="&page=5">Страница 5</a></li>
       <li><a href="&page=6">Страница 6</a></li>
       <li><a href="&page=7">Страница 7</a></li>
      </ul>

      3) При переходе на сраницу, к примеру &page=2 считываем значение с помощью $_GET['page'], умножаем на число отображаемых записей, получаем число, которое подставим в аргумент offset, используемый в get_posts.

      Вот такой вот вариант решения smile Однажды пришлось делать именно так.

      Ответить3.7 года назад #
  • kortvagner

    Все перепробовал, не получается! Подскажите пожалуйста...
    Есть запись (ID=1570). В ней находится галерея (стандартная галерея wordpress).
    Как мне, допустим, на главной странице вывести данную галерею через (get_posts(); или get_children()wink Пробовал и то и то - не получается! (Возможно связано с неправильным получением ID поста или еще с чем-то). Помогите, прошу!!!
    Вот такой код - работает, НО выводит аттачменты всех постов, А МНЕ НАДО ТОЛЬКО c ID 1570!!!

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

    Заранее спасибо!!!

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

      Когда-то похожее делал так (точно не помню, подойдет или нет):

      <?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 ) {
        $my_url_foto = wp_get_attachment_image_src( $attachment->ID, 'large' );
       ?>
       <div class="col-md-4 single-portfolio-img">
       <a href="<?php echo $attachment->guid; ?>" class="colorlightbox">
        <img title="" class="img-responsive wow animated fadeInUp" src="<?php echo $my_url_foto[0]; ?>" width="100%">
       </a>
       </div>
      <?php }
      }
      wp_reset_postdata();
      ?>
      1
      Ответить3.6 года назад #
      • kortvagner

        Спасибо, но откуда берется $post->ID ??? Как указать именно определенный пост с ID 1570??? Я так понимаю, что $post->ID используется в цикле, когда я нахожусь в нужном посте, а если я хочу вывести галерею на главной странице, а не в том же посте, где она создана??? Я че-то вобще запутался! Помогите пожалуйста!

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

          Да, $post->ID - это ID текущего поста. Отсюда по логике вывод, если используете в другом месте, значит просто вставьте своё число:'post_parent' => 1570

          Ответить3.6 года назад #
          • kortvagner

            В том-то и дело, что когда делаю вот так - ничего не выводится sad

            <?php
            
            $args = array('post_type' => 'attachment', 'posts_per_page' => -1, 'post_status' => null, 'post_parent' => 1570 );
            $attachments = get_posts($args);
            if ($attachments) {
             foreach ( `$attachments` as `$attachment` ) {
              $my_url_foto = wp_get_attachment_image_src( `$attachment->ID`, 'large' );
             ?>
            
             <a href="<?php echo `$attachment->guid`; ?>" class="colorlightbox">
              <img title="" class="img-responsive wow animated fadeInUp" src="<?php echo `$my_url_foto[0]`; ?>" width="100%">
             </a>
            
            <?php }
            }
            wp_reset_postdata();
              ?>
            Ответить3.6 года назад #
            • campusboy3409 cайт: www.youtube.com/c/wpplus

              Значит скорее всего эти картинки были загружены просто в разделе Медиафайлы или относятся к другой записи. Вот и не выводятся таким методом. Других у меня предположений нет.

              1
              Ответить3.6 года назад #
              • kortvagner

                Пробовал с другими записями с прикрепленными картинками и с галереями. Дело в том, что если вместо $post->ID (или 1570) вставить null, то код работает, но выводятся вообще все картинки из всех записей!

                Ответить3.6 года назад #
                • kortvagner

                  Проблему решил!!! Просто на самом деле фото не были прикреплены к записи (почему-то). Я вставлял в галерею уже существующие фото на сайте и не работало. Загрузил новые непосредственно в галерею и все заработало!!!
                  СПАСИБО ВАМ ОГРОМНОЕ ЗА ПОМОЩЬ!!!!

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

                    О чем я и говорил выше smile Очень рад, что Вы решили вопрос. Наслаждайтесь WordPress! А ещё всё же стоит обратить внимание на функцию, что я порекомендовал ниже. А так получается у Вас загружены дубликаты фотографий, которые уже есть на сайте!

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

          Также Вам скорее всего идеально подойдет функция gallery_shortcode

          1
          Ответить3.6 года назад #
  • Надежда cайт: www.infors.net.ua

    Подскажите а как можно вписать пейджинг в данный код при использовании параметра 'posts_per_page' => 5

    Мне нужно вывести таблицу записей с пейджингом. Записи вывелись. Пейджинг добавить затрудняюсь.

    Ответить3.6 года назад #
    • Kama7534

      Вместо get_posts() используйте query_posts(), затем сразу функцию пагинации (можно мою функцию ) и затем wp_reset_query().

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

      Ответить3.6 года назад #
  • GadZZillA cайт: hinews.website

    Как сделать вывод сообщений из двух разных рубрик? Как все знают, сообщение можно поместить в две и более рубрики. Как вывести на экран такую запись? Например, есть категория "Город" и "Недвижимость". Нужно показать записи, соответствующие этим двум категориям. Как такое сделать?

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

    'inherit' - статус для прикрепленных записей (по умолчанию, если $post_type равно 'attachment')

    Есть у меня картинка, я её загрузил через раздел "Медиафайлы" и никуда не прикреплял, использую чисто в шаблоне. Но она всё равно выводится со всеми другими, которые прикреплены sad

    PS: пришлось просто в цикле сделать пропуск по ID вложения пока

    if ( $screenshot->ID == 242 ) continue;
    Ответить3 года назад #
    • Kama7534

      Попробуй использовать параметр post_parent__not_in=0

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

        Увы, не подошло. Откуда вообще такое взял? smile

        Ответить3 года назад #
        • Kama7534

          Из головы... Ты код скинь, я может не так понял что нужно и как ты делаешь...

          Ответить3 года назад #
          • campusboy3409 cайт: www.youtube.com/c/wpplus
            // Вывод скриншотов - Шорткод для страницы Скриншотов
            function get_screenshots_game(){
              $screenshots = get_posts( array( 'post_type' => 'attachment', 'posts_per_page' => 60, 'post_parent' => null, 'orderby' => 'rand' ) );
              if ($screenshots) {
            	$all_block = '';
            	foreach( $screenshots as $screenshot ){
            	  if ( $screenshot->ID == 242 ) continue;
            	  $one_img = wp_get_attachment_link( $screenshot->ID, 'full');
            	  $all_block .= '<div class="mod-item">'.$one_img.'</div>';
            	}
            	$container = '<div class="mods-grid">'.$all_block.'</div>';
            	return $container;
              }
              wp_reset_postdata();
            }
            add_shortcode('screenshots-game', 'get_screenshots_game');

            Код просто рандомно выводит 60 картинок из прикрепленных записей сайта. И почему-то там же выводится логотип сайта, который я загрузил сюда отдельно.

            Ответить3 года назад #
            • Kama7534

              Ты указал 'post_parent' => null т.е. получить все вложения прикрепленные и нет...

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

              Есть 3 варианта, относительно этого:

              1. 'post_parent__not_in' => array(0) - получит только прикрепленные к записям вложения

              2. 'post_parent' => 0 - получит только не прикрепленные к записям вложения

              3. 'post_parent' => null - получит все вложения, неважно прикреплено оно или нет...

              Очевидно тебе надо 'post_parent__not_in' => array(0) то что я и сказал вначале, только не уверен что если в строке указать, это правильно распарситься в ноль. В массиве работает, проверил...

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

                Всё, получилось вот так!

                $screenshots = get_posts( array( 'post_type' => 'attachment', 'posts_per_page' => 60, 'post_parent__not_in' => array ( 0 ) ) );
                1
                Ответить3 года назад #
  • campusboy3409 cайт: www.youtube.com/c/wpplus

    Может кому пригодится. Задача была получить отмеченные в админке услуги и, если их количество меньше определенного количества, дозаполнить последними опубликованными услугами до общего количества, к примеру, в 10 штук. Реализовано в виде слайдера (JS код не привожу, это не важная часть).

    <div class="home-scroller-area">
      <div class="scroller-title">
    	<h2><a href="/category/services">Наши услуги</a></h2>
      </div>
      <div class="owl-carousel">
    	<?php
    	// Сколько отображать услуг в слайдере, если нет отмеченных (при добавлении услуги помечается "Отображать на главной")
    	$max_show_services = 10;
    
    	// ID рубрики, с которой берутся услуги
    	$cat_ID_services = 6;
    
    	// Получаем ВСЕ услуги, отмеченные для отображения на главной странице
    	$services_front_page = get_posts( array( 'cat' => $cat_ID_services, 'posts_per_page' => -1, 'meta_key' => 'top_front_show', 'meta_value' => 'yes' ) );
    
    	// Количество выбранных услуг (число)
    	$cnt_sfp = count( $services_front_page );
    
    	// Если отмеченных услуг меньше положенного, то добавляем в предыдущий результат последние опубликованные услуги до отмеченного количества
    	$services_exclude = '';
    	if ( $cnt_sfp < $max_show_services ) {
    
    	  // Формируем строку из ID отмеченных услуг, чтобы исключить их из следующего запроса
    	  foreach ( $services_front_page as $service_fp_id) $services_exclude .= $service_fp_id->ID.' ';
    
    	  // Получаем последние опубликованные услуги, за исключением отмеченных и не более установленного количества для отображения
    	  $services_front_page_2 = get_posts( array( 'cat' => $cat_ID_services, 'posts_per_page' => $max_show_services - $cnt_sfp, 'exclude' => $services_exclude ) );
    
    	  // Объединяем Отмеченные услуги с Последними опубликованными
    	  $services_front_page = array_merge ( $services_front_page, $services_front_page_2 );
    
    	}
    
    	// Обработка данных о полученных услугах и вывод её на экран
    	foreach ($services_front_page as $service_fp){
    
    	  $service_title = ( mb_strlen( $service_fp->post_title ) <= 50 ) ? $service_fp->post_title : mb_substr( $service_fp->post_title, 0, 50 )."...";
    	  $service_url = get_permalink( $service_fp->ID );
    	  $service_img = get_the_post_thumbnail( $service_fp->ID );
    
    	  // Если у Услуги нет прикреплённой картинки - вообще её не показывать
    	  if ( $service_img ) printf ( '<div class="item"><a class="car-img" href="%s"> %s </a><div class="clearfix"></div><a class="car-titl" href="%s">%s</a></div>',
    		$service_url, $service_img, $service_url, $service_title );
    
    	}
    	wp_reset_postdata();
    	?>
      </div>
    </div>

    Два замечания:
    1) Не уверен, что нужно использовать wp_reset_postdata();
    2) Не знаю, как с помощью get_posts указать не добавлять в запрос записи, у которых нет миниатюры. В данном исполнении, хоть я и указал отображать 10 услуг (если отмеченных услуг меньше), но если, к примеру, у 3 услуг не будет миниатюры, то на экране отобразятся лишь 7 штук. Можно сделать рекурсию, и каждый раз проверять-дополнять записями, но это как-то не крутяк, так можно все записи перебрать или в бесконечный цикл улететь.

    Ответить3 года назад #
  • smidl

    Слушай, Кама. Вывожу я вот таким кодом посты. В произвольном поле там у меня строка из айдишек: "21,34,54" и т.д.

    Так вот, как сделать так, чтобы выводилось именно в порядке как в массиве идет?

    вот код:

    <?php
    $posts = get_posts( array('include' => get_field('rating_games'), 'post_type' => 'post', 'orderby' => 'id') );
    foreach($posts as $post){ setup_postdata($post);
    ?> 
    Ответить2.9 года назад #
Здравствуйте, !     Войти . Зарегистрироваться