get_posts() — позволяет получить массив из объектов постов, соответствующих заданным параметрам

Функция возвращает массив, содержащий объекты постов (записей, страниц, вложений, произвольных типов постов или всё сразу), соответствующие заданным параметрам. Прежде всего хочу сказать — если вам нужно вывести посты, то рассмотрите использование WP_Query для этих целей.

get_posts( $args )

Имеет следующие значения параметров по умолчанию:

$params = array(
	'post_type' => 'post', // тип постов - записи
	'numberposts' => 5, // получить 5 постов, можно также использовать posts_per_page
	'orderby' => 'date', // сортировать по дате
	'order' => 'DESC', // по убыванию (сначала - свежие посты)
	'suppress_filters' => true // 'posts_*' и 'comment_feed_*' фильтры игнорируются
);

Соответствия параметров get_posts() и WP_Query

Любой из параметров WP_Query прекрасно подойдет и для get_posts(). Кроме того, функция имеет несколько эквивалентных параметров:

Параметр get_posts() Его эквивалент в WP_Query
numberposts posts_per_page
category cat
include post__in
Также устанавливает значение posts_per_page равным количеству перечисленных постов.
exclude post__not_in

То есть в принципе вы можете не использовать параметры из первой колонки таблицы вообще, но если вы увидите их где-то в коде, то уже точно будете знать, что они означают.

Примеры использования get_posts()

Для начала самый простой пример — выведем ссылки на 5 последних опубликованных постов на блоге. Для получения URL постов нам также потребуется функция get_permalink().

$recent_posts_array = get_posts(); // получаем массив постов
foreach( $recent_posts_array as $recent_post_single ) : // для каждого поста из массива
	echo '<a href="' . get_permalink( $recent_post_single ) . '">' . $recent_post_single->post_title . '</a>'; // выводим ссылку
endforeach; // конец цикла

Аналогичный пример, но с использованием функция the_permalink() (для вывода урл) и the_title() (для вывода заголовков).

<?php
$params = array(
	'posts_per_page' => 5 // этот параметр не обязателен, так как get_posts() по умолчанию и так выводит 5 постов
);
$recent_posts_array = get_posts( $params );
foreach( $recent_posts_array as $recent_post_single ) :
	setup_postdata( $recent_post_single ); // устанавливает $post (глобальная переменная - объект поста)
	?><a href="<?php the_permalink() /* URL записи */ ?>"><?php the_title() /* выводим заголовок */ ?></a><?php
endforeach;
wp_reset_postdata(); // сбрасывает $post

