Merge pull request #7922 from Nils-Fredrik/master

Allow bulk updates / inserts of products according to #7915
This commit is contained in:
Claudio Sanches 2015-04-24 17:12:53 -03:00
commit abf1d90d9b
1 changed files with 40 additions and 1 deletions

View File

@ -76,6 +76,11 @@ class WC_API_Products extends WC_API_Resource {
array( array( $this, 'get_product_by_sku' ), WC_API_Server::READABLE ), array( array( $this, 'get_product_by_sku' ), WC_API_Server::READABLE ),
); );
# POST /products/bulk
$routes[ $this->base . '/bulk' ] = array(
array( array( $this, 'bulk' ), WC_API_SERVER::CREATABLE | WC_API_Server::ACCEPT_DATA ),
);
return $routes; return $routes;
} }
@ -1957,4 +1962,38 @@ class WC_API_Products extends WC_API_Resource {
// Delete product // Delete product
wp_delete_post( $product_id, true ); wp_delete_post( $product_id, true );
} }
/**
* Bulk update or insert products
* Accepts an array with products in the formats supported by
* WC_API_Products->create_product() and WC_API_Products->edit_product()
*
* @param array $products
* @throws Exception
*/
public function bulk( $data ) {
$products = array();
foreach ( $data as $_product ) {
try {
$existing = $this->get_product_by_sku( $_product['sku'] );
if(is_wp_error($existing) && $existing->get_error_code() === "woocommerce_api_invalid_product_sku") {
// SKU not found, go ahead and crate!
$result = $this->create_product($_product);
} else {
// Assume existing, update
$result = $this->edit_product( $existing['product']['id'], $_product );
}
if(is_wp_error($result)) {
// if it fails, add the error message to the return object. Do not! stop further execution.
$products[ $_product['sku'] ] = array( 'error' => array( 'code' => $result->get_error_code(), 'message' => $result->get_error_message() ) );
} else {
// If everything is well, add the updated or created product to the return array
$products[ $_product['sku'] ] = $result;
}
} catch(Exception $e) {
$products[ $_product['sku'] ] = array( 'error' => array( 'code' => $e->getCode(), 'message' => $e->getMessage() ) );
}
}
return array('products'=>$products);
}
} }