Как вам уже сказали, использовать 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';