Больше примеров смотрите здесь.

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии 6

  • VRS 10 ноября 2015 #

    Доброй ночи, Миша.
    Можешь ли помочь разобраться с get_posts?

    Использую его при изменении галереи.

    add_filter('post_gallery', 'my_post_gallery', 10, 3);
     
    function my_post_gallery($output, $attr, $instance) {
     
    global $post;
     
        if (isset($attr['orderby'])) {
            $attr['orderby'] = sanitize_sql_orderby($attr['orderby']);
            if (!$attr['orderby'])
                unset($attr['orderby']);
        }
     
        extract(shortcode_atts(array(
            'order' => 'ASC',
            'orderby' => 'menu_order ID',
            'id' => $post ? $post->ID : 0,
            'itemtag' => 'dl',
            'icontag' => 'dt',
            'captiontag' => 'dd',
            'columns' => 3,
            'size' => 'thumbnail',
     
            'include' => '',
            'exclude' => ''
     
        ), $attr));
     
        $id = intval($id);
        if ('RAND' == $order) $orderby = 'none';
     
        if (!empty($include)) {
            $include = preg_replace('/[^0-9,]+/', '', $include);
            $_attachments = get_posts(array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby, 'field' => 'id'));
     
    		$title = trim(strip_tags( $post->title ));
     
            $attachments = array();
             foreach ($_attachments as $key => $val) { 
                $attachments[$val->ID] = $_attachments[$key];
            } 
     
     
        }
        if (empty($attachments)) return '';
     
     
            $output = "<div id=\"gallery-$instance\" class=\"gallery  gallery-$size\" >\n";
     
    		$container_id = get_post_thumbnail_id();		
     
    		$container = wp_get_attachment_image_src( $container_id, 'thumbnail' );
    		$container_full = wp_get_attachment_image_src( $container_id, 'full' );
     
    		$thumbnail_image = get_posts(array('p' => $container_id, 'post_type' => 'attachment', 'field' => 'id'));		
    		$caption = trim(strip_tags( $thumbnail_image[0]->caption ));
    		$gallery_price = '';
    		$gallery_price = get_post_meta($post->ID, 'gallery', true);
    		print $post->ID;
     
    		$prev_img = '';
    		$dop_class = ' col-md-4 col-sm-6 col-xs-12'	;
     
    		if (has_shortcode($gallery_price, 'gallery') and is_front_page()) {
     
    		$output .= "<div class=\"gallery_container\">\n";		
    		$output .= "<a class=\"my-foto-container-a\" href=\"{$container_full[0]}\"  title=\"$title $caption\">";
    		$output .= "<img src=\"{$container[0]}\" width=\"{$container[1]}\" height=\"{$container[2]}\" alt=\"$title $caption\" class=\"my-foto-container  for-all-image trumb-category\"/>\n";
     
    		$output .=  "</a>\n";
            $output .= "</div>\n";
     
    		}
    		else {
     
    		$prev_img = "<li class=\"gallery-item$dop_class\">\n";
    		$prev_img .= "<a href=\"{$container_full[0]}\" title=\"{$title}\" class=\"my-foto-a\" >";
    		$prev_img .= "<img src=\"{$container[0]}\" width=\"150\" height=\"100\" alt=\"{$title}\" class=\"my-foto\"/>";
     
    		$prev_img .= "</a>\n";		  
    		$prev_img .= "</li>\n";
     
    		}
     
     
     
    		$output .= "<ul class=\"trumb_gallery row\">\n";
     
    		$output .= $prev_img;		
     
    		foreach ($attachments as $id => $attachment) {
     
    		  $img = wp_get_attachment_image_src($id, array(150,150));
     
    		  $url_prevu = wp_get_attachment_image_src($id, $size);
    		  $url_big = wp_get_attachment_image_src($id, 'full');
    		  $title = trim(strip_tags( $attachment->post_excerpt ));
    		  $output .= "<li class=\"gallery-item$dop_class\">\n";
    		  $output .= "<a href=\"{$url_big[0]}\" title=\"{$title}\" class=\"my-foto-a\"><img src=\"{$img[0]}\" width=\"{$img[1]}\" height=\"{$img[2]}\" alt=\"{$title}\" data-prevu=\"{$url_prevu[0]}\" data-large=\"{$url_big[0]}\" class=\"my-foto\"/></a>\n";
     
    		  $output .= "</li>\n";
    		}   
     
    		$output .= "</ul>\n";
    		$output .= "</div>\n";       
     
            return $output;    
     
    		wp_reset_postdata();
     
    }

    Почему-то у первой записи срабатывает

     has_shortcode($gallery_price, 'gallery')
    print $post->ID;

    это показывает id не того поста, в котором галерея, а последней созданной записи.

    Тыщу раз перепроверила wp_reset_postdata(); Он везде стоит где global $post;

    что-то я запуталась (((

    • Миша 10 ноября 2015 #

      Привет!
      А можно ли использовать параметр фильтра $attr['id'] для получения ID поста?

      • VRS 10 ноября 2015 #
        print $attr['id']

        ничего не выводит

        • Миша 11 ноября 2015 #

          Блин, тогда даже хз, это нужно ставить код и разбираться.. А какая задача у кода?

          • VRS 11 ноября 2015 #

            Он меняет стандартный вывод галереи. Вписаны классы фрейворка. На главной галереи из произвольного поля отображаются с крупной картинкой и несколькими миниатюрами под ней.
            Вот здесь если открыть первую запись

            http://test.13503.aqq.ru/

            отображается главной картинкой миниатюра 4-го товара, т.к. он опубликован последним.

            • Миша 12 ноября 2015 #

              Блин, тут надо ставить этот код и разбираться, сходу трудно сказать. В принципе можешь скинуть мне доступ по емайл - я гляну, как будет время.

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, в случае несоблюдения этого условия в 99% случаях ваш коммент будет удалён, а автор заблокирован. Печалька.