WP_Query(), описание класса, параметры

Про класс WP_Query можно сказать в двух словах — нужен для вывода постов, например:

  • из определенной категории и(или) по определенным тегам,
  • за определенный промежуток времени,
  • создание виджетов «Новое на блоге», «Популярные» и «Случайные записи»,
  • возможность отбора и сортировки постов по произвольным полям,
  • расширенный поиск на сайте и и т.д. (возможностей действительно очень много)
примеры использования WP_Query

Циклов на странице может находиться сколько угодно.

Это было небольшое вступление для тех, кто не в курсе.

Использование

В обоих следующих примерах выводятся ссылки на 5 самых комментируемых записей на блоге:

/*
 * в массиве задаем все необходимые параметры (более подробно о параметрах чуть ниже)
 */
$args = array(
	'posts_per_page' => 5,
	'orderby' => 'comment_count'
);
/*
 * создаем новый объект
 */
$q = new WP_Query($args);
/*
 * проверяем, существуют ли посты по заданным параметрам(необязательно)
 */
if($q->have_posts()) {
	/*
	 * затем запускаем цикл
	 */
	while($q->have_posts()){ $q->the_post();
		/*
		 * выводим например ссылку на каждый пост
		 */
		echo '<a href="' . get_permalink() . '">' . get_the_title() . '</a>';
	}
}
/*
 * восстанавливаем глобальную переменную $post
 */
wp_reset_postdata();

В этом примере мы не трогаем глобальную переменную $post, а также задаем параметры класса в виде строки:

$q = new WP_Query("posts_per_page=5&orderby=comment_count");
if($q->have_posts()) {
	while($q->have_posts()){ $q->next_post();
		$post_id = $q->post->ID;
		echo '<a href="' . get_permalink($post_id) . '">' . get_the_title($post_id) . '</a>';
	}
}

Дальше пойдет описание параметров, ещё есть отдельный пост про методы и свойства.

Параметры класса WP_Query (а также функций query_posts и get_posts)

Авторство

author
(целое число) id автора.

author_name
(строка) «user_nicename» автора, обычно совпадает с логином.

Можно вывести посты сразу нескольких авторов:

$query = new WP_Query( 'author=4,5,8,15' );

Рубрики

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

$q = new WP_Query("cat=-2,-12,-35");

category_name
(строка) ярлык категории (записи из подкатегорий тоже будут учитываться).

$q = new WP_Query("category_name=news,wordpress");

category__and
(массив) отобразить записи, содержащиеся сразу в нескольких категориях одновременно. В массиве указываются ID этих категорий.

$q = new WP_Query(array('category__and' => array(1,4)));

category__in
(массив) отобразить записи, содержащиеся в одной из перечисленных категорий (нужно указать ID), отличается от cat тем, что записи из вложенных рубрик не учитываются.

category__not_in
(массив) исключить записи, содержащиеся в одной из перечисленных категорий.

Метки

tag
(строка) ярлык тега (метки). Можно указать несколько значений через запятую.

$q = new WP_Query("tag=html,css");

Если нужно, чтобы пост содержал каждую из меток, то их надо разделить знаком «+»

$q = new WP_Query("tag=html+css");

tag_id
(целое число) id метки.

$q = new WP_Query("tag_id=15");

tag__and
(массив) отобразить записи, содержащие каждую из этих меток.

$q = new WP_Query(array('tag__and' => array(2,7)));

tag__in
(массив) отобразить записи, содержащие хотя бы одну из перечисленных меток (нужно указать их id).

tag__not_in
(массив) исключить записи, содержащие хотя бы одну из перечисленных меток.

tag_slug__and
(массив) аналогично tag__and, но только вместо id меток надо указать их ярлыки.

tag_slug__in
(массив) аналогично tag__in, но только вместо id меток надо указать ярлыки.

Таксономии

tax_query (доступна с версии 3.1)
(массив массивов) состоит из:

  • taxonomy (строка) — название таксономии,
  • field (строка) — производить выбор по "id" или "slug",
  • terms (целое|строка|массив) — ID(ы) или ярлык(и) таксономии, в зависимости от предыдущего параметра,
  • include_children (логическое) — нужно ли включить вложенные таксономии (по умолчанию — true),
  • operator (строка) — описывает логическое взаимодействие между элементами массива в параметре terms, возможные значения:
    • IN — принадлежит хотя бы одной рубрике (по умолчанию),
    • AND — принадлежит каждой рубрике,
    • NOT IN — не принадлежит ни одной из указанных рубрик;

relation
(строка) описывает логическое взаимодействие между массивами, содержащимися в tax_query, параметры такие же, как и у operator.

Простой пример — будут выведены все статьи из категории GTA Vice City:

$q = new WP_Query( array( 'game' => 'gta_vice_city' ) );

Тот же самый пример с использованием tax_query:

$params = array(
	'tax_query' => array(
		array(
			'taxonomy' => 'game',
			'field' => 'slug',
			'terms' => 'gta_vice_city'
		)
	)
);
$query = new WP_Query( $params );

Дальше идут примеры с использованием нескольких таксономий — в данном случае «game» и «platform».

Простой вариант — выводим посты про GTA Vice City для платформы PC:

$query = new WP_Query( array( 'game' => 'gta_vice_city', 'platform' => 'pc' ) );

Теперь читайте внимательно — выводим посты про GTA III, а также посты про GTA Vice City, при этом исключая платформы с указанными ID:

$args = array(
	'tax_query' => array(
		'relation' => 'AND',
		array(
			'taxonomy' => 'game',
			'field' => 'slug',
			'terms' => array( 'gta_3', 'gta_vice_city' )
		),
		array(
			'taxonomy' => 'platform',
			'field' => 'id',
			'terms' => array( 5, 8 ), // исключаем две платформы, например Android и iOS
			'operator' => 'NOT IN'
		)
	)
);
$query = new WP_Query( $args );

Возможно в этом не сразу удастся разобраться, но на самом деле всё очень просто.

Записи

p
(целое число) ID записи.

$q = new WP_Query("p=123");

name
(строка) ярлык записи.

page_id
(целое число) ID страницы.

Следующие два примера эквивалентны друг другу:

$q = new WP_Query("page_id=2");
$q = new WP_Query("p=2&post_type=page");

pagename
(строка) ярлык страницы.

post_parent
(целое число) вывести все страницы, для которых родительской является страница с указанным id.

$q = new WP_Query("post_parent=9");

Также вложенные страницы можно отобразить при помощи ярлыков, сначала указываете ярлык родительской страницы, потом «/», а потом ярлык вложенной страницы.

$q = new WP_Query("pagename=about-wordpress/functions");

post__in
(массив) какие записи следует включить в цикл.

$q = new WP_Query(array('post__in' => array(3,7,14,15,21)));

post__not_in
(массив) какие записи не следует включать.

Прилепленные записи

Если вам нужно, чтобы какой-то пост (или посты) выводился перед всеми остальными записями, на странице его редактирования вы можете отметить следующую опцию:

прилепить пост на главную страницу

ignore_sticky_posts
(логическое) игнорировать приоритет прилепленных постов, по умолчанию — 0 (доступен с версии 3.1).

А теперь выведем все посты, которые были отмечены, как прилепленные. В этом случае, конечно же, можно отключить (а можно и не отключать) их повышенный приоритет перед другими постами:

$params = array(
	'posts_per_page' => -1,
	'post__in'  => get_option( 'sticky_posts' ), // массив, содержащий IDы всех прилепленных постов
	'ignore_sticky_posts' => 1
);
 
$q = new WP_Query( $params );

Типы постов

post_type
(строка|массив) тип поста.

  • post — записи, посты (по умолчанию),
  • page — страницы,
  • attachment — вложения, файлы
  • revision — редакции (не черновики),
  • any — все, кроме редакций и постов с параметром exclude_from_search=true,
  • созданный вами тип поста, например game;

Выводим все записи и страницы на блоге, количество выведенных элементов будет зависеть от настроек в админке:

$q = new WP_Query( array( 'post_type' => array( 'post', 'page' ) ) );

Выводим «книги»:

$q = new WP_Query( 'post_type=book' );

Статусы постов

post_status
(строка) статус записи.

  • publish — опубликованный пост или страница (по умолчанию),
  • pending — ожидает модерации,
  • draft — черновик,
  • auto-draft — только что созданный пост, без контента,
  • future — пост, который запланирован на публикацию в будущем,
  • private — невидимый для незарегистрированных пользователей,
  • inherit — необходимо указывать при выводе редакций или вложений (либо any),
  • trash — то, что находится в корзине (начиная с версии 2.9),
  • any — все, кроме постов с параметром exclude_from_search=true;

Если вам нужно вывести вложения, то не забудьте указать параметр статуса равным any или inherit:

$q = new WP_Query("post_status=any&post_type=attachment");

Форматы записей

Форматы записей выводятся по типу таксономий, например:

$params = array(
	'tax_query' => array( // про tax_query написано чуть выще
		array(
			'taxonomy' => 'post_format', // таксономия форматов
			'field'    => 'slug', // значение этого поля обязательно slug
			'terms'    => array( 'post-format-quote' ), // название одного или нескольких форматов в виде массива
		),
	),
);
$q = new WP_Query( $params );

Параметры постраничной навигации и количества

posts_per_page (доступен с версии 2.1)
(целое число) количество записей, отображаемых на одной странице;

Отобразить сразу все записи:

$q = new WP_Query("posts_per_page=-1");

nopaging
(логическое) запретить постраничную навигацию.

  • false — нет (по умолчанию)
  • true — да
$q = new WP_Query("nopaging=true"); // вывести все посты

paged
(целое число) отобразить записи, находящиеся на определенной странице,

offset
(целое число) количество записей, которые нужно пропустить. Если вы указываете значение для offset, то параметр paged будет проигнорирован!

$q = new WP_Query("offset=3"); // начинаем с 4-й записи

Параметры сортировки

orderby
(строка) сортировать по:

  • none — не сортировать,
  • ID — по id,
  • author — по имени автора,
  • title — по заголовку,
  • date — по дате публикации (по умолчанию),
  • modified — по дате последнего изменения,
  • parent — по id родительских страниц,
  • rand — случайным образом,
  • comment_count — по количеству комментариев (начиная с версии 2.9),
  • menu_order — сортировать по указанному порядку, по умолчанию в WordPress уже есть инструменты для установки собственного порядка страниц и вложений:
    указываем порядковый номер в метабоксе атрибутов страницы
    сортировка изображений, вложенных в пост
  • meta_value — по значению мета-данных поста (произвольного поля), при этом в цикле должен присутствовать параметр meta_key; используется только для сортировки строковых значений,
  • meta_value_num — по значению произвольного поля, для сортировки чисел,
  • post__in — использовать порядок, заданный в параметре post__in (с версии 3.5);

order
(строка) порядок сортировки.

  • ASC — по возрастанию (1, 2, 3; a, b, c),
  • DESC — по убыванию (3, 2, 1; c, b, a) (по умолчанию);

Дата и время

year
(целое число) год публикации,

monthnum
(целое число) месяц публикации (от 1 до 12),

w
(целое число) неделя публикации (от 0 до 53),

day
(целое число) день публикации (от 1 до 31),

hour
(целое число) час (от 0 до 23),

minute
(целое число) минута (от 0 до 60),

second
(целое число) секунда (от 0 до 60);

Все посты, опубликованные 20 декабря 2011:

$q = new WP_Query("year=2011monthnum=12&day=20");

Читайте более подробно о том, как вывести посты, опубликованные между двумя датами.

В WP 3.7 появился также очень удобный date_query.

Произвольные поля

Про произвольные поля читайте подробнее тут.

meta_key
(строка) название произвольного поля,

meta_value
(строка) значение произвольного поля,

meta_value_num
(число) значение произвольного поля,

meta_compare
(строка) оператор сопоставления значений произвольного поля, может принимать значения: '!=', '>', '>=', '<' или '<='. По умолчанию '=';

Отобразить все записи, в которых значение произвольного поля color равно blue.

$q = new WP_Query("meta_key=color&meta_value=blue");

Отобразить записи, в которых значение любого произвольного поля равно blue.

$q = new WP_Query("meta_value=blue");

А в этом варианте выводятся посты, у которых значение произвольного поля color не равно red.

$q = new WP_Query(array( 'meta_key' => 'color', 'meta_value' => 'red', 'meta_compare' => '!=' ));

Начиная с версии WordPress 3.1 параметры произвольных полей можно задавать через массив meta_query.

meta_query
(массив массивов) состоит из:

  • key (строка) — название произвольного поля,
  • value (строка|массив) — значение произвольного поля (параметр может быть опущен, если для сравнения используются операторы 'EXISTS' или 'NOT EXISTS' — доступны, начиная с 3.5 )
  • compare (строка) — оператор сопоставления, возможные значения: '=' (по умолчанию), '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' и 'NOT EXISTS',
  • type (строка) — тип данных значения произвольного поля, например 'NUMERIC', 'BINARY', 'CHAR' (по умолчанию), 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'.

relation
(строка) описывает логическое взаимодействие между массивами, содержащимися в meta_query.

В этом примере выводим анкеты людей, которые разбираются в WordPress или DLE, и им от 18 до 25 лет.

$args = array(
	'post_type' => 'resume',
	'meta_query' => array(
		'relation' => 'AND',
		array(
			'key' => 'cms',
			'value' => array( 'wordpress', 'dle' ),
			'compare' => 'IN'
		),
		array(
			'key' => 'age',
			'value' => array( 18, 25 ),
			'type' => 'numeric',
			'compare' => 'BETWEEN'
		)
	)
);
$query = new WP_Query( $args );

По meta_query конечно можно ещё кучу примеров написать, если у вас есть вопросы или что-то не работает — спрашивайте в комментариях, отвечу всем.

Другие параметры

fields
(строка) в каком виде выводить результат:

  • ids — массив составленный из ID элементов (постов), кстати посмотреть на вид самих массивов вы можете через функцию print_r() или заглянув в пост про get_terms(),
  • id=>parent — ассоциативный массив состоящих из ID элементов и ID их родителей, при этом, если родительского элемента не существует, то возвращается 0, пример:
    $q = new WP_Query('post_type=page&posts_per_page=-1&fields=id=>parent');
    print_r($q);
    /*
    Результат примерно такой:
    Array ( [1] => 0 [4] => 0 [11] => 4 )
    */
  • по умолчанию выводится массив объектов постов;

s
(строка) поиск постов по указанному ключевому слову, например:

$q = new WP_Query( 's=wordpress' );

Аналог WP_Query для WordPress Multisite

Допустим с WP_Query мы разобрались. А что, если вам нужен точно такой же функционал, но только чтобы он работал для всех постов сети WordPress Multisite?

Чтобы можно было искать по всем постам, выводить последние несколько опубликованных записей со всей сети в одном цикле?

В таком случае рекомендую взглянуть на мой плагин.

Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

