'Remove a field from WooCommerce API
My website communicates with retail management software for everything related to products on WooCommerce. Whenever synchronisation takes place, all fields present are sent to WooCommerce overwriting existing data if present.
Since I use the "Description" field within the retail management software for other purposes than WooCommerce where I manually enter SEO-optimised product descriptions, is there a way to disable the writing of the "description" and "short_description" fields during the synchronisation phase? I have no way to manipulate the retail management software and was wondering if there was a function that would allow me to do this.
After your suggestion, no many products were synced to WooCommerce. Here's why:
CRITICAL Uncaught ArgumentCountError: Too few arguments to function alter_product_fields(), 1 passed in /home/u191122490/domains/hange.com/public_html/wp-includes/class-wp-hook.php on line 309 and exactly 3 expected in /home/u191122490/domains/hange.com/public_html/wp-content/themes/bazaar-child/functions.php:91
Stack trace:
#0 /home/u191122490/domains/hange.com/public_html/wp-includes/class-wp-hook.php(309): alter_product_fields(Object(WC_Product_Variable))
#1 /home/u191122490/domains/hange.com/public_html/wp-includes/plugin.php(189): WP_Hook->apply_filters(Object(WC_Product_Variable), Array)
#2 /home/u191122490/domains/hange.com/public_html/wp-content/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-products-controller.php(724): apply_filters('woocommerce_res...', Object(WC_Product_Variable), Object(WP_REST_Request), true)
#3 /home/u191122490/domains/hange.com/public_html/wp-content/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-crud-con in /home/u191122490/domains/hange.com/public_html/wp-content/themes/bazaar-child/functions.php alla riga 91
Solution 1:[1]
The hook woocommerce_rest_pre_insert_{$this->post_type}_object
can be used for altering before inserting/updating a post type through WC Rest API. The $this->post_type
can be 'product', 'shop_order', 'shop_coupon'...etc.
/**
* Filters an object before it is inserted via the REST API.
*
* The dynamic portion of the hook name, `$this->post_type`,
* refers to the object type slug.
*
* @param WC_Data $product Object object.
* @param WP_REST_Request $request Request object.
* @param bool $creating If is creating a new object.
*/
return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $product, $request, $creating );
This $creating
object decides whether it is an update or insert call.
add_filter('woocommerce_rest_pre_insert_product_object', 'alter_product_fields', 10, 3);
function alter_product_fields($product, $request, $creating) {
// $creating -- True If is creating a new object. False is update request
if(!$creating){
$existing_product_details = wc_get_product($product->get_id());
$product->set_description($existing_product_details->get_description());
$product->set_short_description($existing_product_details->get_short_description());
return $product;
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |