/ Wordpress / Циклы wordpress (основа основ)

Циклы wordpress (основа основ)

HIT

01.10.2015

4923

Основой структуры wordpress является запрос к базе данных и вывод данных в цикл. Какие бывают циклы, когда лучше применять тот или иной цикл, рассмотрим в данной статье.

Стандартный цикл wordpress (index.php, category.php, tag.php, архивы)

Обратите внимание: в стандартном Цикле мы не указываем никаких данных для выборки записей, а сразу начинаем цикл с if( have_posts() ){… Это говорит о том, что данные уже существуют и их нужно просто обработать и вывести на экран.
<?php if (have_posts()) : ?>

<?php while (have_posts() ) : the_post(); ?>

<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>

<?php endwhile; ?>

<?php endif; ?>

Цикл на основе query_posts()

Преимущества такого изменения в том, что если мы, например, изменим количество выводимых записей на странице с 10 (по умолчанию) на 20, то пагинация на странице автоматически подстроиться под это изменение, потому что query_post() меняет данные глобальной переменной $wp_query, а пагинация строиться именно на основе этих данных.
<?php global $query_string; // параметры базового запроса query_posts($query_string.'&cat=-6,-9&order=ASC&posts_per_page=20'); // базовый запрос + свои параметры ?>
[СТАНДАРТНЫЙ ЦИКЛ WORDPRESS]
<?php wp_reset_query();// сброс запроса?>
Не нужно использовать query_posts() для создания нескольких циклов на одной странице, для вывода в сайдбар списка постов, для создания дополнительного вывода записей и т.п., для этих целей используйте циклы на основе get_posts(). К тому же, обе функции понимают параметры одинаково! Так зачем «платить» больше?..

Пользовательские типы записей в шаблоне категорий (&post_type=video) — не очень хорошая идея, т.к. ломается пэйджинация. Типы записей лучше делать архивами.

Цикл на основе WP_Query()

Особенность циклов на WP_Query() в том, что мы создаем новый объект ( $query ), который никак не связан с аналогичным глобальным объектом $wp_query и поэтому мы никак не нарушаем структуру текущей страницы.
<?php $query = new WP_Query( 'cat=9&nopaging=1' );// указываем категорию 9 и выключаем разбиение на страницы (пагинацию) ?>

<?php if ($query ->have_posts()) : ?>
<?php while ($query->have_posts() ) : $query->the_post(); ?>

<h2><a href="<?php the_permalink(); ?>">
<?php the_title(); ?></a></h2>

<?php endwhile; ?>
<?php endif; ?>

<?php wp_reset_postdata(); // сбрасываем переменную $post ?>

Цикл на основе get_posts()

Самый удобный вариант выводить нужные записи в нужном порядке — это выводить их с помощью get_posts(). get_posts() в 99% случаев полностью заменяет WP_Query()
<?php global $post;
$args = array( 'posts_per_page' => 5, 'offset'=> 0, 'category' => 48 );
$myposts = get_posts( $args );
foreach( $myposts as $post ) : setup_postdata($post); ?>

<a href="<?php the_permalink(); ?>"><?php the_post_thumbnail(thumbnail); ?><?php the_title(); ?></a>

<?php endforeach; ?>
<?php wp_reset_postdata() ?>

Где и какой из 3-х вариантов циклов использовать:

  • query_posts() — если нужно изменить/подправить стандартный вывод записей на страницах WordPress. Можно использовать 1 раз на странице;
  • get_posts() — если нужно вывести записи из Базы Данных. Можно использовать сколько угодно раз на странице;
  • Класс WP_Query() — во всех других случаях когда не подошли query_posts() и get_posts().
query_functions

Инфографика по данной теме

И еще раз тезисно:

query_posts — основной (базовый) запрос wordpress, влияет в каком месте (запись, категория, поиск и т.д.) сайта мы находимся. Если необходимо незначительно скорректировать используем query_posts.
Если нужно создать какой-либо масштабный запрос, используем WP_Query — это независимый полноценный запрос.
get_posts является легковесной служебной функцией для создания выборки постов.

Любопытно, но на деле, если всего один цикл, у query_posts меньше обращений к БД чем у get_posts. Расчет был сделан на основе функции замера количества запросов к БД.

Изменение основного цикла

Нужно добавлять перед if ( have_posts() ) :

<?php // Изменяем основной запрос
global $wp_query;
$params = array(
	'posts_per_page' => -1
);
$params = array_merge( $wp_query->query, $params );
query_posts( $params ); ?>

Так же можно писать и так:

global $query_string; // параметры базового запроса
query_posts($query_string.'&orderby=meta_value_num&meta_key=area&order=ASC'); // + свои параметры

if(have_posts()) :
	while(have_posts()) : the_post();

		get_template_part( 'solus' );

	endwhile;
endif;

Либо так:

global $query_string;	// добавляем базовые параметры в массив $args
parse_str($query_string, $args); // добавляем/заменяем параметр в массиве
$args['posts_per_page'] = -1;
query_posts( $args );

Дальнейшая тема для изучения — глобальные переменные.

[site-socialshare]
  • Комментарии
  • Вложения

Добавить комментарий

Пока нет комментариев. Будь первым!

Циклы wordpress (основа основ) Циклы wordpress (основа основ)
Эффект наведения курсора на изображение
Рекомендации для васЭффект наведения курсора на изображениеOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.