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

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

HIT

01.10.2015

4718

Основой структуры 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 );

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

Поделиться в соц. сетях:

  • Комментарии
  • Вложения

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

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

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