Расширенные возможности команды query_posts

Апр 15th, 2010 | От Aleksey Davlad | Категория: CMS WORDPRESS, ХАКИ

С развитием WordPress, выходом новых версий и более тщательным изучением матчасти, расширяются и возможности некоторых важных команд, в данном случае - query_posts. Вообще команда query_posts - одна из самых полезных во всех версиях WordPress. Именно эта команда, которая позволяет определять содержимое, которое запрашивается (извлекается из базы данных), а затем отображается в цикле WordPress. Она дает невероятно гибкий метод для поиска и фильтрации сообщений и страниц практически по любым параметрам, которые можно придумать вообще. В многих случаях данная команда может заменять навороченные плагины, громоздкие хаки и шорткоды. А по моему глубокому убеждению, именно с ее помощью восполняется минимум 60% недостатков WordPress в качестве полнофункциональной системы управления контентом.

В то же время не правильное использование query_posts в циклах, помимо основного без этой команды( например в сайдбарах ) может привести к потере правильной работы вывода и вы можете увидеть вещи, понять причину которых очень трудно. Поэтому, не забываем учить матчасть и смотреть в Кодекс WordPress, где не так давно цикл с query_posts приведен в следующем виде:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
//The Query
query_posts('posts_per_page=5');
 
//The Loop
if ( have_posts() ) : while ( have_posts() ) : the_post();
 ..
endwhile; else:
 ..
endif;
 
//Reset Query
wp_reset_query();
 
?>

где wp_reset_query(); сбрасывает условия запроса через query_posts после выполнения в цикле.

Стандартное и простое применение команды читайте и смотрите в Кодексе, там все достаточно просто.

А вот некоторые не совсем простые примеры приведу с пояснениями. Например:

1. Вывод постов по " относительной популярности" :

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

1
2
3
4
5
6
<?php
// select posts ordered by comment_count
$query = 'orderby=comment_count';
$queryObject = new WP_Query($query);
// остальной код Вашего цикла ...
?>

2. Выборка всех постов для карты сайта :

Есть несколько способов, чтобы выбрать все должности, которые когда-либо были опубликованы, и эти методы в основном используются для Sitemaps или страниц архивов. Все они подходят для Google. Ниже несколько вариантов с помощью query_posts:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// вариант 1
$query = 'showposts=-1';
$queryObject = new WP_Query($query);
// остальной код Вашего цикла ...
 
// вариант 2
$query = 'posts_per_page=-1';
$queryObject = new WP_Query($query);
// остальной код Вашего цикла ...
 
// вариант 3 
$query = 'nopaging=true';
$queryObject = new WP_Query($query);
// остальной код Вашего цикла ...
?>

3. Исключение дублирования постов через query_posts:

Масса вариантов применялись без query_posts через хаки и шорткоды. Вариант с query_posts не хуже:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
// set the query
$query = 'posts_per_page=10';
 
// loop 1 - display most recent 10 posts
$queryObject = new WP_Query($query);
if ($queryObject->have_posts()) {
	while ($queryObject->have_posts()) {
		bm_ignorePost($queryPost->post->ID);
		$queryObject->the_post();
		the_title();
		the_content();
	}
}
 
// loop 2 - same query, get the next 10 posts
$queryObject = new WP_Query($query);
if ($queryObject->have_posts()) {
	while ($queryObject->have_posts()) {
		bm_ignorePost($queryPost->post->ID);
		$queryObject->the_post();
		the_title();
		the_content();
	}
}
?>

4. Выборка прикрепленных постов или выборка без прикрепленных постов.

На самом деле все чуть сложнее. Используя функцию прикрепления постов можно классифицировать их по разному. И если нужна выборка только их или выборка всех, но без прикрепленных можно воспользоваться вариантами кода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Только прикрепленных...
<?php 
$query = array(
    'post__in'=>get_option('sticky_posts')
);
$queryObject = new WP_Query($query);
// остальной код Вашего цикла ...
?>
 
// Без прикрепленных...
<?php
$query = array(
    'post__not_in' => get_option('sticky_posts')
);
$queryObject = new WP_Query($query);
// остальной код Вашего цикла ...
?>

И еще много разных вариаантов применения, которые требуют изучения. Так что о чем писать будет.

Теги: ,

Комментарии статьи