Lấy danh sách sản phẩm của một ID danh mục nhất định


14

Tôi không thể tìm đúng cách để có được danh sách tất cả các sản phẩm cho một ID danh mục nhất định (không phải tên danh mục).

Mã tôi đang sử dụng để có được danh sách danh mục như sau, nó hoạt động tốt:

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

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

Tuy nhiên, bây giờ đối với một ID danh mục nhất định (giả sử 47), tôi không thể tìm ra cách để có được các sản phẩm liên quan. Tôi đã thử cách sau:

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

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

Gỡ lỗi $productsmảng luôn trả về 0 là sai vì tôi biết có một số sản phẩm thuộc danh mục có ID 47. Bạn có ý tưởng nào để sửa mã của mình không?


1
categoryhay product_category?
fuxia

Câu trả lời:


19

Tôi nghi ngờ vấn đề chính là bạn nên sử dụng WP_Queryđối tượng hơn là get_posts(). Theo mặc định, sau này chỉ trả về các mục có post_type postkhông phải sản phẩm,

Vì vậy, được cung cấp một danh mục có ID 26, đoạn mã sau sẽ trả về sản phẩm của nó (WooC Commerce 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);

Trong các phiên bản trước của WooC Commerce, khả năng hiển thị được lưu trữ dưới dạng trường meta, do đó mã sẽ là:

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

Ở đây chúng tôi chỉ trả lại các sản phẩm có thể nhìn thấy, 12 mỗi trang.

Hãy xem qua http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameter để biết thêm chi tiết về cách nhắm mục tiêu danh mục hoạt động - thường hữu ích hơn khi truy xuất nó bằng sên so với ID!


Giải pháp làm việc. Giải thích tốt đẹp.
Kamesh Jungi

1
Kể từ Wooc Commerce 3, khả năng hiển thị được thay đổi thành phân loại thay vì meta, do đó bạn cần thay đổi meta_query thành tax_query. Xem wordpress.stackexchange.com/a/262628/37355 .
jarnoan

Kết luận của bạn get_posts()là sai. Bạn có thể thay thế new WP_Query($args)bằng get_posts($args)mã của bạn và nó sẽ hoạt động.
Bjorn

2

thay đổi danh mục (danh mục tên sên) theo id hoặc tên hoặc sên

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

Một chút muộn, nhưng muốn làm rõ mọi thứ và cung cấp một câu trả lời rõ ràng hơn. Người dùng @ benz001 đã đưa ra một câu trả lời hợp lệ có thể, nhưng đã nói sai: get_poststrả về bất kỳ loại bài đăng nào, mặc định postslà loại bài đăng, giống như WP_Query. Sự khác biệt thực sự giữa hai người được giải thích tuyệt vời TẠI ĐÂY .

Thực tế là, OP chỉ đơn giản là thiếu một số tham số vào $argsmảng:

  • Định nghĩa của loại bài anh ấy đang tìm kiếm:

        'post_type'             => 'product',
  • Và sửa đổi "phần phân loại" của truy vấn tìm kiếm:

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

Bằng cách này, dòng tiếp theo của bạn

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

Sẽ cho bạn thấy những sản phẩm cần thiết :)

Tất cả các tham số bổ sung khác được hiển thị bởi @ benz001 tất nhiên là hợp lệ nhưng không được OP yêu cầu, vì vậy tôi quyết định bỏ lại chúng trong câu trả lời này.


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

OP đặc biệt yêu cầu nhận sản phẩm bằng ID danh mục, tuy nhiên, điều này đã giúp tôi, vì vậy tôi sẽ nâng cao bằng mọi cách. Chỉ cần lưu ý rằng nó không trả lời câu hỏi ban đầu
dKen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.