Adding Products to Cart Using WooCommerce REST API
The WooCommerce REST API provides a powerful way to interact with your online store's data programmatically. One of the common requirements for developers is to add products to the cart using the API. This article will guide you through the process with code samples and detailed explanations.
Prerequisites
Before we begin, ensure you have the following:
- A WooCommerce store set up.
- REST API credentials (Consumer Key and Consumer Secret) from your WooCommerce store.
- Basic understanding of HTTP requests and JSON.
Getting Started with WooCommerce REST API
Setting Up API Credentials
First, you need to generate API keys from your WooCommerce store:
- Navigate to WooCommerce > Settings > Advanced > REST API.
- Click "Add Key".
- Fill in the description, choose a user with read/write access, and set the permission to "Read/Write".
- Click "Generate API Key".
Save the Consumer Key and Consumer Secret provided.
API Client Setup
To interact with the WooCommerce REST API, we'll use an HTTP client. For this example, we'll use axios
in a Node.js environment.
Install axios
via npm:
bashnpm install axios
Base Setup
Create a basic setup for making API requests:
javascriptconst axios = require('axios');
const consumerKey = 'ck_your_consumer_key';
const consumerSecret = 'cs_your_consumer_secret';
const instance = axios.create({
baseURL: 'https://your-woocommerce-site.com/wp-json/wc/v3/',
auth: {
username: consumerKey,
password: consumerSecret
}
});
instance.interceptors.request.use(request => {
console.log('Starting Request', request);
return request;
});
instance.interceptors.response.use(response => {
console.log('Response:', response);
return response;
});
module.exports = instance;
Adding a Product to Cart
Step 1: Retrieve Cart Information
First, we need to retrieve the current cart information. This is useful to ensure the cart exists and to get the cart's contents.
javascriptconst getCart = async () => {
try {
const response = await instance.get('cart');
console.log('Cart:', response.data);
} catch (error) {
console.error('Error fetching cart:', error);
}
};
getCart();
Step 2: Add Product to Cart
To add a product to the cart, we'll send a POST request to the /cart/add
endpoint with the product ID and quantity.
javascriptconst addToCart = async (productId, quantity = 1) => {
try {
const response = await instance.post('cart/add', {
id: productId,
quantity: quantity
});
console.log('Product added to cart:', response.data);
} catch (error) {
console.error('Error adding product to cart:', error);
}
};
// Example usage:
addToCart(123); // Replace 123 with your product ID
Step 3: Verify Cart Contents
After adding the product, you can verify the cart contents by fetching the cart again:
javascriptconst getCartContents = async () => {
try {
const response = await instance.get('cart');
console.log('Updated Cart:', response.data);
} catch (error) {
console.error('Error fetching updated cart:', error);
}
};
getCartContents();
Handling Errors
It's important to handle errors that may occur during the API requests. Here is an example of improved error handling:
javascriptconst addToCart = async (productId, quantity = 1) => {
try {
const response = await instance.post('cart/add', {
id: productId,
quantity: quantity
});
console.log('Product added to cart:', response.data);
} catch (error) {
if (error.response) {
// The request was made and the server responded with a status code
// that falls out of the range of 2xx
console.error('Error response data:', error.response.data);
console.error('Error response status:', error.response.status);
console.error('Error response headers:', error.response.headers);
} else if (error.request) {
// The request was made but no response was received
console.error('Error request data:', error.request);
} else {
// Something happened in setting up the request that triggered an Error
console.error('Error message:', error.message);
}
console.error('Error config:', error.config);
}
};
Full Example
Here's the full example combining all the steps:
javascriptconst axios = require('axios');
const consumerKey = 'ck_your_consumer_key';
const consumerSecret = 'cs_your_consumer_secret';
const instance = axios.create({
baseURL: 'https://your-woocommerce-site.com/wp-json/wc/v3/',
auth: {
username: consumerKey,
password: consumerSecret
}
});
instance.interceptors.request.use(request => {
console.log('Starting Request', request);
return request;
});
instance.interceptors.response.use(response => {
console.log('Response:', response);
return response;
});
const getCart = async () => {
try {
const response = await instance.get('cart');
console.log('Cart:', response.data);
} catch (error) {
console.error('Error fetching cart:', error);
}
};
const addToCart = async (productId, quantity = 1) => {
try {
const response = await instance.post('cart/add', {
id: productId,
quantity: quantity
});
console.log('Product added to cart:', response.data);
} catch (error) {
if (error.response) {
console.error('Error response data:', error.response.data);
console.error('Error response status:', error.response.status);
console.error('Error response headers:', error.response.headers);
} else if (error.request) {
console.error('Error request data:', error.request);
} else {
console.error('Error message:', error.message);
}
console.error('Error config:', error.config);
}
};
const getCartContents = async () => {
try {
const response = await instance.get('cart');
console.log('Updated Cart:', response.data);
} catch (error) {
console.error('Error fetching updated cart:', error);
}
};
// Example usage:
(async () => {
await getCart();
await addToCart(123); // Replace 123 with your product ID
await getCartContents();
})();
Adding products to a cart using the WooCommerce REST API involves making a few HTTP requests to retrieve the cart, add items, and verify the contents. By understanding how to make these requests and handle potential errors, you can create a seamless experience for your customers and efficiently manage the cart programmatically.
Advanced Cases
There are several advanced scenarios and edge cases when dealing with adding products to the cart via the WooCommerce REST API. These can include:
- Adding variable products to the cart.
- Managing inventory and checking stock before adding items to the cart.
- Handling custom product fields.
- Adding multiple products at once.
- Handling different user sessions.
Let's dive into each case with detailed explanations and code samples.
1. Adding Variable Products to the Cart
Variable products have variations (e.g., different sizes, colors). To add a variable product to the cart, you need to specify the variation ID instead of the product ID.
javascriptconst addToCartVariableProduct = async (productId, variationId, quantity = 1) => {
try {
const response = await instance.post('cart/add', {
id: productId,
variation_id: variationId,
quantity: quantity
});
console.log('Variable product added to cart:', response.data);
} catch (error) {
handleApiError(error);
}
};
// Example usage:
addToCartVariableProduct(123, 456); // Replace with your product and variation IDs
2. Managing Inventory and Checking Stock
Before adding a product to the cart, you might want to check if the product is in stock.
javascriptconst checkStockAndAddToCart = async (productId, quantity = 1) => {
try {
const productResponse = await instance.get(`products/${productId}`);
const product = productResponse.data;
if (product.stock_status === 'instock' && product.stock_quantity >= quantity) {
await addToCart(productId, quantity);
} else {
console.error('Product is out of stock or insufficient quantity available.');
}
} catch (error) {
handleApiError(error);
}
};
// Example usage:
checkStockAndAddToCart(123, 2); // Replace 123 with your product ID
3. Handling Custom Product Fields
If your products have custom fields that need to be considered when adding to the cart, include them in the request.
javascriptconst addToCartWithCustomFields = async (productId, customFields, quantity = 1) => {
try {
const response = await instance.post('cart/add', {
id: productId,
quantity: quantity,
custom_fields: customFields // Assuming your WooCommerce setup can handle this
});
console.log('Product with custom fields added to cart:', response.data);
} catch (error) {
handleApiError(error);
}
};
// Example usage:
addToCartWithCustomFields(123, { gift_wrap: true, message: "Happy Birthday!" });
4. Adding Multiple Products at Once
To add multiple products to the cart in one API call, you can iterate over an array of products.
javascriptconst addMultipleProductsToCart = async (products) => {
try {
for (const product of products) {
await instance.post('cart/add', {
id: product.id,
quantity: product.quantity
});
}
console.log('Multiple products added to cart.');
} catch (error) {
handleApiError(error);
}
};
// Example usage:
addMultipleProductsToCart([
{ id: 123, quantity: 1 },
{ id: 456, quantity: 2 }
]);
5. Handling Different User Sessions
To handle different user sessions, you need to manage session tokens or cookies that identify unique users. Here’s an example using a session token:
javascriptconst axios = require('axios');
const consumerKey = 'ck_your_consumer_key';
const consumerSecret = 'cs_your_consumer_secret';
const createInstanceForSession = (sessionToken) => {
return axios.create({
baseURL: 'https://your-woocommerce-site.com/wp-json/wc/v3/',
headers: { 'X-WC-Session': sessionToken },
auth: {
username: consumerKey,
password: consumerSecret
}
});
};
const addToCartForSession = async (sessionToken, productId, quantity = 1) => {
const instance = createInstanceForSession(sessionToken);
try {
const response = await instance.post('cart/add', {
id: productId,
quantity: quantity
});
console.log('Product added to cart for session:', response.data);
} catch (error) {
handleApiError(error);
}
};
// Example usage:
const sessionToken = 'your_session_token'; // Get this from your authentication flow
addToCartForSession(sessionToken, 123, 1);
Error Handling Function
Here's a reusable error handling function:
javascriptconst handleApiError = (error) => {
if (error.response) {
console.error('Error response data:', error.response.data);
console.error('Error response status:', error.response.status);
console.error('Error response headers:', error.response.headers);
} else if (error.request) {
console.error('Error request data:', error.request);
} else {
console.error('Error message:', error.message);
}
console.error('Error config:', error.config);
};
Handling advanced cases and edge scenarios requires careful management of product variations, inventory checks, custom fields, bulk additions, and user sessions. By understanding these concepts and using the provided code snippets, you can build robust integrations with the WooCommerce REST API to manage your store's cart functionality programmatically.
Common Errors and Their Solutions
When working with the WooCommerce REST API for adding products to the cart, you may encounter several common errors. Here are some typical errors and their solutions:
1. Authentication Errors
Error:
json{
"code": "woocommerce_rest_authentication_error",
"message": "Consumer key is invalid.",
"data": {
"status": 401
}
}
Solution:
- Ensure that the Consumer Key and Consumer Secret are correct.
- Check if the API keys have the necessary permissions (Read/Write).
- Verify that the keys are not expired or revoked.
javascriptconst consumerKey = 'ck_correct_consumer_key';
const consumerSecret = 'cs_correct_consumer_secret';
2. Invalid Endpoint
Error:
json{
"code": "rest_no_route",
"message": "No route was found matching the URL and request method",
"data": {
"status": 404
}
}
Solution:
- Verify the endpoint URL. The correct endpoint for adding to cart might be different based on your WooCommerce setup or customizations.
javascriptconst instance = axios.create({
baseURL: 'https://your-woocommerce-site.com/wp-json/wc/v3/',
auth: {
username: consumerKey,
password: consumerSecret
}
});
3. Product Not Found
Error:
json{
"code": "woocommerce_rest_product_invalid",
"message": "Invalid product ID.",
"data": {
"status": 404
}
}
Solution:
- Check if the product ID exists in your WooCommerce store.
- Ensure the product is published and not in a draft or trash state.
javascriptconst productId = 123; // Ensure this product ID exists
4. Out of Stock
Error:
json{
"code": "woocommerce_rest_cart_product_out_of_stock",
"message": "You cannot add that amount to the cart — we have 0 in stock and you already have 0 in your cart.",
"data": {
"status": 400
}
}
Solution:
- Check the stock status of the product before adding to the cart.
javascriptconst checkStockAndAddToCart = async (productId, quantity = 1) => {
try {
const productResponse = await instance.get(`products/${productId}`);
const product = productResponse.data;
if (product.stock_status === 'instock' && product.stock_quantity >= quantity) {
await addToCart(productId, quantity);
} else {
console.error('Product is out of stock or insufficient quantity available.');
}
} catch (error) {
handleApiError(error);
}
};
5. Invalid Variation
Error:
json{
"code": "woocommerce_rest_invalid_product_variation",
"message": "The specified product variation is invalid.",
"data": {
"status": 404
}
}
Solution:
- Verify the variation ID and ensure it corresponds to the correct product ID.
javascriptconst addToCartVariableProduct = async (productId, variationId, quantity = 1) => {
try {
const response = await instance.post('cart/add', {
id: productId,
variation_id: variationId,
quantity: quantity
});
console.log('Variable product added to cart:', response.data);
} catch (error) {
handleApiError(error);
}
};
// Example usage:
addToCartVariableProduct(123, 456); // Ensure these IDs are correct
6. Session Management Issues
Error:
json{
"code": "woocommerce_rest_cannot_view",
"message": "Sorry, you cannot view this resource.",
"data": {
"status": 401
}
}
Solution:
- Ensure that the session token or cookie is correctly managed and included in the request headers.
javascriptconst createInstanceForSession = (sessionToken) => {
return axios.create({
baseURL: 'https://your-woocommerce-site.com/wp-json/wc/v3/',
headers: { 'X-WC-Session': sessionToken },
auth: {
username: consumerKey,
password: consumerSecret
}
});
};
const addToCartForSession = async (sessionToken, productId, quantity = 1) => {
const instance = createInstanceForSession(sessionToken);
try {
const response = await instance.post('cart/add', {
id: productId,
quantity: quantity
});
console.log('Product added to cart for session:', response.data);
} catch (error) {
handleApiError(error);
}
};
// Example usage:
const sessionToken = 'your_session_token'; // Get this from your authentication flow
addToCartForSession(sessionToken, 123, 1);
7. Custom Field Errors
Error:
json{
"code": "woocommerce_rest_invalid_custom_field",
"message": "The specified custom field is invalid.",
"data": {
"status": 400
}
}
Solution:
- Ensure that the custom fields are correctly formatted and expected by your WooCommerce setup.
javascriptconst addToCartWithCustomFields = async (productId, customFields, quantity = 1) => {
try {
const response = await instance.post('cart/add', {
id: productId,
quantity: quantity,
custom_fields: customFields // Assuming your WooCommerce setup can handle this
});
console.log('Product with custom fields added to cart:', response.data);
} catch (error) {
handleApiError(error);
}
};
// Example usage:
addToCartWithCustomFields(123, { gift_wrap: true, message: "Happy Birthday!" });
Reusable Error Handling Function
A generic error handling function can be reused to simplify error management.
javascriptconst handleApiError = (error) => {
if (error.response) {
console.error('Error response data:', error.response.data);
console.error('Error response status:', error.response.status);
console.error('Error response headers:', error.response.headers);
} else if (error.request) {
console.error('Error request data:', error.request);
} else {
console.error('Error message:', error.message);
}
console.error('Error config:', error.config);
};
By understanding common errors and their solutions, you can better handle issues that arise when adding products to the cart using the WooCommerce REST API. Proper error handling, validation, and checks ensure a robust integration and improve user experience.