6

i am writing a pricing table plugin for woocommerce. the user inserts the shortcode with an id of woocommerce products category and after updating the page the user can see a table with a list of product's names and prices.
how can i get a list of products with the id of their category?!
in the code below $pid is what the user type in shortcode, 'object_id' is the id of the every product in wp_posts table.

<?php
    $products = $wpdb->get_results("SELECT object_id FROM {$wpdb->term_relationships}
                                      WHERE term_taxonomy_id = " . $pid);
    if(!empty($products))
    {
        foreach($products as $product)
        {
            //the code
        }
    }
?>  

Thanks in advance.

Mostafa Ghanbari
  • 369
  • 2
  • 6
  • 21

5 Answers5

10
 $args = array(
    'post_status' => 'publish',
    'tax_query' => array(
       array(
         'taxonomy' => 'product_cat',
         'field'    => 'term_id',
         'terms'     =>  '[ category id here ]', // When you have more term_id's seperate them by komma.
         'operator'  => 'IN'
         )
       )
    );
    $the_query = wp_query($args);

Untested but should work

Dezefy
  • 2,048
  • 1
  • 14
  • 23
Prince Singh
  • 5,023
  • 5
  • 28
  • 32
8

According to Woocommerce documentation WP_Query() or get_posts() should not be used:

wc_get_products and WC_Product_Query provide a standard way of retrieving products that is safe to use and will not break due to database changes in future WooCommerce versions. Building custom WP_Queries or database queries is likely to break your code in future versions of WooCommerce as data moves towards custom tables for better performance. This is the best-practices way for plugin and theme developers to retrieve multiple products. wc_get_products and WC_Product_Query are similar to WordPress get_posts and WP_Query. Just like those, you pass in an array of arguments defining the criteria for the search.

WooCommerce Docs

Here's my solution:

$product_term_ids = array(16,10,4,7);

$product_term_args = array(
    'taxonomy' => 'product_cat',
    'include' => $product_term_ids,
    'orderby'  => 'include'
);
$product_terms = get_terms($product_term_args);

$product_term_slugs = [];
foreach ($product_terms as $product_term) {
    $product_term_slugs[] = $product_term->slug;
}

$product_args = array(
    'post_status' => 'publish',
    'limit' => -1,
    'category' => $product_term_slugs,
    //more options according to wc_get_products() docs
);
$products = wc_get_products($product_args);

foreach ($products as $product) {
    echo $product->get_title();
}

Note: category argument requires an array of slugs, not IDs.

(Tested and works with Wordpress 5.9.3 & WooCommerce 6.4.1.)

Credit: @Christian Lescuyer

J Grandjean
  • 91
  • 1
  • 4
  • This is the more accurate answer since it's using the appropiate method to retrieve full products, with all their attributes and properties. I can't believe there's not a "by ID" way to achieve the same. – Luciano Fantuzzi Dec 10 '22 at 18:46
7

By using the get_posts wordpress function

Get All WooCommerce Product Details by Category

$all_products = get_posts( array(
    'post_type' => 'product',
    'numberposts' => -1,
    'post_status' => 'publish',
    'tax_query' => array(
        array(
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => 'your_product_category', /*category name*/
            'operator' => 'IN',
            )
        ),
    ));
    echo var_dump($all_products);

Get All WooCommerce Product IDs by Category

$all_ids = get_posts( array(
  'post_type' => 'product',
  'numberposts' => -1,
  'post_status' => 'publish',
  'fields' => 'ids',
  'tax_query' => array(
      array(
          'taxonomy' => 'product_cat',
          'field' => 'slug',
          'terms' => 'your_product_category', /*category name*/
          'operator' => 'IN',
          )
       ),
   ));
   foreach ( $all_ids as $id ) {
       echo $id;
   }

Tested and its working fine.

Rahul Shinde
  • 1,522
  • 1
  • 15
  • 17
1

The above (accepted) answer didn't work (more results than there should have been) for me (version 4.9.8)

 'tax_query' => array(
     array(
        'taxonomy' => 'product_cat',
        'field'    => 'term_id',
        'terms'     =>  [$request['id']],
        'operator'  => 'IN'
      )
  )

The above works. I'm not really a Wordpress person but I'd guess it's a version thing...

zak
  • 776
  • 10
  • 10
0
$posts = get_posts(
    array(
       'post_type'   => 'product',
        'numberposts' => -1,
        'post_status' => 'publish',
        'fields'      => 'ids',
        'tax_query'   => array(
            array(
                'taxonomy' => 'product_cat',
                'field'    => 'slug',
                'terms'    => 'books-and-handbooks',
                'operator' => 'IN',
            ),
        ),
    )
);
$arr = array_slice( $all_ids, 0, 50 );
Suraj Rao
  • 29,388
  • 11
  • 94
  • 103
Yogesh
  • 1
  • 3