Получить список продуктов с заданным идентификатором категории
-
-
`категория` или`product_category`?`category` or `product_category`?
- 1
- 2014-05-14
- fuxia
-
4 ответ
- голосов
-
- 2014-06-02
Я подозреваю,что основная проблема заключается в том,что вам следует использовать объект
WP_Query
,а неget_posts()
. Последний по умолчанию возвращает только элементы сpost_typepost
,но не продуктыИтак,для категории с ID 26 следующий код вернет ее товары (WooCommerce 3+):
$args = array( 'post_type' => 'product', 'post_status' => 'publish', 'ignore_sticky_posts' => 1, 'posts_per_page' => '12', 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'term_id', //This is optional, as it defaults to 'term_id' 'terms' => 26, 'operator' => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'. ), array( 'taxonomy' => 'product_visibility', 'field' => 'slug', 'terms' => 'exclude-from-catalog', // Possibly 'exclude-from-search' too 'operator' => 'NOT IN' ) ) ); $products = new WP_Query($args); var_dump($products);
В более ранних версиях WooCommerce видимость хранилась как метаполе,поэтому код был бы следующим:
$args = array( 'post_type' => 'product', 'post_status' => 'publish', 'ignore_sticky_posts' => 1, 'posts_per_page' => '12', 'meta_query' => array( array( 'key' => '_visibility', 'value' => array('catalog', 'visible'), 'compare' => 'IN' ) ), 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'term_id', //This is optional, as it defaults to 'term_id' 'terms' => 26, 'operator' => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'. ) ) ); $products = new WP_Query($args); var_dump($products);
Здесь мы возвращаем только видимые товары,по 12 на страницу.
Просмотрите http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters для получения дополнительной информации о том,как работает таргетинг на категории - часто бывает полезнее получить его по слагу,чем по идентификатору!
I suspect the main problem is that you should be using the
WP_Query
object rather thanget_posts()
. The later by default only returns items with a post_type ofpost
not products,So given a category with ID 26, the following code would return it's products (WooCommerce 3+):
$args = array( 'post_type' => 'product', 'post_status' => 'publish', 'ignore_sticky_posts' => 1, 'posts_per_page' => '12', 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'term_id', //This is optional, as it defaults to 'term_id' 'terms' => 26, 'operator' => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'. ), array( 'taxonomy' => 'product_visibility', 'field' => 'slug', 'terms' => 'exclude-from-catalog', // Possibly 'exclude-from-search' too 'operator' => 'NOT IN' ) ) ); $products = new WP_Query($args); var_dump($products);
In earlier versions of WooCommerce the visibility was stored as a meta field, so the code would be:
$args = array( 'post_type' => 'product', 'post_status' => 'publish', 'ignore_sticky_posts' => 1, 'posts_per_page' => '12', 'meta_query' => array( array( 'key' => '_visibility', 'value' => array('catalog', 'visible'), 'compare' => 'IN' ) ), 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'term_id', //This is optional, as it defaults to 'term_id' 'terms' => 26, 'operator' => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'. ) ) ); $products = new WP_Query($args); var_dump($products);
Here we are only returning visible products, 12 per page.
Have a look through http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters for more details about how the category targeting works - it's often more useful to retrieve it by slug than by ID!
-
Решение сработало.Хорошее объяснение.Solution worked. Nice explanation.
- 0
- 2015-07-10
- Kamesh Jungi
-
Начиная с Woocommerce 3,видимость изменена на таксономию,а не на мета,поэтому вам нужно изменитьmeta_query наtax_query.См. Https://wordpress.stackexchange.com/a/262628/37355.As of Woocommerce 3, visibility is changed to taxonomy instead of meta so you need to change the meta_query to tax_query. See https://wordpress.stackexchange.com/a/262628/37355.
- 1
- 2017-10-18
- jarnoan
-
Ваш вывод о `get_posts ()` неверен.Вы можете заменить `new WP_Query ($ args)` на `get_posts ($ args)` в своем коде,и он будет работать.Your conclusion about `get_posts()` is wrong. You can replace `new WP_Query($args)` with `get_posts($args)` in your code and it will work.
- 0
- 2018-07-14
- Bjorn
-
-
OP специально просил получать продукты с использованием идентификатора категории,однако это помогло мне,так что я все равно проголосую за.Просто имейте в виду,что он не отвечает на исходный вопросOP specifically asked for getting products using a category ID, however, this helped me, so I'll upvote anyhow. Just be aware it doesn't answer the original question
- 1
- 2019-09-24
- dKen
-
-
- 2015-01-19
изменить категорию (название-ярлыка) по идентификатору,имени или ярлыку
<?php $args = array( 'post_type' => 'product', 'stock' => 1, 'posts_per_page' => 2,'product_cat' => 'category-slug-name', 'orderby' =>'date','order' => 'ASC' ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); global $product; ?> Within loop we can fetch Product image, title, description, price etc. <?phpendwhile;wp_reset_query(); ?>
change category (category-slug-name) by id or name or slug
<?php $args = array( 'post_type' => 'product', 'stock' => 1, 'posts_per_page' => 2,'product_cat' => 'category-slug-name', 'orderby' =>'date','order' => 'ASC' ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); global $product; ?> Within loop we can fetch Product image, title, description, price etc. <?phpendwhile;wp_reset_query(); ?>
-
- 2016-11-18
Немного поздно,но хотелось бы прояснить ситуацию и дать более четкий ответ. Пользователь @benz001 дал возможный правильный ответ,но сказал что-то не так:
get_posts
возвращает любые типы сообщений,по умолчанию - тип сообщенияposts
,как иWP_Query
. Настоящие различия между ними прекрасно объяснены ЗДЕСЬ .Дело в том,что у OP просто отсутствовали некоторые параметры в массиве
$args
:-
Определение типа записи,которую он ищет:
'post_type' => 'product',
-
И изменение «таксономической части» поискового запроса:
'tax_query' => array( array( 'taxonomy' => 'product_cat', 'terms' => 26, 'operator' => 'IN', ) )
Таким образом,ваши следующие строки
$products = new WP_Query($args); var_dump($products);
Подскажу нужные товары :)
Все другие дополнительные параметры,показанные @benz001,конечно,действительны,но не запрашиваются OP,поэтому я решил оставить их в этом ответе.
A bit late, but would like to clarify things and provide a cleaner answer. User @benz001 gave a possible valid answer, but said something wrong:
get_posts
returns any kind of post-types, defaulting toposts
post-type, just likeWP_Query
. The real differences between the two are wonderfully explained HERE.The fact is, the OP was simply missing some parameters into the
$args
array:The definition of the post-type he is searching for:
'post_type' => 'product',
And the modification of the "taxonomy part" of the search query:
'tax_query' => array( array( 'taxonomy' => 'product_cat', 'terms' => 26, 'operator' => 'IN', ) )
This way your next lines
$products = new WP_Query($args); var_dump($products);
Will show you the needed products :)
All other additional parameters shown by @benz001 are of course valid but not requested by the OP, so I decided to leave them behind in this answer.
Мне не удалось найти правильный способ получить список всех продуктов для данного идентификатора категории (не названия категории).
Код,который я использую для получения списка категорий,следующий,он отлично работает:
Однако теперь для данного идентификатора категории (например,47) я не мог найти способ получить соответствующие продукты. Я пробовал так:
Отладка массива
$products
всегда возвращает 0,что неверно,поскольку я знаю,что в категории есть продукты с идентификатором 47. Есть идеи,как исправить мой код?