Уверен, что вам будет легче разобраться с тем, как работает класс WP_Query
в WordPress, если вы посмотрите мой видеоурок по нему.
Про класс 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>'; endwhile; endif; // восстанавливаем глобальную переменную $post wp_reset_postdata();
:
и endif
или endwhile
, но очень часто бывает, что внутри цикла происходит закрытие тегов php и вывод в HTML, тогда условия становятся так удобнее.$q->have_posts()
и $q-the_post()
идентичны аналогичным функциям основного цикла – have_posts() и the_post() соответственно.Также хочу обратить ваше внимание на возможность передачи в WP_Query
параметров в виде строки, хотя лично я уже очень давно так не делал.
$q = new WP_Query( "posts_per_page=5&orderby=comment_count" );
В такой ситуации обычно использовали двойные кавычки, чтобы в случае чего сразу передать переменную, типа того:
$q = new WP_Query( "posts_per_page=$per_page&orderby=comment_count" );
Дальше пойдет описание параметров, ещё есть отдельный пост про методы и свойства.
Можно вывести посты сразу нескольких авторов: $q = new WP_Query( 'author=4,5,8,15' );
Или вот так
$q = new WP_Query( array( 'author__in' => array( 4, 5, 8, 15 ) ) );
Когда-то давно в WordPress не существовало произвольных таксономий, были только рубрики и метки. Потом появились таксономии и новый параметр для них – tax_query
, но конечно же никто не будет удалять старые параметры ради обратной совместимости.
Тем не менее я не хочу учить вас каким-то «древним приколам», поэтому давайте сразу – если говорим о выводе постов из любых таксономий (даже из стандартных, типо рубрик и меток), то сразу один параметр – tax_query
.
Чтобы с этим было легче разобраться, нужен пример, начнём с максимально легкого
// выводим посты из элемента таксономии gta_vice_city таксономии game $params = array( 'tax_query' => array( array( 'taxonomy' => 'game', 'field' => 'slug', 'terms' => 'gta_vice_city' ) ) ); $query = new WP_Query( $params );
taxonomy
, это значение может быть category
для рубрик или post_tag
для меток.field
принимает одно из трёх значений – id
(по умолчанию), slug
или name
. В зависимости от того, что вы в нём указали, то и должны передать в параметр terms
. Например у меня указан slug
, значит я и передаю на следующей строке ярлык таксономии gta_vice_city
.terms
, который и принимает термины, из которых выводим посты, но обратите внимание, что мы можем туда также передавать и несколько элементов в виде массива.tax_query
содержит массив в массиве! Это важно запомнить, иначе у вас ничего не будет работать. Для чего это нужно? А для того, чтобы можно было накидать много условий! Покажу вам это чуть ниже:// выводим посты из элемента таксономии gta_vice_city таксономии game // ИЛИ из рубрики uncategorized, то есть И ТЕ И ДРУГИЕ В ОДНОМ ЦИКЛЕ $params = array( 'tax_query' => array( array( 'taxonomy' => 'game', 'field' => 'slug', 'terms' => 'gta_vice_city' ), array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => 'uncategorized' ) ) ); $query = new WP_Query( $params );
Вы думаете о том же, о чём и я? 😁
В примере мы передали два условия в виде двух массивов внутрь tax_query
(можем передать и три), как я уже сказал, то выведутся посты, удовлетворяющие любому условию, и что сделать, чтобы посты удовлетворяли обоим условиям сразу? Тут нам поможет параметр relation, который закидываем вместе с массивами на том же уровне. Вот так:
$params = array( 'tax_query' => array( 'relation' => 'AND', // по умолчанию значение OR array( 'taxonomy' => 'game',
Теперь оба условия будут выполняться.
Продолжаем апгрейдить наш tax_query
– а что, если мы хотим не вывести также и посты из рубрики uncategorized
, а наоборот исключить их из неё? Каждый мини-массив-условие таксономии помимо параметров taxonomy
, field
и terms
может принимать ещё и параметр operator
!
Например для исключения мы можем использовать его значение NOT IN
, по умолчанию IN
.
array( 'taxonomy' => 'category', 'field' => 'slug', 'operator' => 'NOT IN', // не принадлежащие рубрике uncategorized 'terms' => 'uncategorized' )
Давайте я наверное опишу значения параметра operator
, а то у многих как-то кривовато переведено 😋
IN
– посты содержат указанный термин, либо содержат один из терминов, переданных в массиве.NOT IN
– посты, не содержащие указанный термин и, если передан массив, то не содержащие ни один из терминов массива.AND
– посты, содержащие все термины массива.NOT EXISTS
посты, не содержащие ни один из терминов указанной таксономии, параметр terms
тут уже не нужен.EXISTS
посты, содержащие любой термин из указанной таксономии, параметр terms
тут не нужен.Думаю ещё одну вещь я должен вам показать с tax_query
, это когда у нас много-много разных условий!
$q = new WP_Query( array( 'tax_query' => array( 'relation' => 'OR', array( // условие 1 'relation' => 'AND', array( // условие 1.1 ), array( // условие 1.2 ) ), array( // условие 2 'relation' => 'AND', array( // условие 2.1 ), array( // условие 2.2 ) ) ) ) );
Как вам такое? 😁 И таких вложенностей может быть больше.
В данном примере у нас должно выполнять ИЛИ условие 1 ИЛИ 2, которые в свою очередь выполняются, если их дочерние подусловия оба выполнены!
Опять-таки, как и с таксономиями – ранее в WordPress были сами по себе записи и страницы, а теперь это всё одно – посты, лишь разных типов. Поэтому снова можем сократить пару ненужных параметров.
post
, значит только записи! Напоминаю значения, которые он может принимать:
post
— записи, посты (по умолчанию),page
— страницы,attachment
— вложения, файлыrevision
— редакции (не черновики),any
— все, кроме редакций и постов с параметром exclude_from_search=true,$q = new WP_Query( array( 'post__in' => array( 3, 7, 14, 15, 21 ) ) );
new WP_Query( 'post_parent=9' )
new WP_Query( 'name=o-nas' )
Если вам нужно, чтобы какой-то пост (или посты) выводился перед всеми остальными записями, на странице его редактирования вы можете отметить галочку «Прикрепить наверх блога». Про прилепленные посты есть отдельный урок на сайте кстати.
Такие посты можно тоже по-разному отфильтровать при помощи параметров WP_Query
.
false
.А теперь выведем все посты, которые были отмечены, как прилепленные. В этом случае, конечно же, можно отключить (а можно и не отключать) их повышенный приоритет перед другими постами:
$params = array( 'posts_per_page' => -1, 'post__in' => get_option( 'sticky_posts' ), // массив, содержащий IDы всех прилепленных постов 'ignore_sticky_posts' => 1 ); $q = new WP_Query( $params );
publish
— опубликованный пост или страница (по умолчанию),pending
— ожидает модерации,draft
— черновик,auto-draft
— только что созданный пост, без контента,future
— пост, который запланирован на публикацию в будущем,private
— невидимый для незарегистрированных пользователей,inherit
— необходимо указывать при выводе редакций или вложений (либо any),trash
— то, что находится в корзине (начиная с версии 2.9),any
— все, кроме постов с параметром exclude_from_search=true
Форматы записей выводятся по типу таксономий, например:
$params = array( 'tax_query' => array( // про tax_query написано чуть выще array( 'taxonomy' => 'post_format', // таксономия форматов 'field' => 'slug', // значение этого поля обязательно slug 'terms' => array( 'post-format-quote' ), // название одного или нескольких форматов в виде массива ), ), ); $q = new WP_Query( $params );
Отобразить сразу все записи, по умолчанию выводится количество записей, указанное в Настройки > Чтение.
$q = new WP_Query( array( 'posts_per_page' => -1 ) );
paged
будет проигнорирован и ваша пагинация может сломаться. Параметр offset
же сам по себе будет проигнорирован при установке posts_per_page
в значение -1
.
none
— не сортировать,ID
— по id,author
— по имени автора,title
— по заголовку,name
– по ярлыку записей,type
– по названию типа поста,date
— по дате публикации (по умолчанию),modified
— по дате последнего изменения,parent
— по ID родительских постов,rand
— случайным образом,comment_count
— по количеству комментариев (начиная с версии 2.9),menu_order
— сортировать по указанному порядку, по умолчанию в WordPress уже есть инструменты для установки собственного порядка страниц и вложений:
relevance
– по релевантности при использовании поиска, это работает таким образом, что сначала выведутся записи, когда поисковая фраза нашлась в заголовке и совпала полностью, затем, если все поисковые слова присутствуют в заголовке записи, затем – если хотя бы одно поисковое слово есть в заголовке и затем – если поисковая фраза нашлась и совпала полностью в контенте поста.meta_value
— по значению мета-данных поста (произвольного поля), при этом в цикле должен присутствовать параметр meta_key
используется только для сортировки строковых значений,meta_value_num
— по значению произвольного поля, для сортировки чисел,post__in
— использовать порядок, заданный в параметре post__in
, параметр направления сортировки order
при этом будет проигнорирован.post_name__in
— использовать порядок, заданный в параметре post_name__in
, параметр направления сортировки при этом будет проигнорирован.post_parent__in
— использовать порядок, заданный в параметре post_parent__in
, параметр направления сортировки при этом будет проигнорирован.Начиная с версии WordPress 4.0 вы можете передавать два значения через пробел, что означает сначала сортировать по первому значению, а в ситуациях, когда первые значения равны – по второму.
$q = new WP_Query( array( 'orderby' => 'author title' ) );
Эту запись также возможно записать в таком виде:
$q = new WP_Query( array( 'orderby' => array( 'author' => 'ASC', 'title' => 'DESC', ) );
В WordPress 4.2 появилась возможность передавать в orderby
нечисловой индекс массива meta_query, подробнее читайте здесь.
ASC
— по возрастанию (1, 2, 3; a, b, c),DESC
— по убыванию (3, 2, 1; c, b, a) (по умолчанию);В WP 3.7 появился также очень удобный date_query, рекомендую использовать его.
Все посты, опубликованные 20 декабря 2011:
$q = new WP_Query( "year=2011monthnum=12&day=20" );
Читайте более подробно о том, как вывести посты, опубликованные между двумя датами.
Отобразить все записи, в которых значение произвольного поля «color» равно «blue».
$q = new WP_Query( array( 'meta_key' => 'color', 'meta_value' => 'blue' ) );
Отобразить записи, в которых значение любого произвольного поля равно «blue».
$q = new WP_Query( array( 'meta_value' => 'blue' ) );
А в этом варианте выводятся посты, у которых значение произвольного поля «color» не равно «red».
$q = new WP_Query( array( 'meta_key' => 'color', 'meta_value' => 'red', 'meta_compare' => '!=' ) );
Начиная с версии WordPress 3.1 параметры произвольных полей можно задавать через массив 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’.meta_query
, может принимать значения OR
или AND
.В этом примере выводим анкеты людей, которые разбираются в 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
вы можете найти тут.
$q = new WP_Query( array( 's' => 'wordpress' ) );
ids
— массив составленный из ID элементов (постов), кстати посмотреть на вид самих массивов вы можете через функцию print_r()
или заглянув в пост про get_terms(),id=>parent
— ассоциативный массив состоящих из ID элементов и ID их родителей, при этом, если родительского элемента не существует, то возвращается 0.$q = new WP_Query( array( 'post_type' => 'page', 'posts_per_page' => -1, 'fields' => 'id=>parent' ) ); print_r( $q ); /* Результат примерно такой: Array ( [1] => 0 [4] => 0 [11] => 4 ) */
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Отличное описание функции! В закладки.
Спасибо!
+1 в закладки - нашел то, что искал;) Спасиб!
пожалуйста))
Не совсем по теме, но от души, ибо 4 часа решал свою проблему, решил, и теперь надо куда-то излить! Нашел Вашу отличную статью после того как пытался понять почему плагин Platinum SEO неправильно работает на моей теме. Бился, бился.. Потом вспомнил мудрое: "Если прибор никак не работает, попробуйте прочитать инструкцию". На сайте разработчика плагина нашел, что если в теме используется query_posts, то могут возникнуть проблемы, и лучше заменить его на WP_Query...
Может это кому-то поможет...
Спасибо Миша. Съэкономил кучу времени. +1 в закладки!!!
рад помочь)
Есть вопрос, если делать фильтры на странице или в рубрике, то перестает работать постраничная навигация. Это только у меня, или все же с этим проблема? Как думаешь Миш в чем может быть причина?
зависит от способа реализации фильтра.
Цикл как тут в примере в самом начале, только параметры другие, поиск по произвольным полям.
это должно помочь https://misha.agency/wordpress/page-template-loop.html
вопрос по поиску произвольных полей для ВП 3.5
не могу заставить вп показывать посты через поиск по произвольным полям.
вот например
все записи с людьми которые разбираются в вордпрессе
силка - www.site.ru/cms=word
или люди разбираются в вп и которым больше или ровно 20 лет
силка - www.site.ru/cms=word&age>=20
а вп кидает на главную и все.
может я неправильно прописываю что то в файле функций или файле поиска?
ссылки такого вида некорректны
Михаил, здравствуйте.
Возможно, мой вопрос немного не в тему, но попал сюда из Google, в котором искал ответ на свой вопрос.
А вопрос такой:
1. Есть custom_field, значение которого формируется посетителем.
Например, посетитель указывает название компании.
2. Это поле выводится на странице просмотра данных, введенных посетителем. В этой секции видно имя компании.
Задача - сделать возможность поиска всех записей, которые содержат одно и то же значение для этого пользовательского поля.
Написал так:
Ссылка выводится, но не работает.
Не подскажите, где ошибка и где искать?
Доброе утро)
Спасибо за оперативный ответ. Но.
Файл, в котором стоит тег A и формируется ссылка на просмотр записей по конкретной компании - выводит описание заявки на вакансию, в которой каждый раз - новая компания.
Одна и та же компания может несколько раз размещать вакансии, в течение, например, года.
Вопрос:
Обработка запроса на поиск всех записей через WP_Query - это конечно удачное решение, но я пока не могу сообразить, каким образом мне воткнуть этот запрос и куда именно в файле single-job.php, т.к. именно такой файл отвечает за вывод пользовательских типов записей - job, с произвольными полями, которые относятся к этому типу.
Сейчас ссылка формируется так:
http://localhost/jobmanager/item/Кафе 'Ромашка'
Мне кажется, что проблема в rewrite, но могу ошибаться.
Возможно, что нужно иное решение - пользовательская таксономия.
я возможно не до конца догоняю, в общем как я это понимаю:
компания - произвольное поле
вакансия - произвольный тип записи
нужен поиск всех вакансий для конкретной компании?
если я всё правильно понял, тогда:
Первое
да, конечно, компании через таксономии будет лучше и удобнее
Второе
если всё же делать через произвольные поля, то код запроса будет примерно такой:
то есть тип записей нужно указывать всегда, т.к по умолчанию стоит
post
, я сам пару раз на этом моменте спотыкался)Нужен не просто поиск.
Есть файл single-job.php, в котором выводится описание вакансии.
В этом описании есть название компании, добавленное через произвольное поле.
Я хочу это название сделать кликабельным, чтобы посетитель мог сразу нажатием на название компании, открыть список всех вакансий этой компании.
Ваш вариант требует добавления WP_Query, т.е. запроса, а мне нужен вариант обычного тега A, в который я вставлю что-то типа:
Ссылку вижу такой:
localhost/jobmanager/item/кафе 'Ромашка'
На сайте есть две записи вакансий этой компании (кафе), но при клике на названии у меня открывается 404.php
Мне кажется, что рыться надо в rewrite, и иначе писать код который выше.
Был бы рад услышать ваши варианты)
Спасибо все равно, что отвечаете в выходной день.
Я перерыл весь дотком и рунет - все, что пишут о meta_key и meta_value, но все - такая ерунда, всякие там картинки и Привет всем! через произвольные поля, ничего серьезного, никто глубоко не описывает ни одного примера.
В Доках WordPress - ни одного реального примера с моим вариантом.
А глубже, сори, с пхп я не силен.
Извините, что-то с кодом в комментарии:
короче, я 100% рекомендую делать через таксономии, через произвольные поля вы так запаритесь)
в том случае составления ссылки нужно будет создавать шаблон страницы и там уже в содержимом что-нибудь с WP_Query в зависимости от параметров
$_GET
да, у меня тут в комментах кнопки раньше были для кода в старом дизайне, в новом пока что не нашел, куда их приткнуть, попробуйте через:
Я только что опубликовал предложение к спецам на форум русского 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
В любом случае - спасибо вам за советы.
ну а что с созданием таксономии новой? почему вас этот вариант не устраивает? там замутить ее 5 минут
Я не писал - не устраивает)
В теме есть таксономия для custom post - job, надо ее или дорабатывать, или менять custom field для названия компании...
Я уже запутался и не так много знаний, чтобы сделать как мне надо.
уверен, что это будет наилучший выход, тут вот я немного писал про таксономии https://misha.agency/blog/wordpress/register_taxonomy.html
Миша, проблему решили?
какую проблему? про таксономии?
Доброго времени суток всем! Подскажите пожалуйста, мне нужно вывести в случайном порядке только (!) фото с постов в определённой рубрике, многое пробовал, не получается. Или как вариант, все прикриплённые фото к записи, но параметр, отвечающий за прикрепленость фото к записи я не нашёл.
Добрый вечер!
сначала выводим посты через WP_Query и потом, внутри тела цикла, создаем ещё один цикл, в котором выводим фотки к каждому посту. могу расписать, как это будет в коде, если нужно.
Михаил, спасибо, уже решил вопрос.
Приветствую!
А у меня такая проблем.
Есть две таблицы, в одной из которых юзеры, а в другой связь id юзера и категории, к которой он относится (категорий может быть несколько). У меня есть запрос, который уже содержит массив нужных записей.
Вопрос - как вывести этот массив при помощи конструкции have_posts()?
Привет!
have_posts()
относится именно к классу WP_Query, это метод класса, чуть более подробно тут.то есть я считаю, что из этой затеи ничего не выйдет (или я чего-то недопонимаю).
Михаил, добрый день.
Я все продолжаю "биться" с проблемой, которую озвучивал в этом топике, сори, что не в тему.
Хочу попросить вас о помощи, не бесплатной, конечно.
Столкнулся с проблемой, которую сам не решу, уже точно.
Если коротко, то выглядит таким образом:
1. Есть custom_posts_type = 'job'
2. Я обсудив с вами, не нашел другого решения как "подцепить" для поиска всех записей "вакансии компании" через метки - tag.
3. Прикрутил tag к custom_posts_type, чтобы отображались в редакторе.
4. Не мог никак запустить отображение списка все вакансии компании. Нашел на Доткоме функцию - поиск по меткам произвольного типа записей, добавил функцию в файл functions.php темы. Работает.
НО!
Обнаружил, что при открытии архива записей 'job' по одной компании у меня пропадает навигационное меню.
Методом "тыка" определил, что добавленная мной функция поиска по меткам произвольного типа записей 'job' при ее удалении меню не пропадает, но тогда открывается страница 404 (как в общем, и было до этой функции).
Сама функция во мне не вызывает никаких эмоций, т.к. мои знания PHP ниже чем хотелось бы :)
Могу дать доступ на тестовый поддомен, где поставил эту тему. Опишу - где и что дописал, в каких файлах.
Нужна реальная помощь, готов оплатить ваш труд (WM или другой способ на ваше усмотрение).
Комментарий этот можете удалить, просто не стал писать в Контакты, чтобы вспомнили по комментариям наше общение.
Заранее спасибо, если не откажете.
Добрый день!
Да, давайте взгляну, мне тогда доступ на тестовый домен по почте скиньте.
Не могу найти у вас на сайте ваш Email
в Контакты :) там справа надо навести на @
Туплю, наверное, вечер сказывается))
бывает))
Миша!
Очень нравится Ваш блог, много полезной и нужной информации и на понятном языке.
Прошу подсказки в моей небольшой проблеме. В конечном итоге мне надо сделать фильтр по трем параметрам одновременно. Первый параметр - это стандартный список категорий. Второй параметр - созданная новая функция create_country при помощи register_taxonomy (список стран), третий параметр - стандартные теги вордпресса (в данном случае диапазон цен, 0-100, 100-300, 300-600 и т.д.).
В конечном итоге должно получиться как здесь http://putevka.uz/ru/ Только там нет выбора по тегам, а мне надо его добавить.
По отдельности как слепить эти три фильтра я додумался как, но у меня не хватает мозгов, как объединить эти три фильтра в один, что бы пользователь выбрав из трех выпадающих списков нужные параметры поиска, получил в итоге список страниц(записей). Буду благодарен за Ваши подсказки!
Добрый день)
спасибо,
ну я так понимаю, это нужно объединить параметр рубрик и два параметра произвольных полей?
типо этого:
Да, один параметр рубрик, второй - это стандартные вордпрессовские теги (если они называются как произвольные поля, значит это так), а третий - созданная новая таксономия, точь в точь как здесь
http://n-wp.ru/17217
там вверху страницы видно как в админке появился список стран (путем добавления новой функции в файл functions.php).
И второе, ввиду моих отличных познаний php, прошу уточнения. Как прописать цикл, чтобы вывести три выпадающих списка рядом друг с другом?
Спасибо, что помогаете советами, пусть Вам сопутствует удача!
ну первый выпадающий список (категории) отдельно через цикл foreach и функцию например get_terms() или get_categories()
а другие поля, например диапазон цен, там вообще без цикла, прост тупо эти диапазоны можно забить в HTML, я полагаю.
Миша!
Чтоб было точно как здесь http://putevka.uz/ru/ (только с тремя параметрами поиска)
что лучше использовать
wp_query
или
query_posts
?
если на странице с результатами будет присутствовать постраничная навигация, то лучше query_posts наверное, если нет - то WP_Query
Спасибо, Миша!
Вот здесь чувак все подробно расписал то, что мне надо.
Может кому пригодится.
http://fearlessflyer.com/2012/10/how-to-create-an-advanced-search-form-for-wordpress/
Миша, помогите! правильно ли я думаю, что с помощью wp query я могу создать поиск по нескольким кастом-полям одновременно? пыталась настроить плагин Select WP Custom Search - но он старый и как то не получилось у меня с ним. Стоит задача искать по нескольким значениям полей одновременно (параметры заданы custom fields'ами)
заранее спасибо
да, верно, по любому количеству полей, очень удобно)
Михаил!
У меня такая проблема. Мне надо вывести все страницы, у которых есть произвольные поля (созданные плагином "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 может быть одно, два или три значения, но не больше.
ну стоит условие AND же, это значит что не ИЛИ, а И, т.е. все три чекбокса должны быть отмечены, иначе ничего не выведется.
Действительно, вот это дела, на носу очков не заметил. Бывает хуже..., но ..... реже.
Спасибо!
пожалуйста :)
Здравствуйте Михаил. Нужна Ваша помощь. Хочу сделать виджет для вывода постов с определенным IDом.
Подскажите пожалуйста какие параметры необходимо прописать в этой части кода, чтобы ID необходимых записей можно было указывать в админке, в настройках виджета.
Вот кусочек кода
/*
* в массиве задаем все необходимые параметры (более подробно о параметрах чуть ниже)
*/
$args = array(
'post__in' => array(918)
);
Заранее благодарна
Добрый день) предположим ID указанных постов 5 и 15, тогда параметры будут примерно следующими:
Обращаю внимание, что по умолчанию это работает только для записей(постов), для других типов надо будет добавить параметр post_type
Тогда получается, что для добавления какой-либо новой записи мне необходимо будет открывать этот код и вписывать ID записи. Мне это не сильно удобно, поэтому хотела сделать виджет и вписывать эти ID записей через запятую в настройках виджета. Я не знаю как правильно задать условие вместо этой строчки 'post__in' => array(5,15)Для того чтобы обрабатывались параметры заданные в настройках((
нет конечно, не надо открывтаь код каждый раз :)
тогда примерно так
В этом случаи у меня выводятся все статьи а не те, которые я указываю.
Вот моя форма
<label for="get_field_id('$posts'); ?>"> <input type="text" value="" name="get_field_name('$posts'); ?>" id="get_field_id('$posts'); ?>" class="widefat" />
посмотрите пожалуйста скорее всего я что-то неправильно делаю. Спасибо.
надо бы мне где-то под формой комментов подписать или кнопки добавить - для вставки кода можно использовать конструкцию
IDы постов должны быть в виде массива)
Какую функцию использовать для вставки кода, чтобы он выглядел как код а не как текст?
добавил небольшое пояснение под формой комментария) проще добавить какие-нибудь кнопки, согласен, надо подумать над этим
Спасибо. А то я перепробовал несколько вариантов куда вставить код и ни один не оказался правильным.
Очень понравился Ваш блог
Почему код выводит только последние 10 постов?
рекомендую внимательно посмотреть на строчку 3
Спасибо Миша. В третей строчке я единичку убрал. Проблема заключалась в том, что нужно было написать
я думал, что posts_per_page=-1 по умолчанию..
Как можно сгруппировать результат по таксоновии если пользуюсь функцией wp_query.
что значит сгруппировать? конкретнее
Смотри когда выводятся посты есть поле в котором есть повторяющиеся значения и надо чтобы в этом поле были тоько уникальные значения, а остальные отсеивались, как в языке SQL параметр GROUP BY.
ну ставишь параметр meta_key (или key) и его значение meta_value (value) и получается выведутся все посты с уникальным значением этого параметра.
Не получается делать выборку по нескольким тегам сразу.
Запросы по типу ?tag=tag1+tag2 не работают
Как решить?
С учетом того что имена будут прогоняться через чекбоксы.
а зачем тут символ
?
?)Добрый день! Спасибо за отличную статью. Скажите, пожалуйста, а возможно ли с помощью WP_Query сделать такое: вывести список постов из той же категории и с тем же значением произвольного поля (одновременно) — без указания конкретного названия категории и поля? (чтобы не создавать много-много сайдбаров — а один универсальный). Спасибо!
Доброго времени суток! да, можно) что-то в этом духе:
У меня такая проблема:
на сайте стоит classipress. мне нужно сделать вывод по регионам.
делаю так:
В итоге выводит одно и то же при любом значении $_COOKIE['region_name'].
Выводится даже то, где нет этих полей. А мне нужно чтоб только те объявления, в которых поле cp_state равно $_COOKIE['region_name']
Подскажите, как правильно составить запрос.
Спасибо.
правильно так:
или так:
также рекомендую набросать такие параметры, как
posts_per_page
иpost_type
.сделал так:
Однако выводит все записи по все регионам, будь там Москва или Санкт-Петербург.
эта переменная точно не пустая
$_COOKIE['region_name']
?Точно, много раз уже проверил перепроверил.
ну что могу сказать, сам по себе код правильный, возможно ошибка где-то еще.
Спасибо за статью, очень полезная! При обучении возник вопрос. Допустим есть в базе два произвольных поля age1 и age2 (для определенных страниц), с помощью формы передается значение которое должно вписываться в диапазон age1-age2. Пробовал сделать что то типа:
Но трюк не удался, подскажите в каком направлении копать, спасибо!
Пожалуйста, Дмитрий)
сорри за долгий ответ - был в отъезде.
а если указать в каждом массиве тип данных в виде:
Уже несколько дней бьюсь над вот такой проблемой.
у меня магазин на woocommerce
в общем списке товаров выводятся все товары, которые были добавлены оператором в магазин. Но выяснилась необычная хотелка - клиент требует не выводить товары, которые входят в определённые коллекции. Порывшись, я выяснил, что у товаров, которые входят в коллекцию, в БД в поле post_parent указан ID родителя, тогда как у обыкновенных товаров там прописан ноль.
для того, чтобы исключить товары мне пришлось понять сущности многих хуков, однако же решения нет
к примеру вот этот хук:
Запрещает вывод товаров из определённой категории.
Подскажите plz, как прописать таким образом, чтобы выводилось только то, что имеет значение post_parent>0
спасибо.
что подразумевается под общим списком?
нуу, как я понимаю, некий шорткод, который выводит список товаров. Это те же посты, имеющие признак товара.
как правило, разбито на страницы. вот, смотрите
http://mebelopt-kazan.ru/shop/
WooCommerce может выводить весь список товаров. т.е. товары - это своеобразные посты...
если шорткод, то надо смотреть непосредственно в нём, для чего хук?
или нужна возможность регулярного обновления woocommerce?
даже в этом случае у плагина достаточно собственных хуков
Ну, вот один из них я и привёл комментом выше.
код, который можно прописать в functions.php
только он исключает определённую категорию из вывода, а мне нужно исключить только дочерние из вывода.
вопрос в том, можно ли с помощью
ограничить вывод товаров по признаку post_parent>0 ...
Огромное спасибо за статью! Только я не смог разобраться как реализовать свою затею…
Я хочу чередовать оформление постов на главной (и в категориях) таким образом:
1 статья шириной во всю ширину, потом 3 статьи маленькие, все в ряд, потом опять широкая, потом 3 маленьких… То есть каждый n-й пост оформлять подругому… Такое можно сделать?
Заранее спасибо!)
Пожалуйста)
да, можно при помощи переменной-счетчика.
Спасибо, не сильно мне это помогло))
Нашел другие статьи, но там везде практически добавляется какое то слово к классу записи, и уже оформлением класса играются... а мне надо немного по другому, там кроме оформления и элементы меняются...
Сечас сделал что первая запись широкая, остальные маленькие, это реализовано двумя циклами:
вывод статьи
и дальше остальные
блаблабла
Вот мне именно так и надо, чтобы разные данные можно было вывести а не просто ширину поменять... Но чтобы чередовать, 1 статья широкая с одним набором данных, 3 (или 6) маленьких с другим набором данных, и по кругу, с бесконечной прокруткой))...
блин, щас код вставлю
Вот весь код, чтоб понятнее было, тут двумя циклами вывожу немного разные данные
Если нужно сделать чтобы записи чередовались как 1 шировкая и 3 узких и делать для каждого участка записей отдельный цикл, то, если общее количество выводимых записей например 8, то будет уже 4 цикла на странице.
Функцию query_posts() лучше использовать не более одного раза на странице.
Во втором цикле не нашёл у вас ограничение на количество выводимых записей (в данном случае - 3, как я полагаю).
Различия между этими двумя телами циклами только в CSS-классе и блоке
clear:both
, верно?Что вам нужно:
1. один цикл через
$q = new WP_Query
,2. переменная-счетчик, которая будет увеличиваться на 1 каждый раз в цикле
$i++
,3. сравниваем эту переменную с
$q->post_count
каждый раз,4. три обтекаемых записи нужно делать не через
float:left
, а черезdisplay:inline-block
, благодаря этому мы избавимся от лишних элементов сclear:both
.различия в оформлении блоков не только в float, а в том что вывожу разные миниатюры
и
и планирую выводить еще разные данные (например в одном случае выводить дату, в другом нет и что-то еще), так что простым добавление слова к классу не обойтись. Пока не понял как сделать через i++, сейчас буду курить, вникать, очень сложно это для меня пока))
Спасибо, Миша
готовый код для восьми записей:
не тестировал, но в принципе должно работать)
Ого, вот это круто!! Щас буду пробовать!
Спасибо большое!!!
пожалуйста! всегда рад помочь читателям моего блога))
просьба отписаться о результатах
Что-то пока не срабатывает, еще поковыряюсь...
а что конкретно не срабатывает? появляется ошибка? или что?
нет, ошибка никакая не появляется, но ничего и не выводится, даже <article нет. видимо какая то ошибка в логике, но я не понял где... вообще решил кодекс начать изучать с нуля))
у меня там ошибка была - забыл про скобки, попробуйте ещё раз тот же самый код вставить) сорри за косяк
ооо!!! теперь сработало!!))) вот это радость!))) осталось только замутить автоматически это все, чтоб не прописывать вручную номера постов, и постраничную навигацию сделать "на лету", типа бесконечной прокрутки по нажатии на кнопку)) Но это я уже конечно сам постараюсь сделать, может с этим справлюсь)))
У тебя самый полезный блог по WP в плане технической части))
Спасибо, очень приятно это слышать)
нет, так что-то и не получилось заставить код работать)) ну что ж, буду ковырять пока не устану, а как устану, оставлю как есть)))
Очень информативно! Спасибо.
Товарищи, помогите. Раньше все работало. Теперь обновил вордпресс, и функция $q = new WP_Query("cat=-2,-12,-35"); перестала работать. Рубрики не исключает. Чего делать? Спасибо!!
Попробуйте заменить:
на:
Шикарная статья. Спасибо.
Набравшись наглости, хочу воспользоваться добротой душевной автора).
Миша, у меня такая задача: Есть около 100 поставщиков. Товары стандартные, у каждого поставщика 50-70 товаров, при общем количестве различных товаров около 100 штук. То есть товары очень часто повторяются, только цена разная. Все просто - у нас есть код товара и цена. Я хочу выводить только предложения с лучшей ценой. Думаю поставщики у меня будут публикации. К каждой публикации думаю прицепить произвольные поля с кодом продукта(ключ) и ценой(значение). Если посоветуете что-то лучше - буду признателен. А пока, хочу вывести на главной странице наиболее популярные(категория) товары.
То есть, N публикаций(поставшиков), у каждой из них N произвольных полей(код продукта) и значений(цена). Надо вывести список публикаций, в котором будет код продукта минимальная цена и название поставщика. Мысли ползут в сторону сортировок по названию продукта а потом по возрастанию цены, в результате первое уникальное попадание кода продукта выводится остальные опускаются. Но результат не будет корректен, так как у каждой публикации(поставщика) ге один, а много продуктов... каламбур начинается) В общем, думаю два цикла нужны. Или один, но обходить надо не публикации, а все произвольные поля сортируя по названию потом по значению - первое попадание названия оставляем, остальные опускаем.
Я не силен в таксономиях всяких, потому буду рад совету как эту кухню лучше организовать. Может уже был опыт.
мне кажется начать надо с того, что сделать поставщиков рубриками для товаров
Здравствуйте. Как сделать пагинацию понятно. Но как её отобразить? Чтобы было как на динамической странице WP?
Добрый день!
я полагаю, вы имеете ввиду это.
Точно! Оно. Но как-то сложновато. Шаблон страницы надо создавать. Будем пробовать.
Если возникнут вопросы, обращайтесь :)
Привет! Подскажи пожалуйста, я вывожу записи в рубрике вот так:
но перестала работать pagenavi (не плагин). Как правильно выводить постраничную навигацию для такой конструкции?
Привет!
Вопрос 1. pagenavi нужно для этого цикла?
Вопрос 2. в каком файле используется этот код?
Доброе утро, Миш.
Помоги, пожалуйста, с пагинацией.
Ставлю фильтр, код такой
Пагинация есть, но когда я хочу отсортировать записи на второй странице, они перестраиваются без учета постараничной разбивки. Т.е. сначала сортируется, а потом разбивается на страницы, получается, что те товары, которые были на этой странице, исчезают.
Пробовала вписать принудительно &posts_per_page=5 , но не помогло.
Доброго времени суток)
попробуй это добавить после
query_posts()
::(( не получается, все равно сначала выстраиваются, потом разбиваются на страницы.. или можно сделать так, чтобы выбранный пользователем порядок сохранялся при переходе на следующую страницу, а то на ней снова значения по умолчанию.
хм, тогда такой вопрос - как называется файл, в котором используется код выше?
category.php
после фильтра идет стандартный цикл if ( have_posts() ) : while (have_posts()) : the_post();
вставлять $wp_query->is_category = true; тоже пробовала..
а, в таком случае вот: https://misha.agency/blog/wordpress/pre-modify-queries.html (способ 2)
Здравствуйте, Миша!
Не пойму, как использовать поисковый механизм WordPress (который работает через стандартную форму поиска по сайту, только кастомный запрос делать в самом коде). По идее он тоже должен работать через этот класс, но не пойму, какой метод и параметры. Хочется поисковые подсказки на сайте сделать, и не пойму как.
Фу блин, протупил, параметр 's' в самом низу, я его не заметил, только когда несколько раз перечитал увидел. Спасибо, вопрос снят!
Здравствуйте!
Рад, что разобрались :) Желаю вам дальнейших успехов!
Благодарю!
Добрый день. Столкнулся с задачей и уже несколько дней не могу решить
есть вот такая такосономия
использую фот эти параметры и перепробовал много других чтоб вывести купон из определённой рубрики например с id 16
День добрый)
Здравствуйте, Михаил. Статья познавательная. Спасибо, но я не специалист в Query, поэтому не все понял.
В связи с этим, не поможете советом решить одну проблему?
Необходимо сделать так, чтобы одна статья, допустим с id 4562, не показывалась в этом списке. Т.е. надо исключить из списка конкретную публикацию. Какой кусок кода и куда надо вставить?
Доброго времени суток:
P.S. для вставки кода используйте пожалуйста специально предназначенные для этого кнопки над формой комментария.
Добрый день, Михаил. Бьюсь с созданием слайдера. Идея такая, чтобы в заголовке отображалось название рубрики. А ниже последняя добавленная статья. Помогите пожалуйста.
Вот мой код
Добры день, Елена!
А какой собственно вопрос?)
Подскажите, как из каждой рубрики вывести одну последнюю статью. Причем с указанием рубрики.
И еще почему-то не выводятся картинки в предыдущем коде. В общем косячу , а где не пойму.
Вы не против, если я вам просто покажу как, но не буду писать готовый код?
Для того, чтобы вывести одну последнюю статью из каждой рубрики, прокручиваем рубрики через функцию get_terms(), а затем для каждой итерации цикла выводим 1 пост при помощи WP_Query.
А почему картинки не делаете через get_the_post_thumbnail()?
Добрый день подскажите пожалуйста.
Использую плагин woocomerce а наполняю прям в базу, при этом прописывают только самую последнюю дочернюю рубрику. Как мне вывести товары всех дочерних (всех уровней) находясь в родительской и чтоб находясь в дочерней то показывались все товары содержащиеся в ней и её дочерних?
Добрый день! Woocommerce забыл совсем) А вообще — через WP_Query.
А есть ли какой-то способ вывести все записи верхнего уровня у которых нет дочерних записей? Второй вечер уже над этой задачей бьюсь — ничего придумать не могу :-(
Можно, первое, что мне пришло в голову:
Затем в цикле для каждой записи делать проверку:
Спасибо большое.
Скажите, почему не работает:
не находить запись произвольного типа(запись такая есть).
Не находить? Может тогда
post__not_in
?это опечатка)
нужно именно определенной таксономии, определенные по id записи.
Тогда должно работать, вероятнее всего в других параметрах есть какая-то ошибка. Иногда даже из-за несовпадения в
post_status
могут посты не выводиться)Спасибо за уделенное мне время, действительно ошибка была в других параметрах.
Помогите очень нужно.
Нахожусь в категории 3, мне нужно вывести посты из категории 2, исключая катерию 8.
(Посты есть с категорией 2 и (2 и 8) )
Пробовали использовать совместно
category__in
иcategory__not_in
?здравствуйте. подскажите пжл
как на материнской странице вывести дочерние страницы 2 уровня, по данной материнской страницы
Тоесть есть, такая структура: Производитель -> Категория товара -> Товар
Нужно: на странице Производитель вывести Товары
Спс заранее.
Здравствуйте! Подскажите как правильно мне вывести, например нужно сделать вывод 10 записей с одинаковым произвольным полем в сайдбаре. Произвольные поля были сделаны с помощью плагина Custom Field Suite. Сайт на кулинарную тематику. Есть произвольное поле - КУХНЯ, вот хочу чтобы в сайдбаре был список рецептов с произвольным полем - кухня : русская (например).
Здравствуйте! Смотрите вот тут.
Здравствуйте. А как вывести произвольные типы записей?
Здравствуйте! А вот же #post_types.
Миша, подскажите, пожалуйста: этот tax_query мне надо вставлять куда, если я хочу исключить в архивах таксономий посты дочерних таксономий?
В taxonomy или в function?
Вы всё правильно сделали, ответил вам в той статье.
Миша привет! Подскажи может сталкивался с подобной ситуацией.
Есть custom post type и custom taxonomy, мне нужно сделать сортировку и вывод постов сначала по taxonomy name а после по названию поста.
С сортировкой по названию поста все ясно, а как быть с сортировкой по taxonomy name?
Привет!
Ну похоже под эту задачу нужно делать sql-запросы.
Миша, привет. Использую wp_query для вывода товаров.
Но проблема в том, что запрос берет 16 товаров, выкидывает 3, которых нет в наличии и выводит на страницу только 13. Как можно сделать, чтобы заброс брал 16 товаров подходящие по условиям?
Как воспользоваться WP_Query на отдельной странице?
Например я делаю запрос на страницу test.php (это не шаблон просто php страница)
Что надо подключить?
Спасибо
Помогите пожалуйста решить проблемку)
Есть 2 произвольных типа записей (service, promo) и произвольная категория (brand), которая их объединяет (у каждого бренда есть несколько акций).
service - это страница услуги, promo - это акция. Мне нужно вывести акции на странице услуги, той же категории (brand)
пытаюсь так
Попробуйте вот так :)
'post_type' => array( 'service', 'promo' ),