Комментарии 153

  • c01nd01r2 января 2012 в 11:01 #

    Отличное описание функции! В закладки.
    Спасибо!

  • Виталька6 февраля 2012 в 20:02 #

    +1 в закладки - нашел то, что искал;) Спасиб!

  • B.G.3 июля 2012 в 15:07 #

    Не совсем по теме, но от души, ибо 4 часа решал свою проблему, решил, и теперь надо куда-то излить! Нашел Вашу отличную статью после того как пытался понять почему плагин Platinum SEO неправильно работает на моей теме. Бился, бился.. Потом вспомнил мудрое: "Если прибор никак не работает, попробуйте прочитать инструкцию". На сайте разработчика плагина нашел, что если в теме используется query_posts, то могут возникнуть проблемы, и лучше заменить его на WP_Query...
    Может это кому-то поможет...

  • Максим12 декабря 2012 в 19:12 #

    Спасибо Миша. Съэкономил кучу времени. +1 в закладки!!!

  • Евгений27 февраля 2013 в 20:02 #

    Есть вопрос, если делать фильтры на странице или в рубрике, то перестает работать постраничная навигация. Это только у меня, или все же с этим проблема? Как думаешь Миш в чем может быть причина?

  • Alina14 марта 2013 в 16:03 #

    вопрос по поиску произвольных полей для ВП 3.5

    не могу заставить вп показывать посты через поиск по произвольным полям.

    вот например

    все записи с людьми которые разбираются в вордпрессе
    силка - www.site.ru/cms=word

    или люди разбираются в вп и которым больше или ровно 20 лет
    силка - www.site.ru/cms=word&age>=20

    а вп кидает на главную и все.

    может я неправильно прописываю что то в файле функций или файле поиска?

  • Олег15 марта 2013 в 22:03 #

    Михаил, здравствуйте.
    Возможно, мой вопрос немного не в тему, но попал сюда из Google, в котором искал ответ на свой вопрос.
    А вопрос такой:
    1. Есть custom_field, значение которого формируется посетителем.
    Например, посетитель указывает название компании.
    2. Это поле выводится на странице просмотра данных, введенных посетителем. В этой секции видно имя компании.
    Задача - сделать возможность поиска всех записей, которые содержат одно и то же значение для этого пользовательского поля.
    Написал так:

    <a href="<?php echo (get_post_meta($post->ID, 'wtf_comname', true)); ?>">Все вакансии компании</a>

    Ссылка выводится, но не работает.
    Не подскажите, где ошибка и где искать?

    • Миша16 марта 2013 в 06:03 #

      Доброе утро)

      сделать возможность поиска всех записей, которые содержат одно и то же значение для этого пользовательского поля

      $value = 'Company'; // значение произвольного поля
      $q = new WP_Query("meta_key=wtf_comname&meta_value=$value");
  • Олег16 марта 2013 в 11:03 #

    Спасибо за оперативный ответ. Но.
    Файл, в котором стоит тег A и формируется ссылка на просмотр записей по конкретной компании - выводит описание заявки на вакансию, в которой каждый раз - новая компания.
    Одна и та же компания может несколько раз размещать вакансии, в течение, например, года.
    Вопрос:
    Обработка запроса на поиск всех записей через WP_Query - это конечно удачное решение, но я пока не могу сообразить, каким образом мне воткнуть этот запрос и куда именно в файле single-job.php, т.к. именно такой файл отвечает за вывод пользовательских типов записей - job, с произвольными полями, которые относятся к этому типу.
    Сейчас ссылка формируется так:
    http://localhost/jobmanager/item/Кафе 'Ромашка'
    Мне кажется, что проблема в rewrite, но могу ошибаться.
    Возможно, что нужно иное решение - пользовательская таксономия.

    • Миша16 марта 2013 в 16:03 #

      я возможно не до конца догоняю, в общем как я это понимаю:
      компания - произвольное поле
      вакансия - произвольный тип записи
      нужен поиск всех вакансий для конкретной компании?
      если я всё правильно понял, тогда:
      Первое
      да, конечно, компании через таксономии будет лучше и удобнее
      Второе
      если всё же делать через произвольные поля, то код запроса будет примерно такой:

      $value = 'Company'; // значение произвольного поля
      $q = new WP_Query("post_type=job&meta_key=wtf_comname&meta_value=$value");
    • Миша16 марта 2013 в 16:03 #

      то есть тип записей нужно указывать всегда, т.к по умолчанию стоит post, я сам пару раз на этом моменте спотыкался)

  • Олег16 марта 2013 в 16:03 #

    Нужен не просто поиск.
    Есть файл single-job.php, в котором выводится описание вакансии.
    В этом описании есть название компании, добавленное через произвольное поле.
    Я хочу это название сделать кликабельным, чтобы посетитель мог сразу нажатием на название компании, открыть список всех вакансий этой компании.
    Ваш вариант требует добавления WP_Query, т.е. запроса, а мне нужен вариант обычного тега A, в который я вставлю что-то типа:

    Ссылку вижу такой:
    localhost/jobmanager/item/кафе 'Ромашка'
    На сайте есть две записи вакансий этой компании (кафе), но при клике на названии у меня открывается 404.php
    Мне кажется, что рыться надо в rewrite, и иначе писать код который выше.
    Был бы рад услышать ваши варианты)
    Спасибо все равно, что отвечаете в выходной день.
    Я перерыл весь дотком и рунет - все, что пишут о meta_key и meta_value, но все - такая ерунда, всякие там картинки и Привет всем! через произвольные поля, ничего серьезного, никто глубоко не описывает ни одного примера.
    В Доках WordPress - ни одного реального примера с моим вариантом.
    А глубже, сори, с пхп я не силен.

  • Олег16 марта 2013 в 16:03 #

    Извините, что-то с кодом в комментарии:

    <a href="<?php
        $my_meta = get_post_custom_values( 'wtf_comname', $ID );
        if ( $my_meta) {
            foreach ( $my_meta as $val_key => $val_val ) echo $val_val;
        }
    ?>">Все вакансии компании</a>
    • Миша16 марта 2013 в 19:03 #

      короче, я 100% рекомендую делать через таксономии, через произвольные поля вы так запаритесь)

      в том случае составления ссылки нужно будет создавать шаблон страницы и там уже в содержимом что-нибудь с WP_Query в зависимости от параметров $_GET

      да, у меня тут в комментах кнопки раньше были для кода в старом дизайне, в новом пока что не нашел, куда их приткнуть, попробуйте через:

      <pre lang="php">
  • Олег16 марта 2013 в 19:03 #

    Я только что опубликовал предложение к спецам на форум русского wordpress - не хотите попробовать за деньги помочь решить проблему.
    Похоже, я уперся и вряд ли найду решение.
    Ссылка на ветку форума - http://ru.forums.wordpress.org/topic/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA-%D0%BF%D0%BE-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8E-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%BE%D0%BB%D1%8F-1?replies=1#post-111054

  • Олег16 марта 2013 в 19:03 #

    В любом случае - спасибо вам за советы.

    • Миша16 марта 2013 в 19:03 #

      ну а что с созданием таксономии новой? почему вас этот вариант не устраивает? там замутить ее 5 минут

  • Олег16 марта 2013 в 20:03 #

    Я не писал - не устраивает)
    В теме есть таксономия для custom post - job, надо ее или дорабатывать, или менять custom field для названия компании...
    Я уже запутался и не так много знаний, чтобы сделать как мне надо.

  • Dyukan20 марта 2013 в 18:03 #

    Миша, проблему решили?

  • Александр21 марта 2013 в 11:03 #

    Доброго времени суток всем! Подскажите пожалуйста, мне нужно вывести в случайном порядке только (!) фото с постов в определённой рубрике, многое пробовал, не получается. Или как вариант, все прикриплённые фото к записи, но параметр, отвечающий за прикрепленость фото к записи я не нашёл.

    • Миша21 марта 2013 в 21:03 #

      Добрый вечер!
      сначала выводим посты через WP_Query и потом, внутри тела цикла, создаем ещё один цикл, в котором выводим фотки к каждому посту. могу расписать, как это будет в коде, если нужно.

  • Сергей1 апреля 2013 в 14:04 #

    Приветствую!
    А у меня такая проблем.
    Есть две таблицы, в одной из которых юзеры, а в другой связь id юзера и категории, к которой он относится (категорий может быть несколько). У меня есть запрос, который уже содержит массив нужных записей.
    Вопрос - как вывести этот массив при помощи конструкции have_posts()?

    • Миша2 апреля 2013 в 06:04 #

      Привет!
      have_posts() относится именно к классу WP_Query, это метод класса, чуть более подробно тут.
      то есть я считаю, что из этой затеи ничего не выйдет (или я чего-то недопонимаю).

  • Олег16 апреля 2013 в 19:04 #

    Михаил, добрый день.
    Я все продолжаю "биться" с проблемой, которую озвучивал в этом топике, сори, что не в тему.
    Хочу попросить вас о помощи, не бесплатной, конечно.
    Столкнулся с проблемой, которую сам не решу, уже точно.
    Если коротко, то выглядит таким образом:
    1. Есть custom_posts_type = 'job'
    2. Я обсудив с вами, не нашел другого решения как "подцепить" для поиска всех записей "вакансии компании" через метки - tag.
    3. Прикрутил tag к custom_posts_type, чтобы отображались в редакторе.
    4. Не мог никак запустить отображение списка все вакансии компании. Нашел на Доткоме функцию - поиск по меткам произвольного типа записей, добавил функцию в файл functions.php темы. Работает.
    НО!
    Обнаружил, что при открытии архива записей 'job' по одной компании у меня пропадает навигационное меню.
    Методом "тыка" определил, что добавленная мной функция поиска по меткам произвольного типа записей 'job' при ее удалении меню не пропадает, но тогда открывается страница 404 (как в общем, и было до этой функции).
    Сама функция во мне не вызывает никаких эмоций, т.к. мои знания PHP ниже чем хотелось бы :)

    Могу дать доступ на тестовый поддомен, где поставил эту тему. Опишу - где и что дописал, в каких файлах.
    Нужна реальная помощь, готов оплатить ваш труд (WM или другой способ на ваше усмотрение).
    Комментарий этот можете удалить, просто не стал писать в Контакты, чтобы вспомнили по комментариям наше общение.
    Заранее спасибо, если не откажете.

  • Олег16 апреля 2013 в 20:04 #

    Туплю, наверное, вечер сказывается))

  • Rafael21 апреля 2013 в 12:04 #

    Миша!
    Очень нравится Ваш блог, много полезной и нужной информации и на понятном языке.
    Прошу подсказки в моей небольшой проблеме. В конечном итоге мне надо сделать фильтр по трем параметрам одновременно. Первый параметр - это стандартный список категорий. Второй параметр - созданная новая функция create_country при помощи register_taxonomy (список стран), третий параметр - стандартные теги вордпресса (в данном случае диапазон цен, 0-100, 100-300, 300-600 и т.д.).
    В конечном итоге должно получиться как здесь http://putevka.uz/ru/ Только там нет выбора по тегам, а мне надо его добавить.
    По отдельности как слепить эти три фильтра я додумался как, но у меня не хватает мозгов, как объединить эти три фильтра в один, что бы пользователь выбрав из трех выпадающих списков нужные параметры поиска, получил в итоге список страниц(записей). Буду благодарен за Ваши подсказки!

    • Миша22 апреля 2013 в 06:04 #

      Добрый день)
      спасибо,
      ну я так понимаю, это нужно объединить параметр рубрик и два параметра произвольных полей?
      типо этого:

      $args = array(
      	'cat' => $category,
      	'meta_query' => array(
      		'relation' => 'AND',
      		array(
      			'key' => 'param_3', // второй параметр я не совсем понял
      			'value' => $value_3,
      		),
      		array(
      			'key' => 'param_3', // диапазон цен
      			'value' => $value_3,
      		)
      	)
      );
      $query = new WP_Query( $args );
      • Rafael22 апреля 2013 в 10:04 #

        Да, один параметр рубрик, второй - это стандартные вордпрессовские теги (если они называются как произвольные поля, значит это так), а третий - созданная новая таксономия, точь в точь как здесь
        http://n-wp.ru/17217
        там вверху страницы видно как в админке появился список стран (путем добавления новой функции в файл functions.php).

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

        Спасибо, что помогаете советами, пусть Вам сопутствует удача!

        • Миша23 апреля 2013 в 08:04 #

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

          ну первый выпадающий список (категории) отдельно через цикл foreach и функцию например get_terms() или get_categories()

          а другие поля, например диапазон цен, там вообще без цикла, прост тупо эти диапазоны можно забить в HTML, я полагаю.

          • Rafael25 апреля 2013 в 11:04 #

            Миша!
            Чтоб было точно как здесь http://putevka.uz/ru/ (только с тремя параметрами поиска)
            что лучше использовать
            wp_query
            или
            query_posts
            ?

            • Миша25 апреля 2013 в 12:04 #

              если на странице с результатами будет присутствовать постраничная навигация, то лучше query_posts наверное, если нет - то WP_Query

              • Rafael25 апреля 2013 в 14:04 #

                Спасибо, Миша!
                Вот здесь чувак все подробно расписал то, что мне надо.
                Может кому пригодится.
                http://fearlessflyer.com/2012/10/how-to-create-an-advanced-search-form-for-wordpress/

  • adarka23 апреля 2013 в 22:04 #

    Миша, помогите! правильно ли я думаю, что с помощью wp query я могу создать поиск по нескольким кастом-полям одновременно? пыталась настроить плагин Select WP Custom Search - но он старый и как то не получилось у меня с ним. Стоит задача искать по нескольким значениям полей одновременно (параметры заданы custom fields'ами)
    заранее спасибо

  • Rafael10 мая 2013 в 14:05 #

    Михаил!
    У меня такая проблема. Мне надо вывести все страницы, у которых есть произвольные поля (созданные плагином "Magic Fields") чекбоксы.
    Причем, условие такое. Надо вывести все страницы, которые содержат любое количество отмеченных чекбоксов (хотя бы один), а количество проверяемых значений произвольных полей может быть или одно, или два, а может и три.
    Если я использую вот такой код, то все работает нормально

    $args = array(
    'post_type' => 'page',
    'meta_query' => array(
    array(
    'key' => $fieldss[0],
    'value' => 1,
    )
    )
    );

    А если я применяю это, то ничего не пахает

    $args = array(
    'post_type' => 'page',
    'meta_query' => array(
    'relation' => 'AND',
    array(
    'key' => $fieldss[0],
    'value' => 1,
    ),
    array(
    'key' => $fieldss[1],
    'value' => 1,
    ),
    array(
    'key' => $fieldss[2],
    'value' => 1,
    )
    )
    );

    Причем, у переменной $fieldss может быть одно, два или три значения, но не больше.

    • Миша11 мая 2013 в 19:05 #

      ну стоит условие AND же, это значит что не ИЛИ, а И, т.е. все три чекбокса должны быть отмечены, иначе ничего не выведется.

  • Rafael12 мая 2013 в 20:05 #

    Действительно, вот это дела, на носу очков не заметил. Бывает хуже..., но ..... реже.
    Спасибо!

  • Елена20 мая 2013 в 04:05 #

    Здравствуйте Михаил. Нужна Ваша помощь. Хочу сделать виджет для вывода постов с определенным IDом.
    Подскажите пожалуйста какие параметры необходимо прописать в этой части кода, чтобы ID необходимых записей можно было указывать в админке, в настройках виджета.
    Вот кусочек кода
    /*
    * в массиве задаем все необходимые параметры (более подробно о параметрах чуть ниже)
    */

    $args = array(

    'post__in' => array(918)

    );

    Заранее благодарна

    • Миша20 мая 2013 в 14:05 #

      Добрый день) предположим ID указанных постов 5 и 15, тогда параметры будут примерно следующими:

      $args = array(
      	'posts_per_page' => -1, // это важно прописать тоже
      	'post__in' => array(5,15)
      );

      Обращаю внимание, что по умолчанию это работает только для записей(постов), для других типов надо будет добавить параметр post_type

      • Елена20 мая 2013 в 19:05 #

        Тогда получается, что для добавления какой-либо новой записи мне необходимо будет открывать этот код и вписывать ID записи. Мне это не сильно удобно, поэтому хотела сделать виджет и вписывать эти ID записей через запятую в настройках виджета. Я не знаю как правильно задать условие вместо этой строчки 'post__in' => array(5,15)Для того чтобы обрабатывались параметры заданные в настройках((

        • Миша21 мая 2013 в 06:05 #

          нет конечно, не надо открывтаь код каждый раз :)
          тогда примерно так

          'post__in' => $posts // это массив, содержащий посты, заполненный в виджете
          • Елена21 мая 2013 в 23:05 #

            В этом случаи у меня выводятся все статьи а не те, которые я указываю.
            Вот моя форма

            <label for="get_field_id('$posts'); ?>"> <input type="text" value="" name="get_field_name('$posts'); ?>" id="get_field_id('$posts'); ?>" class="widefat" />

            посмотрите пожалуйста скорее всего я что-то неправильно делаю. Спасибо.

          • Елена21 мая 2013 в 23:05 #

            <label for="<?php echo $this->get_field_id('$posts'); ?>"><?php _e( 'Включить показ записей:' ); ?></label> <input type="text" value="<?php echo $posts; ?>" name="<?php echo $this->get_field_name('$posts'); ?>" id="<?php echo $this->get_field_id('$posts'); ?>" class="widefat" />

            • Миша22 мая 2013 в 21:05 #

              надо бы мне где-то под формой комментов подписать или кнопки добавить - для вставки кода можно использовать конструкцию

              <pre lang="php">

              IDы постов должны быть в виде массива)

              • Shugarev Sergey23 мая 2013 в 09:05 #

                Какую функцию использовать для вставки кода, чтобы он выглядел как код а не как текст?

                • Миша23 мая 2013 в 21:05 #

                  добавил небольшое пояснение под формой комментария) проще добавить какие-нибудь кнопки, согласен, надо подумать над этим

                  • Shugarev Sergey23 мая 2013 в 21:05 #

                    Спасибо. А то я перепробовал несколько вариантов куда вставить код и ни один не оказался правильным.

  • Shugarev Sergey22 мая 2013 в 10:05 #

    Очень понравился Ваш блог
    Почему код выводит только последние 10 постов?

    1
    2
    3
    4
    5
    6
    7
    
    $q = new WP_Query('post_parent=9&post_type=page');
    	if($q->have_posts()) {
    		while($q->have_posts()){ $q1->next_post();
    			$post_id = $q->post->ID;
    			echo '<a href="' . get_permalink($post_id) . '">' . get_the_title($post_id) . '</a>';
    		}
    	}
    • Миша22 мая 2013 в 21:05 #

      рекомендую внимательно посмотреть на строчку 3

      • Shugarev Sergey23 мая 2013 в 09:05 #

        Спасибо Миша. В третей строчке я единичку убрал. Проблема заключалась в том, что нужно было написать

        $q = new WP_Query('post_parent=9&post_type=page&posts_per_page=-1');

        я думал, что posts_per_page=-1 по умолчанию..

  • Максим5 июня 2013 в 21:06 #

    Как можно сгруппировать результат по таксоновии если пользуюсь функцией wp_query.

    • Миша6 июня 2013 в 12:06 #

      что значит сгруппировать? конкретнее

      • Максим6 июня 2013 в 12:06 #

        Смотри когда выводятся посты есть поле в котором есть повторяющиеся значения и надо чтобы в этом поле были тоько уникальные значения, а остальные отсеивались, как в языке SQL параметр GROUP BY.

        • Миша7 июня 2013 в 06:06 #

          ну ставишь параметр meta_key (или key) и его значение meta_value (value) и получается выведутся все посты с уникальным значением этого параметра.

  • Салат24 июля 2013 в 00:07 #

    Не получается делать выборку по нескольким тегам сразу.
    Запросы по типу ?tag=tag1+tag2 не работают
    Как решить?
    С учетом того что имена будут прогоняться через чекбоксы.

  • Дарья29 июля 2013 в 15:07 #

    Добрый день! Спасибо за отличную статью. Скажите, пожалуйста, а возможно ли с помощью WP_Query сделать такое: вывести список постов из той же категории и с тем же значением произвольного поля (одновременно) — без указания конкретного названия категории и поля? (чтобы не создавать много-много сайдбаров — а один универсальный). Спасибо!

    • Миша31 июля 2013 в 21:07 #

      Доброго времени суток! да, можно) что-то в этом духе:

      $query = new WP_Query("cat=5&meta_key=название&meta_value=значение");
  • Александр13 августа 2013 в 19:08 #

    У меня такая проблема:
    на сайте стоит classipress. мне нужно сделать вывод по регионам.
    делаю так:

    $args = array(
    	'meta_query' => array('meta_key' => 'cp_state', 'meta_value' => $_COOKIE['region_name'])
    );
    $q = new WP_Query( $args );

    В итоге выводит одно и то же при любом значении $_COOKIE['region_name'].
    Выводится даже то, где нет этих полей. А мне нужно чтоб только те объявления, в которых поле cp_state равно $_COOKIE['region_name']
    Подскажите, как правильно составить запрос.
    Спасибо.

    • Миша13 августа 2013 в 20:08 #

      правильно так:

      $args = array('meta_query' => array('key' => 'cp_state', 'value' => $_COOKIE['region_name'] ));
      $q = new WP_Query( $args );

      или так:

      $args = array('meta_key' => 'cp_state', 'meta_value' => $_COOKIE['region_name'] );
      $q = new WP_Query( $args );
    • Миша13 августа 2013 в 20:08 #

      также рекомендую набросать такие параметры, как posts_per_page и post_type.

  • Александр13 августа 2013 в 23:08 #

    сделал так:

    $args = array(
    	'meta_query' => array(
    		'key' => 'cp_state', 
    		'value' => $_COOKIE['region_name'] 
    	),
    	'post_type' =>'ad_listing'
    );
    print_r($args);
    $q = new WP_Query( $args );

    Однако выводит все записи по все регионам, будь там Москва или Санкт-Петербург.

  • Александр14 августа 2013 в 15:08 #

    Точно, много раз уже проверил перепроверил.

    • Миша15 августа 2013 в 09:08 #

      ну что могу сказать, сам по себе код правильный, возможно ошибка где-то еще.

  • Дмитрий20 августа 2013 в 22:08 #

    Спасибо за статью, очень полезная! При обучении возник вопрос. Допустим есть в базе два произвольных поля age1 и age2 (для определенных страниц), с помощью формы передается значение которое должно вписываться в диапазон age1-age2. Пробовал сделать что то типа:

    ...
    array(
    			'key' => 'age1',
    			'value' => $age_value,
    			'compare' => '>='
    		),
    array(
    			'key' => 'age2',
    			'value' => $age_value,
    			'compare' => '<=';
    		),
    ...

    Но трюк не удался, подскажите в каком направлении копать, спасибо!

    • Миша30 августа 2013 в 11:08 #

      Пожалуйста, Дмитрий)
      сорри за долгий ответ - был в отъезде.
      а если указать в каждом массиве тип данных в виде:

      'type'=>'NUMERIC'
  • adward26 сентября 2013 в 17:09 #

    Уже несколько дней бьюсь над вот такой проблемой.
    у меня магазин на woocommerce
    в общем списке товаров выводятся все товары, которые были добавлены оператором в магазин. Но выяснилась необычная хотелка - клиент требует не выводить товары, которые входят в определённые коллекции. Порывшись, я выяснил, что у товаров, которые входят в коллекцию, в БД в поле post_parent указан ID родителя, тогда как у обыкновенных товаров там прописан ноль.

    для того, чтобы исключить товары мне пришлось понять сущности многих хуков, однако же решения нет

    к примеру вот этот хук:

    add_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
    function custom_pre_get_posts_query( $q ) {
        if ( ! $q->is_main_query() ) return;
        if ( ! $q->is_post_type_archive() ) return;
     
        if ( ! is_admin() && is_shop() ) {
            $q->set( 'tax_query', array(array(
                'taxonomy' => 'product_cat',
                'field' => 'slug',
                'terms' => array( 'knives' ), // Don't display products in the knives category on the shop page
                'operator' => 'NOT IN'
            )));
     
        }
        remove_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
    }

    Запрещает вывод товаров из определённой категории.
    Подскажите plz, как прописать таким образом, чтобы выводилось только то, что имеет значение post_parent>0

    спасибо.

    • Миша26 сентября 2013 в 19:09 #

      в общем списке товаров выводятся все товары

      что подразумевается под общим списком?

      • adward26 сентября 2013 в 19:09 #

        нуу, как я понимаю, некий шорткод, который выводит список товаров. Это те же посты, имеющие признак товара.

        как правило, разбито на страницы. вот, смотрите
        http://mebelopt-kazan.ru/shop/
        WooCommerce может выводить весь список товаров. т.е. товары - это своеобразные посты...

        • Миша26 сентября 2013 в 20:09 #

          если шорткод, то надо смотреть непосредственно в нём, для чего хук?
          или нужна возможность регулярного обновления woocommerce?
          даже в этом случае у плагина достаточно собственных хуков

          • adward26 сентября 2013 в 22:09 #

            Ну, вот один из них я и привёл комментом выше.
            код, который можно прописать в functions.php
            только он исключает определённую категорию из вывода, а мне нужно исключить только дочерние из вывода.

          • adward26 сентября 2013 в 23:09 #

            вопрос в том, можно ли с помощью

            $q->set( 'tax_query', array(array(
                        'taxonomy' => 'product_cat',
                        'field' => 'slug',
                        'terms' => array( 'knives' ), // Don't display products in the knives category on the shop page
                        'operator' => 'NOT IN'
                    )));

            ограничить вывод товаров по признаку post_parent>0 ...

  • Евгений23 ноября 2013 в 11:11 #

    Огромное спасибо за статью! Только я не смог разобраться как реализовать свою затею…
    Я хочу чередовать оформление постов на главной (и в категориях) таким образом:
    1 статья шириной во всю ширину, потом 3 статьи маленькие, все в ряд, потом опять широкая, потом 3 маленьких… То есть каждый n-й пост оформлять подругому… Такое можно сделать?
    Заранее спасибо!)

  • Евгений23 ноября 2013 в 22:11 #

    Спасибо, не сильно мне это помогло))
    Нашел другие статьи, но там везде практически добавляется какое то слово к классу записи, и уже оформлением класса играются... а мне надо немного по другому, там кроме оформления и элементы меняются...
    Сечас сделал что первая запись широкая, остальные маленькие, это реализовано двумя циклами:

    вывод статьи

    и дальше остальные

    блаблабла

    Вот мне именно так и надо, чтобы разные данные можно было вывести а не просто ширину поменять... Но чтобы чередовать, 1 статья широкая с одним набором данных, 3 (или 6) маленьких с другим набором данных, и по кругу, с бесконечной прокруткой))...

  • Евгений23 ноября 2013 в 23:11 #

    блин, щас код вставлю

     
    <section class="articles" id="content">
     
    <?php
    query_posts('showposts=1');
    $ids = array();
    while (have_posts()) : the_post();
    $ids[] = get_the_ID(); ?>
    		<article class="articles_itemfull">
    			<a href="<?php the_permalink(); ?>" class="articles_img_link" rel="bookmark"><?php the_post_thumbnail ('post-full'); ?></a>
    			<div class="inform"><span class="cat"><?php the_category(', ') ?></span><?php the_time('jS F') ?></div>
    			<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></h2>
    		</article>
    		<div style="clear: both;"></div>
    <?php endwhile; ?>
     
     
    <?php
    query_posts(array('post__not_in' => $ids));
    while (have_posts()) : the_post(); ?>
    		<article class="articles_item">
    			<a href="<?php the_permalink(); ?>" class="articles_img_link" rel="bookmark"><?php the_post_thumbnail ('post-preview'); ?></a>
    			<div class="inform"><span class="cat"><?php the_category(', ') ?></span><?php the_time('jS F') ?></div>
    			<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></h2>
    		</article>
    <?php endwhile; ?>
     
     
    <div style="clear: both;"></div>
    </section>

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

    • Миша24 ноября 2013 в 10:11 #

      Если нужно сделать чтобы записи чередовались как 1 шировкая и 3 узких и делать для каждого участка записей отдельный цикл, то, если общее количество выводимых записей например 8, то будет уже 4 цикла на странице.

      Функцию query_posts() лучше использовать не более одного раза на странице.

      Во втором цикле не нашёл у вас ограничение на количество выводимых записей (в данном случае - 3, как я полагаю).

      Различия между этими двумя телами циклами только в CSS-классе и блоке clear:both, верно?

    • Миша24 ноября 2013 в 11:11 #

      Что вам нужно:
      1. один цикл через $q = new WP_Query,
      2. переменная-счетчик, которая будет увеличиваться на 1 каждый раз в цикле $i++,
      3. сравниваем эту переменную с $q->post_count каждый раз,
      4. три обтекаемых записи нужно делать не через float:left, а через display:inline-block, благодаря этому мы избавимся от лишних элементов с clear:both.

  • Евгений24 ноября 2013 в 11:11 #

    различия в оформлении блоков не только в float, а в том что вывожу разные миниатюры

    <?php the_post_thumbnail ('post-full'); ?>

    и

    <?php the_post_thumbnail ('post-preview'); ?>

    и планирую выводить еще разные данные (например в одном случае выводить дату, в другом нет и что-то еще), так что простым добавление слова к классу не обойтись. Пока не понял как сделать через i++, сейчас буду курить, вникать, очень сложно это для меня пока))
    Спасибо, Миша

    • Миша24 ноября 2013 в 16:11 #

      готовый код для восьми записей:

      <section><?php
      $q = new WP_Query('posts_per_page=8');
      $i=0;
      $posts_preview = array(2,3,4,6,7,8); // достаточно определить один из этих двух массивов
      $posts_full = array(1,5);
      while( $q->have_posts() ) : $q->the_post();
      	$i++;
      	?>
      	<article class="articles_item<?php if( in_array($i,$posts_full) ) echo 'full' ?>">
      		<a href="<?php the_permalink(); ?>" class="articles_img_link" rel="bookmark"><?php 
      			if( in_array($i,$posts_full) ) {
      				the_post_thumbnail ('post-full'); 
      			} elseif ( in_array($i,$posts_preview) ) {
      				the_post_thumbnail ('post-preview');
      			}
      			?></a>
      		<div class="inform"><span class="cat"><?php the_category(', ') ?></span><?php the_time('jS F') ?></div>
      		<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></h2>
      	</article>
      	<?php
      endwhile;
      wp_reset_postdata();
      ?></section>

      не тестировал, но в принципе должно работать)

  • Евгений24 ноября 2013 в 16:11 #

    Ого, вот это круто!! Щас буду пробовать!
    Спасибо большое!!!

  • Евгений25 ноября 2013 в 10:11 #

    Что-то пока не срабатывает, еще поковыряюсь...

    • Миша25 ноября 2013 в 13:11 #

      а что конкретно не срабатывает? появляется ошибка? или что?

      • Евгений25 ноября 2013 в 14:11 #

        нет, ошибка никакая не появляется, но ничего и не выводится, даже <article нет. видимо какая то ошибка в логике, но я не понял где... вообще решил кодекс начать изучать с нуля))

        • Миша25 ноября 2013 в 17:11 #

          у меня там ошибка была - забыл про скобки, попробуйте ещё раз тот же самый код вставить) сорри за косяк

          • Евгений25 ноября 2013 в 17:11 #

            ооо!!! теперь сработало!!))) вот это радость!))) осталось только замутить автоматически это все, чтоб не прописывать вручную номера постов, и постраничную навигацию сделать "на лету", типа бесконечной прокрутки по нажатии на кнопку)) Но это я уже конечно сам постараюсь сделать, может с этим справлюсь)))
            У тебя самый полезный блог по WP в плане технической части))

  • Евгений25 ноября 2013 в 11:11 #

    нет, так что-то и не получилось заставить код работать)) ну что ж, буду ковырять пока не устану, а как устану, оставлю как есть)))

  • Алексей15 декабря 2013 в 10:12 #

    Очень информативно! Спасибо.

  • ILYA15 декабря 2013 в 20:12 #

    Товарищи, помогите. Раньше все работало. Теперь обновил вордпресс, и функция $q = new WP_Query("cat=-2,-12,-35"); перестала работать. Рубрики не исключает. Чего делать? Спасибо!!

    • Миша15 декабря 2013 в 23:12 #

      Попробуйте заменить:

      $q = new WP_Query("cat=-2,-12,-35");

      на:

      $q = new WP_Query( array('category__not_in' => array(2, 12, 35) ) );
  • Олег22 декабря 2013 в 07:12 #

    Шикарная статья. Спасибо.
    Набравшись наглости, хочу воспользоваться добротой душевной автора).
    Миша, у меня такая задача: Есть около 100 поставщиков. Товары стандартные, у каждого поставщика 50-70 товаров, при общем количестве различных товаров около 100 штук. То есть товары очень часто повторяются, только цена разная. Все просто - у нас есть код товара и цена. Я хочу выводить только предложения с лучшей ценой. Думаю поставщики у меня будут публикации. К каждой публикации думаю прицепить произвольные поля с кодом продукта(ключ) и ценой(значение). Если посоветуете что-то лучше - буду признателен. А пока, хочу вывести на главной странице наиболее популярные(категория) товары.
    То есть, N публикаций(поставшиков), у каждой из них N произвольных полей(код продукта) и значений(цена). Надо вывести список публикаций, в котором будет код продукта минимальная цена и название поставщика. Мысли ползут в сторону сортировок по названию продукта а потом по возрастанию цены, в результате первое уникальное попадание кода продукта выводится остальные опускаются. Но результат не будет корректен, так как у каждой публикации(поставщика) ге один, а много продуктов... каламбур начинается) В общем, думаю два цикла нужны. Или один, но обходить надо не публикации, а все произвольные поля сортируя по названию потом по значению - первое попадание названия оставляем, остальные опускаем.
    Я не силен в таксономиях всяких, потому буду рад совету как эту кухню лучше организовать. Может уже был опыт.

    • Миша22 декабря 2013 в 11:12 #

      мне кажется начать надо с того, что сделать поставщиков рубриками для товаров

  • Евгений13 января 2014 в 00:01 #

    Здравствуйте. Как сделать пагинацию понятно. Но как её отобразить? Чтобы было как на динамической странице WP?

  • Эдуард21 января 2014 в 16:01 #

    Привет! Подскажи пожалуйста, я вывожу записи в рубрике вот так:

    <?php $recent = new WP_Query("cat=65&showposts=6&offset=3"); while($recent->have_posts()) : $recent->the_post();?>

    но перестала работать pagenavi (не плагин). Как правильно выводить постраничную навигацию для такой конструкции?

    • Миша21 января 2014 в 18:01 #

      Привет!
      Вопрос 1. pagenavi нужно для этого цикла?
      Вопрос 2. в каком файле используется этот код?

  • VRS18 марта 2014 в 08:03 #

    Доброе утро, Миш.
    Помоги, пожалуйста, с пагинацией.
    Ставлю фильтр, код такой

     
    <?php 
    /**
     * Формируем параметры для query_posts():
     */
    $paged = (get_query_var('paged')) ? get_query_var('paged'): 1;
     
    $order1 = "&orderby=date";
    $order2 = "&order=DESC";
    $order3 = "&paged=$paged";
    /**
     * Обрабатываем поступающую с выпадающего списка информацию:
     */
    $o2 = ' selected="selected"';
    switch ($_POST['select']) :
      case 'po_zagolovku':                    
        $order1 = "&orderby=title";
        $o1 = ' selected="selected"';
        $o2 = '';
        break;
      case 'snachala_novizne':                
        $order1 = "&orderby=date";
        $o2 = ' selected="selected"';
        break;
      case 'po_cost':                 
        $order1 = "&meta_key=cost_1&orderby=meta_value_num";
        $o3 = ' selected="selected"';
        $o2 = '';
        break;
    endswitch;
     
    $o22 = ' selected="selected"';
    switch ($_POST['order']) :
      case 'desc':                    
        $order2 = "&order=DESC";
        $o12 = ' selected="selected"';
        $o22 = '';
        break;
      case 'asc':                
        $order2 = "&order=ASC";
        $o22 = ' selected="selected"';
        break;
     
    endswitch; 
     
    /**
     * Вывод формы на экран:
     */
    print "
    <form method=\"post\" id=\"order\">Сортировать:
      <select name=\"select\" onchange='this.form.submit()'>
        <option value=\"po_zagolovku\"$o1>по названию</option>
        <option value=\"snachala_novizne\"$o2>по дате</option>
        <option value=\"po_cost\"$o3>по цене</option>
      </select>
     
      <select name=\"order\" onchange='this.form.submit()'>    
        <option value=\"desc\"$o12>по убыванию</option>
        <option value=\"asc\"$o22>по возрастанию</option>
      </select>
     
    </form>";
     
    /**
     * Передача параметров выборки:
     */
    query_posts($order1.$order2.$order3);
    ?>

    Пагинация есть, но когда я хочу отсортировать записи на второй странице, они перестраиваются без учета постараничной разбивки. Т.е. сначала сортируется, а потом разбивается на страницы, получается, что те товары, которые были на этой странице, исчезают.
    Пробовала вписать принудительно &posts_per_page=5 , но не помогло.

    • Миша20 марта 2014 в 22:03 #

      Доброго времени суток)
      попробуй это добавить после query_posts():

      $wp_query->is_archive = true;
      $wp_query->is_home = false;
      • VRS20 марта 2014 в 22:03 #

        :(( не получается, все равно сначала выстраиваются, потом разбиваются на страницы.. или можно сделать так, чтобы выбранный пользователем порядок сохранялся при переходе на следующую страницу, а то на ней снова значения по умолчанию.

        • Миша21 марта 2014 в 06:03 #

          хм, тогда такой вопрос - как называется файл, в котором используется код выше?

  • VRS21 марта 2014 в 13:03 #

    category.php

    после фильтра идет стандартный цикл if ( have_posts() ) : while (have_posts()) : the_post();

    вставлять $wp_query->is_category = true; тоже пробовала..

  • Илья13 сентября 2014 в 22:09 #

    Здравствуйте, Миша!
    Не пойму, как использовать поисковый механизм WordPress (который работает через стандартную форму поиска по сайту, только кастомный запрос делать в самом коде). По идее он тоже должен работать через этот класс, но не пойму, какой метод и параметры. Хочется поисковые подсказки на сайте сделать, и не пойму как.

  • Валодя7 ноября 2014 в 12:11 #

    Добрый день. Столкнулся с задачей и уже несколько дней не могу решить
    есть вот такая такосономия

    &taxonomy=coupon-categories&tag_ID=16&post_type=coupons

    использую фот эти параметры и перепробовал много других чтоб вывести купон из определённой рубрики например с id 16

    $args = array(
            'post_type' => 'coupons',
            'orderby' => 'rand',
    	'posts_per_page' => 3,
            'meta_query' => array( 
     
            )
        );
     
    $query = new WP_Query($args);
    • Миша7 ноября 2014 в 13:11 #

      День добрый)

      $args = array(
              'post_type' => 'coupons',
              'orderby' => 'rand',
      	'posts_per_page' => 3,
      	'tax_query' => array(
      		array(
      			'taxonomy' => 'coupon-categories',
      			'field' => 'id',
      			'terms' => 16
      		)
      	)
      );
  • Анатолий14 ноября 2014 в 23:11 #

    Здравствуйте, Михаил. Статья познавательная. Спасибо, но я не специалист в Query, поэтому не все понял.
    В связи с этим, не поможете советом решить одну проблему?

    Необходимо сделать так, чтобы одна статья, допустим с id 4562, не показывалась в этом списке. Т.е. надо исключить из списка конкретную публикацию. Какой кусок кода и куда надо вставить?

    • Миша15 ноября 2014 в 05:11 #

      Доброго времени суток:

      $recent = new WP_Query(array('post__not_in' => array(4562)));

      P.S. для вставки кода используйте пожалуйста специально предназначенные для этого кнопки над формой комментария.

  • Елена28 ноября 2014 в 04:11 #

    Добрый день, Михаил. Бьюсь с созданием слайдера. Идея такая, чтобы в заголовке отображалось название рубрики. А ниже последняя добавленная статья. Помогите пожалуйста.
    Вот мой код

    <ul class="accordion" id="accordion">
    <?php query_posts('showposts=5'); ?>
             <?php while (have_posts()) : the_post(); ?>
        <li class="bg1">
     
            <div class="heading">
    		<?php the_title(); ?>
    		</div>
            <div class="bgDescription">
     
    		</div>
            <div class="description">
    		<?php
    				$thumb = get_thumbnail($post->ID, get_theme_mod('thumb_key'),get_theme_mod('thumb_key'));
     
    				if(!$thumb)
    					$thumb = get_bloginfo('template_url').'/images/logo.png';
     
    				$url = get_bloginfo('template_url').'/timthumb.php?src='.$thumb.'&amp;h=175'.$size.'&amp;w=480'.$size.'&amp;a=t&amp;zc=1';
    				echo '<a  class="entry-thumb"href="'.get_permalink().'" title="'.the_title_attribute( 'echo=0' ).'"><img width="'.$size.'" height="'.$size.'" src="'.$url.'" alt="'.get_the_title().'" /></a>';
    			    ?>		
                <h2><?php the_title(); ?></h2>
     
    			<a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a>
            </div>
        </li>
    	<?php endwhile; wp_reset_query(); ?>
    </ul>
    • Миша28 ноября 2014 в 07:11 #

      Добры день, Елена!
      А какой собственно вопрос?)

      • Елена28 ноября 2014 в 07:11 #

        Подскажите, как из каждой рубрики вывести одну последнюю статью. Причем с указанием рубрики.
        И еще почему-то не выводятся картинки в предыдущем коде. В общем косячу , а где не пойму.

        • Миша28 ноября 2014 в 08:11 #

          Вы не против, если я вам просто покажу как, но не буду писать готовый код?

          Для того, чтобы вывести одну последнюю статью из каждой рубрики, прокручиваем рубрики через функцию get_terms(), а затем для каждой итерации цикла выводим 1 пост при помощи WP_Query.

          А почему картинки не делаете через get_the_post_thumbnail()?

  • Валодя2 марта 2015 в 16:03 #

    Добрый день подскажите пожалуйста.
    Использую плагин woocomerce а наполняю прям в базу, при этом прописывают только самую последнюю дочернюю рубрику. Как мне вывести товары всех дочерних (всех уровней) находясь в родительской и чтоб находясь в дочерней то показывались все товары содержащиеся в ней и её дочерних?

  • Дмитрий Шишкин8 апреля 2015 в 15:04 #

    А есть ли какой-то способ вывести все записи верхнего уровня у которых нет дочерних записей? Второй вечер уже над этой задачей бьюсь — ничего придумать не могу :-(

    • Миша9 апреля 2015 в 19:04 #

      Можно, первое, что мне пришло в голову:

      $q = new WP_Query("post_parent=0");

      Затем в цикле для каждой записи делать проверку:

      $q2 = new WP_Query("post_parent=" . $q->post->ID );
      if( $q2->have_posts() ) {
      // не подходит
      } else {
      // подходит
      }
  • Евгений29 мая 2015 в 16:05 #

    Скажите, почему не работает:

    'post_type' => 'group',                           
    'post__in' => array('216')

    не находить запись произвольного типа(запись такая есть).

    • Миша29 мая 2015 в 22:05 #

      Не находить? Может тогда post__not_in?

      • Евгений30 мая 2015 в 00:05 #

        это опечатка)
        нужно именно определенной таксономии, определенные по id записи.

        • Миша30 мая 2015 в 09:05 #

          Тогда должно работать, вероятнее всего в других параметрах есть какая-то ошибка. Иногда даже из-за несовпадения в post_status могут посты не выводиться)

          • Евгений30 мая 2015 в 11:05 #

            Спасибо за уделенное мне время, действительно ошибка была в других параметрах.

  • SaW14 июля 2015 в 19:07 #

    Помогите очень нужно.
    Нахожусь в категории 3, мне нужно вывести посты из категории 2, исключая катерию 8.
    (Посты есть с категорией 2 и (2 и 8) )

  • Надежда20 ноября 2015 в 18:11 #

    здравствуйте. подскажите пжл
    как на материнской странице вывести дочерние страницы 2 уровня, по данной материнской страницы
    Тоесть есть, такая структура: Производитель -> Категория товара -> Товар
    Нужно: на странице Производитель вывести Товары
    Спс заранее.

  • Денис2 января 2016 в 20:01 #

    Здравствуйте! Подскажите как правильно мне вывести, например нужно сделать вывод 10 записей с одинаковым произвольным полем в сайдбаре. Произвольные поля были сделаны с помощью плагина Custom Field Suite. Сайт на кулинарную тематику. Есть произвольное поле - КУХНЯ, вот хочу чтобы в сайдбаре был список рецептов с произвольным полем - кухня : русская (например).

  • Ник2 января 2016 в 20:01 #

    Здравствуйте. А как вывести произвольные типы записей?

  • Алексей5 мая 2016 в 13:05 #

    Миша, подскажите, пожалуйста: этот tax_query мне надо вставлять куда, если я хочу исключить в архивах таксономий посты дочерних таксономий?
    В taxonomy или в function?

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Добрый день! В принципе вам только немного нужно доработать код из этого поста - категории уже есть, цена - это и так...

  • eveniy: Добрый день Михаил, подскажите на примере как добавить свои произвольные поля в в вашу форму фильтрации: Я так понимаю...

  • Миша: Отлично! )

  • Дмитрий: сам разобрался: в настройках кастомного типа записи недавно оптимизировал настройки и переоптимизировал: в аргументе 'ta...

  • Дмитрий: У меня по какой-то причине пропало отображение (как в колонке меню слева, так и метабокс в записях ) раздела рубрик для...