skip to Main Content

Is there a way to extend the products-object in the woocommerce rest api /wp-json/wc/v3/products, in a non-destructive way, so plugins that uses that endpoint, doesn’t break.

I’ve currently tried create my own rest endpoint to replicate the object, but that is now missing alot of data ofc.

I’ve also tried something like this, but it didn’t seem to work.

add_filter( 'woocommerce_rest_prepare_product', 'wc_rest_api_add_custom_data_to_product', 90, 2 );
function wc_rest_api_add_custom_data_to_product( $response, $post ) {

  // retrieve a custom field and add it to API response
  $response->data['your_new_key'] = get_post_meta( $post->ID, '_your_custom_filed_key', true );

  return $response;

}

Source: https://francescocarlucci.com/woocommerce/woocommerce-api-custom-data-default-endpoints/

Any help in this regard would be much appreciated.

2

Answers


  1. Chosen as BEST ANSWER

    I found a way of extending the endpoint with register_rest_field.

    That way I can both extend (add) and overwrite (update) an object.

    function register_images_field() {
            register_rest_field(
                'product',
                'images',
                array(
                    'get_callback'    => function ( $object ) {
                        $medium_large     = wp_get_attachment_image_src( get_post_thumbnail_id( $object['id'] ), 'medium_large' );
                        $medium_large_url = $medium_large['0'];
                        $large            = wp_get_attachment_image_src( get_post_thumbnail_id( $object['id'] ), 'large' );
                        $large_url        = $large['0'];
    ​
                        return array(
                            'medium_large' => $medium_large_url,
                            'large'        => $large_url,
                        );
                    },
                    'update_callback' => null,
                    'schema'          => null,
                )
            );
        }
    

    Source: https://developer.wordpress.org/reference/functions/register_rest_field/


  2. Here a way to change prices. Maybe you can use the same process?

    ## The following goes inside the constructor ##
    
    // Simple, grouped and external products
    add_filter('woocommerce_product_get_price', array( $this, 'custom_price' ), 99, 2 );
    add_filter('woocommerce_product_get_regular_price', array( $this, 'custom_price' ), 99, 2 );
    // Variations 
    add_filter('woocommerce_product_variation_get_regular_price', array( $this, 'custom_price' ), 99, 2 );
    add_filter('woocommerce_product_variation_get_price', array( $this, 'custom_price' ), 99, 2 );
    
    // Variable (price range)
    add_filter('woocommerce_variation_prices_price', array( $this, 'custom_variable_price' ), 99, 3 );
    add_filter('woocommerce_variation_prices_regular_price', array( $this, 'custom_variable_price' ), 99, 3 );
    
    // Handling price caching (see explanations at the end)
    add_filter( 'woocommerce_get_variation_prices_hash', array( $this, 'add_price_multiplier_to_variation_prices_hash' ), 99, 1 );
    
    
    ## This goes outside the constructor ##
    
    // Utility function to change the prices with a multiplier (number)
    public function get_price_multiplier() {
        return 2; // x2 for testing
    }
    
    public function custom_price( $price, $product ) {
        return $price * get_price_multiplier();
    }
    
    public function custom_variable_price( $price, $variation, $product ) {
        return $price * get_price_multiplier();
    }
    
    public function add_price_multiplier_to_variation_prices_hash( $hash ) {
        $hash[] = get_price_multiplier();
        return $hash;
    }
    

    Source: Change product prices via a hook in WooCommerce 3

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search