Как вывести записи (посты) по произвольному полю в WordPress

Admin PHP, WordPress 1 комментарий

Выводим записи (посты, статьи) в категориях (рубриках, разделах) и тегах по произвольному полю. Используем функцию WP_Query в шаблоне своего сайта на WordPress.

Нижеследующие разновидности кодов были отточены практикой и временем. Было убито очень много времени на то, чтобы WP_Query заработал именно так, как я от него хотел. В своем роде уникальные коды, переписывающие стандартные выводы записей WordPress.

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

PHP коды для вывода WP_Query состоят из значений произвольного поля, которое затем по-разному сортируются и сравниваются. Дальше в тексте статьи и в самом php уже есть примечания. Если нужны будут дополнительные, то поясняется отдельно.

Эти php коды для вывода записей через WP_Query, для удобства, даются без конструкций if (have_posts()). Но без неё работать не будут. Правильная конструкция if (have_posts()) для этих кодов приведена ближе к окончанию статьи.

1. WP_Query PHP код для вывода записей в КАТЕГОРИЯХ

Самый простой вывод постов, исключающий записи из конкретных категорий. Использую его для вывода на главной странице через index.php или home.php.

Также этот код занесен у меня в файл empty.php. Он нужен на тот случай, если человек зашел в категорию, где не должно быть никаких записей, там не будет ничего выводиться, кроме сообщения, что он не должен был попасть на эту страницу (раздел). И предлагаются инструменты для поиска на сайте.

<?php query_posts($query_string.'&cat=-1,-169,-40,-91'); ?>

Иногда в код, который выводит все статьи, но исключает определенные рубрики, требуется добавить пагинацию (&paged=’.$paged;), чтобы в последний страницах навигации не было пустых страниц.

В коде ниже выводятся записи с сортировкой по произвольному полю с ДАТОЙ. Выводятся записи с произвольным полем год, затем сортируются от последнего года к предыдущему.

<?php
// Произвольное поле по которому будет сортировка
$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 записи, по произвольному полю «Бюджет». В этом поле находятся цифровые значения.

Допустим требуется вывести в категории «Бюджет» все записи, которые будут сортироваться от большей цифры к меньшей.

<?php
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.

<?php
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 коде ниже вводятся две переменные с ДАТАМИ. Текущая дата сравнивается с датой, которая будет в будущем.

Для чего это нужно? Например, я хочу вывести ТОВАРЫ, которые только поступят в продажу или ФИЛЬМЫ, которые только выйдут в ближайшем будущем. Если, например, такие ТОВАРЫ или ФИЛЬМЫ или ЧТО-ТО другое существует, то следует вывести ЗАПИСИ с этими произвольными полям. В противном случае в категории ничего не будет выводиться.

<?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:

'cat' => '-310'

К счастью, работает другая структура:

'category__not_in' => '310'

И код вывода $wp_query для тегов будет такой:

<?php
// Произвольное поле по которому будет сортировка
$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 на странице поиска используем совершенно иной код:

<?php
// использую совместно с функцией 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 своей темы следующий код:

// Сортировка по годам для search.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 if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php endwhile; ?>
<? wp_reset_postdata(); ?>
<?php else: ?>
<?php endif; ?>

Обязательная нужна такая конструкция:

<? wp_reset_postdata(); ?>

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

7. Код для главной страницы (раздела) для вывода и РАЗДЕЛЕНИЯ записей по ТЕГАМ

Следующая конструкция выводит записи из категории 27. Сортирует их случайно. Выводит 4 записи.

<?php
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() использовать не нужно!
?>

В конструкции выше код отвечающий за вывод поста находится в отдельном файле:

<?php get_template_part( '/random' ); ?>
Вышеприведенную конструкцию можно размещать на главной или в любых других разделах сколько угодно раз.

8. PHP для вывода и РАЗДЕЛЕНИЯ записей по РАЗДЕЛАМ

Тот же самый код, но для вывода записей из РАЗДЕЛОВ, а не ТЕГОВ. Значения вывода ($args) изменены на другие. В том числе учтена пагинация (&paged=’.$paged;), в конструкции выше она исключена из работы.

<?php
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, так что можно выводить и любые другие посты.

$the_query = new WP_Query('p=1');

while ($the_query->have_posts() ) : $the_query->the_post();

the_content();

edit_post_link(__('...', 'ploshadka.net'));

endwhile;

wp_reset_postdata();

10. Вывод записей с незаполненным произвольным полем

Можно вывести записи с пустым значением в конкретном произвольном поле. Иногда такой способ помогает найти все записи с незаполненными значениями. Как альтернатива поиска данных через MySQL.

<?php
$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:

$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);

English Query (запросы по теме на английском языке)

How To Use WP_Query In WordPress

Order Results WP_Query by Meta Value

Order by ASC, DESC in custom WP_Query

Sorting Query Results with Multiple Meta Keys

How to sort the result of wp_query

Привет. Ты находишься на моём сайте. Я разработчик. Здесь я делюсь своими наработками и знаниями. Спрашивай в комментариях, если тебе что-то не понятно или пиши, если есть что добавить.

Если вам пригодилась информация, вы можете поблагодарить автора сайта символическим пожертвованием:

Комментарии к статье “Как вывести записи (посты) по произвольному полю в WordPress

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

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи: "Как вывести записи (посты) по произвольному полю в WordPress"
Если вам нужно добавить участок кода ставьте его между тегами <code></code>