Отримайте список продуктів для заданого ідентифікатора категорії


14

Не вдалося знайти правильний спосіб отримати список усіх продуктів для даного ідентифікатора категорії (не найменування категорії).

Код, який я використовую для отримання списку категорій, такий, він працює добре:

$args = array(
           'orderby'    => $orderby,
           'order'      => $order,
           'hide_empty' => 0,
           'include'    => $ids,
           'parent'    => 0,
     ); 

$categories = get_terms( 'product_cat', $args );

Однак зараз для даного ідентифікатора категорії (скажімо 47) я не зміг знайти способи отримати його відповідні товари. Я спробував наступним чином:

$args = array( 
    'posts_per_page' => 5,
    'offset'=> 1,
    'category' => 47
 );

$products = get_posts( $args );
echo var_dump($products);

Налагодження $productsмасиву повертає завжди 0, що неправильно, оскільки я знаю, що є деякі продукти під категорією з ідентифікатором 47. Будь-які ідеї, як виправити свій код?


1
categoryабо product_category?
фуксія

Відповіді:


19

Я підозрюю, що головна проблема полягає в тому, що ви повинні використовувати WP_Queryоб'єкт, а не get_posts(). Пізніше за замовчуванням повертаються лише елементи, що містять пост_тип postпродуктів,

Отож, давши категорію з ідентифікатором 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 для отримання більш детальної інформації про те, як працює націлювання на категорії - часто корисніше отримати його за допомогою slug, ніж за ідентифікатором!


Рішення спрацювало. Приємне пояснення.
Камеш Джунгі

1
Станом на Woocommerce 3, видимість змінюється на систематику замість мета, тому вам потрібно змінити мета_запит на tax_query. Дивіться wordpress.stackexchange.com/a/262628/37355 .
jarnoan

Ваш висновок про get_posts()неправильне. Ви можете замінити new WP_Query($args)з get_posts($args)в вашому коді , і він буде працювати.
Бьорн

3
$products = wc_get_products(array(
    'category' => array('your-category-slug'),
));

ОП спеціально попросив отримати продукти за допомогою ідентифікатора категорії, однак це мені допомогло, тому я все-таки виправдаю пропозицію. Зауважте лише, що він не відповідає на початкове запитання
dKen

2

змінити категорію (category-slug-name) за id або ім'ям або слизом

<?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(); ?>

2

Трохи запізнюємось, але хотілося б прояснити речі та дати більш чітку відповідь. Користувач @ benz001 дав можливу обґрунтовану відповідь, але сказав щось не так: get_postsповертає будь-які типи публікацій, дефолт - до postsтипу "post-type" WP_Query. Справжні відмінності між цими двома чудово пояснюються ТУТ .

Справа в тому, що в ОП просто не вистачало деяких параметрів у $argsмасиві:

  • Визначення типу "пост", який він шукає:

        'post_type'             => 'product',
  • І модифікація "таксономічної частини" пошукового запиту:

        'tax_query' => array(
            array(
                'taxonomy' => 'product_cat',
                'terms' => 26,
                'operator' => 'IN',
            )
        )
    

Таким чином ваші наступні рядки

$products = new WP_Query($args);
var_dump($products);

Покаже вам потрібні продукти :)

Усі інші додаткові параметри, показані @ benz001, звичайно, дійсні, але не вимагаються ОП, тому я вирішив залишити їх у цій відповіді.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.