You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤WooCommerce REST API的响应数据?

Solutions to Trim WooCommerce REST API Response Fields

Hey there, I’ve dealt with this exact frustration before—WooCommerce’s REST API sends way more data than necessary by default, and generic WP REST filter plugins don’t play well with Woo’s custom endpoints. Let’s walk through actionable solutions that actually work:

1. Use WooCommerce’s Built-In _fields Parameter

WooCommerce supports the _fields query parameter out of the box, which lets you specify exactly which fields you want returned. This is the simplest solution if your needs are straightforward.

Example Request

To fetch only product ID, slug, and images for a specific category, append _fields to your API call:

GET /wp-json/wc/v3/products?category=123&_fields=id,slug,images

Notes:

  • You can target nested fields too. For example, if you only want the image source URL instead of the full image object, use _fields=id,slug,images.src
  • This works for most WooCommerce endpoints (products, orders, etc.) and requires no code changes.

2. Filter Responses with Custom PHP Code

If the _fields parameter isn’t granular enough (e.g., you want to modify nested data like image objects), use WooCommerce’s dedicated filter hook to customize the response.

Add this code to your theme’s functions.php file or a custom plugin (using a plugin is safer to avoid losing changes when updating your theme):

add_filter( 'woocommerce_rest_prepare_product_object', 'custom_filter_wc_product_rest_response', 10, 3 );
function custom_filter_wc_product_rest_response( $response, $product, $request ) {
    // Optional: Only apply this filter to specific routes (e.g., product category requests)
    if ( ! str_contains( $request->get_route(), '/products' ) || ! isset( $request['category'] ) ) {
        return $response;
    }

    // Build your filtered response with only the fields you need
    $filtered_data = array(
        'id'    => $response->data['id'],
        'slug'  => $response->data['slug'],
        'images' => array_map( function( $image ) {
            // Return just the image URL and alt text (customize this as needed)
            return array(
                'src' => $image['src'],
                'alt' => $image['alt'] ?? ''
            );
        }, $response->data['images'] ?? array() )
    );

    // Replace the default response data with your filtered version
    $response->set_data( $filtered_data );

    return $response;
}

This hook runs right before the product data is sent in the API response, so you have full control over what gets included.

3. Create a Custom REST Endpoint

For complete control over the response structure, build a custom REST endpoint that returns exactly the data you need. This is ideal if you have very specific requirements that the default endpoints can’t accommodate.

Here’s an example of a custom endpoint that fetches trimmed product data for a given category:

add_action( 'rest_api_init', 'register_custom_wc_product_endpoint' );
function register_custom_wc_product_endpoint() {
    register_rest_route( 'custom/v1', '/products/category/(?P<category_id>\d+)', array(
        'methods'  => WP_REST_Server::READABLE, // Equivalent to GET
        'callback' => 'custom_get_category_products',
        'permission_callback' => function() {
            // Allow public access (adjust this if you need authenticated requests)
            return true;
        }
    ) );
}

function custom_get_category_products( $request ) {
    $category_id = $request['category_id'];
    // Fetch products from the specified category
    $products = wc_get_products( array(
        'category' => array( $category_id ),
        'limit'    => 20 // Adjust the number of products returned as needed
    ) );

    $filtered_products = array();
    foreach ( $products as $product ) {
        $filtered_products[] = array(
            'id'    => $product->get_id(),
            'slug'  => $product->get_slug(),
            'images' => array_map( function( $image_id ) {
                return array(
                    'src' => wp_get_attachment_image_url( $image_id, 'medium' ), // Use your preferred image size
                    'alt' => get_post_meta( $image_id, '_wp_attachment_image_alt', true ) ?? ''
                );
            }, $product->get_gallery_image_ids() ? array_merge( array( $product->get_image_id() ), $product->get_gallery_image_ids() ) : array() )
        );
    }

    return rest_ensure_response( $filtered_products );
}

Use the Custom Endpoint

Call this endpoint to get your trimmed product data:

GET /wp-json/custom/v1/products/category/123

Final Tips

  • Test your API calls with tools like Postman or curl to verify the response is filtered correctly.
  • If you’re using authentication (OAuth or API keys), make sure your requests still include valid credentials.
  • For large datasets, filtering responses will reduce bandwidth usage and speed up your app significantly.

内容的提问来源于stack exchange,提问作者sachinmaharjan182

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:11:12