Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to extend the woocommerce products rest endpoint?

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.

like image 574
Timm Jensen Avatar asked Sep 20 '19 07:09

Timm Jensen


2 Answers

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/

like image 103
Timm Jensen Avatar answered Oct 17 '22 14:10

Timm Jensen


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

like image 22
Lohardt Avatar answered Oct 17 '22 13:10

Lohardt