Модификации стандартных циклов в WordPress перед вызовом

Циклы – не самая лёгкая для понимания тема в изучении WordPress, поэтому возможно вам будет легче изучить её при помощи моего видеоурока.

Наверное по заголовку не совсем понятно, о чем речь. Итак, предположим, что есть страница для рубрик, archive.php (ну или category.php, это не важно).

Мы создали новый тип постов, например events, (ивенты) но в рубриках они ничерта не появились. Ну то есть в админке при создании ивента мы приписали ему какую-либо из рубрик, но толку нет.

Первое решение, которое напрашивается, это изменить в начале файла цикл при помощи query_posts. Окей, сделали.

$params = array(
	'post_type' => array('post', 'events'),
	'posts_per_page' => 7 // должен быть равен параметру в настройках чтения
);
query_posts( $params );

В итоге перестала работать постраничная навигация.

Дело в том, что в основном цикле есть ещё некоторые параметры, которые необходимо учитывать. И сделать это можно двумя способами:

Способ 1.
Этот код вставляется непосредственно на страницах category.php, tag.php, archive.php, search.php и так далее.

global $wp_query;
$params = array(
	'post_type' => array('post', 'events')
	// posts_per_page нахрен не нужен, пусть берется из основного цикла
);
$params = array_merge( $wp_query->query, $params );
query_posts( $params );

Способ 2.
Сделаем всё то же самое, но при помощи фильтра. Код засунуть в functions.php, находящийся в папке с текущей темой.

function tr_pre_redefining_query($query) {
	if ($query->is_category) { // вот оно, определение нужной страницы
		$query->set('post_type', array('post', 'events'));
	}
	return $query;
}
 
add_filter('pre_get_posts', 'tr_pre_redefining_query');

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 2

Комментирование этого поста более не доступно.
  • moonkir 25 августа 2015 #

    Способ 2.

    Очень помог - спасибо

  • Максим 26 января 2016 #

    Здравствуйте.

    Нужно, вероятно, указать, что "Способ 2" изменяет ВСЕ запросы. Из-за этого могут возникнуть ошибки на страницах: что-то лишнее появится там, где не должно быть.

    Приведу пример на метках.

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

    Так вот. Если сделать так, как указано в "Способе 2", то на странице архива метки, конечно же, появятся посты всех типов контента, как нам и нужно. Но и на странице поста в разделе релевантных постов появятся посты всех типов контента, а этого нам не нужно.

    Поэтому считаю, что оба способа хороши, но они имеют важные отличия по применению. И это нужно учитывать.