Задать вопрос
bro-dev
@bro-dev

Чем еще query_posts отличается от get_posts?

Мне нужно чтобы в основном цикле выводились все медиафайлы
почему так работает
spoiler
get_posts(array(
	'post_type' => 'attachment',
));

а так нет
spoiler
query_posts(array(
	'post_type' => 'attachment',
));

Чем они еще отличаются?
  • Вопрос задан
  • 526 просмотров
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 3
dimasmagadan
@dimasmagadan
query_posts использовать нельзя
Ответ написан
Комментировать
Aligatro
@Aligatro
Turn food and coffee into software...
query_post используется для изменения цикла используемого самим wordpress, а get_posts необходим для создания собственного цикла.
Ответ написан
Комментировать
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Как вам уже сказали, использовать query_posts не стоит. Вообще забудьте о существовании этой функции.

Чем query_posts отличается от get_posts

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

1. Код функции query_posts() из файла wp-includes/query.php
function query_posts($query) {
	// Первым делом, функция убивает текущий WP_Query, 
	// запрос который был выполнен для текущей страницы,
	// ЗАМЕНЯЯ его новым, пустым экземпляром WP_Query.
	$GLOBALS['wp_query'] = new WP_Query();
	// Далее, функция обращается к этому новому экземпляру,
	// и выполняет запрос с передаными в функцию параметрами.
	// Результаты запроса возвращаются, но при этом глобальный 
	// изначальный WP_Query тоже ЗАМЕНЕН. То есть, данная функция 
	// деструктивна! Она меняет глобальный объект и имеет побочные эффекты.
	return $GLOBALS['wp_query']->query($query);
}

2. Код функции get_posts() из файла wp-includes/post.php
function get_posts( $args = null ) {
	// Функция изначально содержит некий набор параметров по умолчанию.
	// Из важных - возвращает 5 постов, устанавливает suppress_filters в true, 
	// что означает что все фильтры на хуках posts_* НЕ ПРИМЕНЯЮТСЯ. А вот 
	// в том же query_posts они применяются, потому как там вызывается прямо
	// WP_Query, у которого параметр suppress_filters по умолчанию = false.
	$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;

	// И еще один очень важный параметр. Он означает, что не нужно считать общее количество
	// найденных записей по нашему запросу, поскольку нам нужна всего лишь небольшая порция,
	// никакой пагинации и тд. Это упрощает и ускоряет SQL-запрос.
	$r['no_found_rows'] = true;

	// И вот, наконец, создается НОВЫЙ экземпляр WP_Query, который НЕ ЗАМЕНЯЕТ никаких 
	// глобальных объектов. На нем выполняется запрос со сформированными выше параметрами, 
	// и его результат возвращается из функции наверх. 
	// Никакого взаимодействия с глобальным scope.
	$get_posts = new WP_Query;
	return $get_posts->query($r);
}


А вот, собственно, и ответ на ваш вопрос, вот этот фрагмент функции get_posts():
if ( empty( $r['post_status'] ) )
    $r['post_status'] = ( 'attachment' == $r['post_type'] ) ? 'inherit' : 'publish';
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы