6

I am trying to retrieve all products using rest api. I have read this question. I am using postman to make calls. Here is my query

https://squatwolf.com/wp-json/wc/v2/products?filter[posts_per_page] =-1

The query shows only 10 results.

Sagar Bahadur Tamang
  • 2,670
  • 2
  • 24
  • 41

9 Answers9

10

This isn't the latest API endpoint:

/wc-api/v3/products?filter[limit]=

You have to fetch page per page to get all the products:

$page = 1;
$products = [];
$all_products = [];
do{
  try {
    $products = $wc->get('products',array('per_page' => 100, 'page' => $page));
  }catch(HttpClientException $e){
    die("Can't get products: $e");
  }
  $all_products = array_merge($all_products,$products);
  $page++;
} while (count($products) > 0);
spartanz51
  • 311
  • 3
  • 9
  • 3
    Since the default orderby is 'date' the records can be returned out of order as you page, leading to duplicated and missing records. Make sure to sort by id to get all records: $products = $wc->get('products',array('ordery' => 'id', 'per_page' => 100, 'page' => $page)); – Manuel Guzman Mar 29 '22 at 22:48
  • Thank you @ManuelGuzman it blows my mind that when ordering by date it can lose products along the way. Ordering by id fixed my problem – Daan Apr 06 '22 at 11:54
6

I was able to find the data using the following solution,

https://squatwolf.com/wc-api/v3/products?filter[limit] =-1
5

This worked for me. With API v3

/wc-api/v3/products?

Retrieve first 500 products by default or

/wc-api/v3/products?per_page=900

To get 900 products

function maximum_api_filter($query_params) {
   $query_params['per_page']['maximum'] = 10000;
   $query_params['per_page']['default'] = 500;
   return $query_params;
}
add_filter('rest_product_collection_params', 'maximum_api_filter', 10, 1 );
4

The filter parameter is no longer supported, see the Docs. So you really need to loop the pages.

Here is how to get all products in JavaScript (for a Gutenberg Block store):

let allProducts = [],
    page = 1

while (page !== false) {
    const products = yield actions.receiveProducts(`/wc-pb/v3/products?per_page=100&page=${page}`)

    if (products.length) {
        allProducts = allProducts.concat(products)
        page++
    } else {
        page = false // last page
    }
}

return actions.setProducts(allProducts)
Fabian von Ellerts
  • 4,763
  • 40
  • 35
4

add code to function.php

function maximum_api_filter($query_params) {
    $query_params['per_page']["maximum"]=100000;
    return $query_params;
}

add_filter('rest_product_collection_params', 'maximum_api_filter');
Akelmj
  • 99
  • 4
1

simple!!! you can use any number in place of 100. Its just the parameter written in https://woocommerce.github.io/woocommerce-rest-api-docs/#list-all-products

https://squatwolf.com/wp-json/wc/v2/products?per_page=100

0
/wp-json/wc/v2/products

and

/wc-api/v3/products

both seems to work, but to get certain number of products I'm using

/wc-api/v3/products?filter[limit]=

put the number of products there. -1 for all products

0

for nodeJS:

  export const getAllProducts = async () => {
    let allProducts = []
    let breakLoop = false
    let page = 1
    while (!breakLoop) {
        const products = await api.get("products", { page })
            .then((response) => {
                return response.data
            })
            .catch((error) => {
                console.log(error.response.data);
            })
        if (products.length === 0 || !products){
            breakLoop = true
        } else {
            allProducts = allProducts.concat(products)
            page = page + 1
        }
    }

    return allProducts
 }
Kamil H
  • 3
  • 1
  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Honsa Stunna May 21 '22 at 17:44
0

If you are using a Laravel package like codexshaper/laravel-woocommerce or corcel/woocommerce or some other package, be careful with the product type in your WooCommerce website. By default when you call $products = Product::all(); it just gives you the products with simple product-type.

This is the list of default product-type in WooCommece:

'simple', 'grouped', 'external', 'variable', 'external', 'subscription', 'variable-subscription'

So You have to specify the product-type of you want to get other products.

$product = WooProduct::all(['per_page'=> '100','type'=>'simple']);
Malki Mohamed
  • 1,578
  • 2
  • 23
  • 40