Выводим записи (посты, статьи) в категориях (рубриках, разделах) и тегах по произвольному полю. Используем функцию WP_Query в шаблоне своего сайта на WordPress.
Нижеследующие разновидности кодов были отточены практикой и временем. Было убито очень много времени на то, чтобы WP_Query заработал именно так, как я от него хотел. В своем роде уникальные коды, переписывающие стандартные выводы записей WordPress.
Функционал этих кодов нигде больше нельзя найти (на момент публикации поста), за исключением отдельных вставок, которые являются общими рекомендациями от WordPress и некоторых участков, позаимствованных из других открытых источников.
Эти php коды для вывода записей через WP_Query, для удобства, даются без конструкций if (have_posts()). Но без неё работать не будут. Правильная конструкция if (have_posts()) для этих кодов приведена ближе к окончанию статьи.
1. WP_Query PHP код для вывода записей в КАТЕГОРИЯХ
Самый простой вывод постов, исключающий записи из конкретных категорий. Использую его для вывода на главной странице через index.php или home.php.
Также этот код занесен у меня в файл empty.php. Он нужен на тот случай, если человек зашел в категорию, где не должно быть никаких записей, там не будет ничего выводиться, кроме сообщения, что он не должен был попасть на эту страницу (раздел). И предлагаются инструменты для поиска на сайте.
Иногда в код, который выводит все статьи, но исключает определенные рубрики, требуется добавить пагинацию (&paged=’.$paged;), чтобы в последний страницах навигации не было пустых страниц.
В коде ниже выводятся записи с сортировкой по произвольному полю с ДАТОЙ. Выводятся записи с произвольным полем год, затем сортируются от последнего года к предыдущему.
// Произвольное поле по которому будет сортировка
$the_key = '1Year';
$args = array(
'meta_key' => $the_key,
// Сортируем по значению цифры в произвольном поле
'orderby' => 'meta_value_num',
// Сортируем от большего к меньшему
'order' => 'DESC',
// Исключаем категории
'cat' => '-310'
);
global $wp_query;
query_posts(
array_merge(
$wp_query->query,
$args
)
);
?>
2. WP_Query PHP код для вывода постов в КАТЕГОРИИ с БЮДЖЕТОМ
Следующий вывод WP_Query выводит, в категориях WordPress записи, по произвольному полю «Бюджет». В этом поле находятся цифровые значения.
Допустим требуется вывести в категории «Бюджет» все записи, которые будут сортироваться от большей цифры к меньшей.
global $query_string;
$paged = get_query_var( 'paged', 1 );
$loop = new WP_Query( $args );
$categoryvariable = $cat;
$args = array(
'post_type' => 'post',
'cat' => $categoryvariable,
// Исключаем категорию
'cat' => '-310',
// Выводим по произвольному полю
'meta_key' => '1Budget2',
// Нужен для правильной работы пангинации
'paged' => $paged,
'meta_query'=> array(
// Сравниваем поле бюджет с цифрой, меньше которой записи не выводить
'key' => '1Budget2',
'compare' => '>=',
'value' => 100000000,
'type' => 'numeric',
// Сравниваем, что не пустое. Если пустое - то не выводим.
// 'meta_compare' => '!=',
),
// Сортируем все записи по годам
'orderby' => 'meta_value_num',
// От большего к меньшему
'order' => 'DESC',
);
query_posts( $args );
?>
3. WP_Query PHP код для вывода постов в разделе РЕЙТИНГ
Нижеследующий код выводит все статьи с произвольным полем год, сортируя по этому произвольному полю (от последнего года, до меньшего). Одновременно с этим исключает все записи из категорий меньше значения рейтинга 9.
global $query_string;
$paged = get_query_var( 'paged', 1 );
$loop = new WP_Query( $args );
$categoryvariable = $cat;
$args = array(
'post_type' => 'post',
'cat' => $categoryvariable,
// Выводим по произвольному полю
'meta_key' => '1Year',
// Нужен для правильной работы пангинации
'paged' => $paged,
'meta_query'=> array(
// Сравниваем поле РЕЙТИНГА с цифрой, меньше которой записи не выводить
'key' => '1myRaiting',
'compare' => '>=',
'value' => 9,
'type' => 'numeric',
),
// Сортируем все записи по годам
'orderby' => 'meta_value_num',
// От большего к меньшему
'order' => 'DESC',
);
query_posts( $args );
?>
4. WP_Query PHP код для вывода постов в КАТЕГОРИИ с ДАТОЙ
В php коде ниже вводятся две переменные с ДАТАМИ. Текущая дата сравнивается с датой, которая будет в будущем.
Для чего это нужно? Например, я хочу вывести ТОВАРЫ, которые только поступят в продажу или ФИЛЬМЫ, которые только выйдут в ближайшем будущем. Если, например, такие ТОВАРЫ или ФИЛЬМЫ или ЧТО-ТО другое существует, то следует вывести ЗАПИСИ с этими произвольными полям. В противном случае в категории ничего не будет выводиться.
global $query_string;
$paged = get_query_var( 'paged', 1 );
$loop = new WP_Query( $args );
$categoryvariable = $cat;
// Вводим свои значения
// Текущая дата
$date1 = date('Y-m-d');
// Текущая дата + 12 месяцев
$date2 = date('Y-m-d', strtotime('+12 month'));
$args = array(
'post_type' => 'post',
'cat' => $categoryvariable,
// Выводим по произвольному полю
'meta_key' => 'premiere',
// Нужен для правильной работы пангинации
'paged' => $paged,
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_query'=> array(
'key' => 'premiere',
// Сравниваем значения двух дат
'value' => array($date1,$date2),
// Обозначаем, что будет дата, формат ГодМесяцДень
'type' => 'DATE',
// Сравниваем две даты, пример вывода: array('20500401','20500405')
'compare' => 'BETWEEN'
// Сравниваем, что не пустое. Если пустое - то не выводим.
// 'meta_compare' => '!=',
),
);
query_posts( $args );
?>
5. WP_Query PHP код для вывода записей в разделе ТЕГОВ
Вывод записей в тегах, в отличии от категорий, немного другой. По какой-то причине, в тегах не работает функция исключающая категории из WP_Query:
К счастью, работает другая структура:
И код вывода $wp_query для тегов будет такой:
// Произвольное поле по которому будет сортировка
$the_key = '1Year';
$args = array(
'meta_key' => $the_key,
// Сортируем по значению цифры в произвольном поле
'orderby' => 'meta_value_num',
// Сортируем от большего к меньшему
'order' => 'DESC',
// Исключаем категории
'category__not_in' => '310'
);
global $wp_query;
query_posts(
array_merge(
$wp_query->query,
$args
)
);
?>
6. WP_Query PHP код для вывода записей в разделе ПОИСКА
Для вывода WP_Query на странице поиска используем совершенно иной код:
// использую совместно с функцией SearchFilter в Functions.php
$mySearch =& new WP_Query("s=$s & showposts=-1");
// Подсчет количества найденного:
$num = $mySearch->post_count;
echo "Найдено: ";
echo $num;
echo "записей";
wp_reset_query();
?>
Для специальной обработки запроса WP_Query в файле search.php добавляем в файл functions.php своей темы следующий код:
function SearchFilter($query) {
if ($query->is_search) {
// Ищет только в постах, но не на страницах
$query->set('post_type', 'post');
// Происходит сортировка по году
$query->set('meta_key', '1Year');
// Который является значением номера
$query->set('orderby', 'meta_value_num');
// И сортируется в обратном порядке
$query->set('order', 'DESC');
}
return $query;
}
add_filter('pre_get_posts','SearchFilter');
Он сортирует записи в категории ПОИСК по произвольному полю ГОДЫ.
В заключение. Очень важно.
После любого из перечисленных выше кодов (кроме того что в functions.php) нужно вывести следующую функцию:
<?php endwhile; ?>
<? wp_reset_postdata(); ?>
<?php else: ?>
<?php endif; ?>
Обязательная нужна такая конструкция:
Это необходимо, чтобы не выводить пустые страницы, когда следует исключить записи из определенных рубрик на основании сравнения.
7. Код для главной страницы (раздела) для вывода и РАЗДЕЛЕНИЯ записей по ТЕГАМ
Следующая конструкция выводит записи из категории 27. Сортирует их случайно. Выводит 4 записи.
global $query_string;
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$loop = new WP_Query( $args );
$tagvariable = $tag;
$args = 'tag=' . $tagvariable . '&tag_id=27&orderby=rand&posts_per_page=4';
query_posts( $args );
?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php get_template_part( '/random' ); ?>
<?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_query();
// Аннулирует данные произвольного запроса WP_Query
// Если после цикла используется функция wp_reset_query() для "сброса" данных,
// то wp_reset_postdata() использовать не нужно!
?>
В конструкции выше код отвечающий за вывод поста находится в отдельном файле:
8. PHP для вывода и РАЗДЕЛЕНИЯ записей по РАЗДЕЛАМ
Тот же самый код, но для вывода записей из РАЗДЕЛОВ, а не ТЕГОВ. Значения вывода ($args) изменены на другие. В том числе учтена пагинация (&paged=’.$paged;), в конструкции выше она исключена из работы.
global $query_string;
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$loop = new WP_Query( $args );
$categoryvariable = $cat;
$args = 'cat=' . $categoryvariable . '&meta_key=1Year&orderby=meta_value_num&order=DESC&paged='.$paged;
query_posts( $args );
?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php get_template_part( '/random' ); ?>
<?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_query();
// Аннулирует данные произвольного запроса WP_Query
// Если после цикла используется функция wp_reset_query() для "сброса" данных,
// то wp_reset_postdata() использовать не нужно!
?>
9. Выводим один конкретный пост
Типовые конструкции для вывода одного определенного поста. В данном случае будет выведен пост с номером 1. Под конец wp_reset_postdata сбрасывает вывод WP_Query, так что можно выводить и любые другие посты.
while ($the_query->have_posts() ) : $the_query->the_post();
the_content();
edit_post_link(__('...', 'ploshadka.net'));
endwhile;
wp_reset_postdata();
10. Вывод записей с незаполненным произвольным полем
Можно вывести записи с пустым значением в конкретном произвольном поле. Иногда такой способ помогает найти все записи с незаполненными значениями. Как альтернатива поиска данных через MySQL.
$the_key = 'premiere_ru';
$args = array(
'meta_query' => array(
array(
'key' => $the_key,
'compare' => 'not exists',
'value' => null,
),
)
);
global $wp_query;
query_posts(
array_merge(
$wp_query->query,
$args
)
);
if ( have_posts() ) : while ( have_posts() ) : the_post();
get_template_part( '/ploshadka.net' );
endwhile;
endif;
wp_reset_query();
?>
11. Выводим одну конкретную страницу
В заключение как можно вывести вместо записи содержимое страницы. Выводим страницу с ID 130:
$p = get_page($id);
$t = $p->post_title;
echo '<h2 class="home-top-title">'.apply_filters('post_title', $t).'</h2>';
echo apply_filters('the_content', $p->post_content);
Очень классно! Полезная информация для всех! Наглядно и доступно! Спасибо автору!
Доброго времени. Подскажите, пожалуйста, как вывести посты автора на странице этого самого автора. То есть, в Записях есть выбор автора, вот по нему и вывести (не по имени, не по ID). Для автора (а их на сайте несколько) была создана страница в шаблоне author.php.
За ранее благодарю.