2016-02-17 19:29:09 +00:00
< ? php
/**
* REST API Product Attributes controller
*
* Handles requests to the products / attributes endpoint .
*
* @ author WooThemes
* @ category API
* @ package WooCommerce / API
* @ since 2.6 . 0
*/
if ( ! defined ( 'ABSPATH' ) ) {
exit ;
}
/**
* REST API Product Attributes controller class .
*
* @ package WooCommerce / API
2016-05-11 19:34:53 +00:00
* @ extends WC_REST_Controller
2016-02-17 19:29:09 +00:00
*/
2016-05-11 19:34:53 +00:00
class WC_REST_Product_Attributes_Controller extends WC_REST_Controller {
2016-02-17 19:29:09 +00:00
2016-03-07 18:36:17 +00:00
/**
* Endpoint namespace .
*
* @ var string
*/
2016-03-31 18:25:31 +00:00
protected $namespace = 'wc/v1' ;
2016-03-07 18:36:17 +00:00
2016-02-17 19:29:09 +00:00
/**
* Route base .
*
* @ var string
*/
2016-02-22 18:49:38 +00:00
protected $rest_base = 'products/attributes' ;
2016-02-17 19:29:09 +00:00
2016-03-07 20:32:25 +00:00
/**
* Attribute name .
*
* @ var string
*/
protected $attribute = '' ;
2016-02-17 19:29:09 +00:00
/**
2016-02-23 18:34:55 +00:00
* Register the routes for product attributes .
2016-02-17 19:29:09 +00:00
*/
public function register_routes () {
2016-03-07 20:32:25 +00:00
register_rest_route ( $this -> namespace , '/' . $this -> rest_base , array (
array (
'methods' => WP_REST_Server :: READABLE ,
'callback' => array ( $this , 'get_items' ),
'permission_callback' => array ( $this , 'get_items_permissions_check' ),
'args' => $this -> get_collection_params (),
),
array (
'methods' => WP_REST_Server :: CREATABLE ,
'callback' => array ( $this , 'create_item' ),
'permission_callback' => array ( $this , 'create_item_permissions_check' ),
'args' => array_merge ( $this -> get_endpoint_args_for_item_schema ( WP_REST_Server :: CREATABLE ), array (
'name' => array (
'required' => true ,
),
) ),
),
'schema' => array ( $this , 'get_public_item_schema' ),
));
register_rest_route ( $this -> namespace , '/' . $this -> rest_base . '/(?P<id>[\d]+)' , array (
array (
'methods' => WP_REST_Server :: READABLE ,
'callback' => array ( $this , 'get_item' ),
'permission_callback' => array ( $this , 'get_item_permissions_check' ),
'args' => array (
'context' => $this -> get_context_param ( array ( 'default' => 'view' ) ),
),
),
array (
'methods' => WP_REST_Server :: EDITABLE ,
'callback' => array ( $this , 'update_item' ),
'permission_callback' => array ( $this , 'update_item_permissions_check' ),
'args' => $this -> get_endpoint_args_for_item_schema ( WP_REST_Server :: EDITABLE ),
),
array (
'methods' => WP_REST_Server :: DELETABLE ,
'callback' => array ( $this , 'delete_item' ),
'permission_callback' => array ( $this , 'delete_item_permissions_check' ),
'args' => array (
'force' => array (
'default' => false ,
'description' => __ ( 'Required to be true, as resource does not support trashing.' , 'woocommerce' ),
),
),
),
'schema' => array ( $this , 'get_public_item_schema' ),
) );
2016-05-24 22:00:49 +00:00
register_rest_route ( $this -> namespace , '/' . $this -> rest_base . '/batch' , array (
array (
'methods' => WP_REST_Server :: EDITABLE ,
'callback' => array ( $this , 'batch_items' ),
'permission_callback' => array ( $this , 'batch_items_permissions_check' ),
'args' => $this -> get_endpoint_args_for_item_schema ( WP_REST_Server :: EDITABLE ),
),
'schema' => array ( $this , 'get_public_batch_schema' ),
) );
2016-03-07 20:32:25 +00:00
}
/**
2016-03-07 22:36:34 +00:00
* Check if a given request has access to read the attributes .
2016-03-07 20:32:25 +00:00
*
* @ param WP_REST_Request $request Full details about the request .
* @ return WP_Error | boolean
*/
public function get_items_permissions_check ( $request ) {
2016-03-30 17:49:22 +00:00
if ( ! wc_rest_check_manager_permissions ( 'attributes' , 'read' ) ) {
return new WP_Error ( 'woocommerce_rest_cannot_view' , __ ( 'Sorry, you cannot list resources.' , 'woocommerce' ), array ( 'status' => rest_authorization_required_code () ) );
2016-03-07 20:32:25 +00:00
}
return true ;
}
/**
2016-03-07 22:36:34 +00:00
* Check if a given request has access to create a attribute .
2016-03-07 20:32:25 +00:00
*
* @ param WP_REST_Request $request Full details about the request .
* @ return WP_Error | boolean
*/
public function create_item_permissions_check ( $request ) {
2016-03-30 17:49:22 +00:00
if ( ! wc_rest_check_manager_permissions ( 'attributes' , 'create' ) ) {
2016-03-07 20:32:25 +00:00
return new WP_Error ( 'woocommerce_rest_cannot_create' , __ ( 'Sorry, you cannot create new resource.' , 'woocommerce' ), array ( 'status' => rest_authorization_required_code () ) );
}
return true ;
}
/**
2016-03-07 22:36:34 +00:00
* Check if a given request has access to read a attribute .
2016-03-07 20:32:25 +00:00
*
* @ param WP_REST_Request $request Full details about the request .
* @ return WP_Error | boolean
*/
public function get_item_permissions_check ( $request ) {
2016-03-30 17:49:22 +00:00
if ( ! $this -> get_taxonomy ( $request ) ) {
return new WP_Error ( " woocommerce_rest_taxonomy_invalid " , __ ( " Resource doesn't exist. " , 'woocommerce' ), array ( 'status' => 404 ) );
}
if ( ! wc_rest_check_manager_permissions ( 'attributes' , 'read' ) ) {
2016-06-05 18:32:46 +00:00
return new WP_Error ( 'woocommerce_rest_cannot_view' , __ ( 'Sorry, you cannot view this resource.' , 'woocommerce' ), array ( 'status' => rest_authorization_required_code () ) );
2016-03-30 17:49:22 +00:00
}
return true ;
2016-03-07 20:32:25 +00:00
}
/**
2016-03-07 22:36:34 +00:00
* Check if a given request has access to update a attribute .
2016-03-07 20:32:25 +00:00
*
* @ param WP_REST_Request $request Full details about the request .
* @ return WP_Error | boolean
*/
public function update_item_permissions_check ( $request ) {
2016-03-30 17:49:22 +00:00
if ( ! $this -> get_taxonomy ( $request ) ) {
2016-03-07 20:32:25 +00:00
return new WP_Error ( " woocommerce_rest_taxonomy_invalid " , __ ( " Resource doesn't exist. " , 'woocommerce' ), array ( 'status' => 404 ) );
}
2016-03-30 17:49:22 +00:00
if ( ! wc_rest_check_manager_permissions ( 'attributes' , 'edit' ) ) {
2016-03-07 20:32:25 +00:00
return new WP_Error ( 'woocommerce_rest_cannot_update' , __ ( 'Sorry, you cannot update resource.' , 'woocommerce' ), array ( 'status' => rest_authorization_required_code () ) );
}
return true ;
}
/**
2016-03-07 22:36:34 +00:00
* Check if a given request has access to delete a attribute .
2016-03-07 20:32:25 +00:00
*
* @ param WP_REST_Request $request Full details about the request .
* @ return WP_Error | boolean
*/
public function delete_item_permissions_check ( $request ) {
2016-03-30 17:49:22 +00:00
if ( ! $this -> get_taxonomy ( $request ) ) {
2016-03-07 20:32:25 +00:00
return new WP_Error ( " woocommerce_rest_taxonomy_invalid " , __ ( " Resource doesn't exist. " , 'woocommerce' ), array ( 'status' => 404 ) );
}
2016-03-30 17:49:22 +00:00
if ( ! wc_rest_check_manager_permissions ( 'attributes' , 'delete' ) ) {
2016-03-07 20:32:25 +00:00
return new WP_Error ( 'woocommerce_rest_cannot_delete' , __ ( 'Sorry, you cannot delete resource.' , 'woocommerce' ), array ( 'status' => rest_authorization_required_code () ) );
}
return true ;
}
2016-05-24 22:00:49 +00:00
/**
* Check if a given request has access batch create , update and delete items .
*
* @ param WP_REST_Request $request Full details about the request .
* @ return boolean
*/
public function batch_items_permissions_check ( $request ) {
if ( ! wc_rest_check_manager_permissions ( 'attributes' , 'batch' ) ) {
return new WP_Error ( 'woocommerce_rest_cannot_batch' , __ ( 'Sorry, you are not allowed to manipule this resource.' , 'woocommerce' ), array ( 'status' => rest_authorization_required_code () ) );
}
return true ;
}
2016-03-07 20:32:25 +00:00
/**
2016-03-07 22:10:03 +00:00
* Get all attributes .
*
* @ param WP_REST_Request $request
* @ return array
*/
public function get_items ( $request ) {
$attributes = wc_get_attribute_taxonomies ();
2016-03-31 19:14:18 +00:00
$data = array ();
2016-03-07 22:10:03 +00:00
foreach ( $attributes as $attribute_obj ) {
$attribute = $this -> prepare_item_for_response ( $attribute_obj , $request );
$attribute = $this -> prepare_response_for_collection ( $attribute );
$data [] = $attribute ;
}
return rest_ensure_response ( $data );
}
2016-03-07 22:36:34 +00:00
/**
* Create a single attribute .
*
* @ param WP_REST_Request $request Full details about the request .
* @ return WP_REST_Request | WP_Error
*/
public function create_item ( $request ) {
global $wpdb ;
$args = array (
'attribute_label' => $request [ 'name' ],
'attribute_name' => $request [ 'slug' ],
2016-05-24 22:00:49 +00:00
'attribute_type' => ! empty ( $request [ 'type' ] ) ? $request [ 'type' ] : 'select' ,
'attribute_orderby' => ! empty ( $request [ 'order_by' ] ) ? $request [ 'order_by' ] : 'menu_order' ,
'attribute_public' => true === $request [ 'has_archives' ],
2016-03-07 22:36:34 +00:00
);
// Set the attribute slug.
if ( empty ( $args [ 'attribute_name' ] ) ) {
$args [ 'attribute_name' ] = wc_sanitize_taxonomy_name ( stripslashes ( $args [ 'attribute_label' ] ) );
} else {
$args [ 'attribute_name' ] = preg_replace ( '/^pa\_/' , '' , wc_sanitize_taxonomy_name ( stripslashes ( $args [ 'attribute_name' ] ) ) );
}
$valid_slug = $this -> validate_attribute_slug ( $args [ 'attribute_name' ], true );
if ( is_wp_error ( $valid_slug ) ) {
return $valid_slug ;
}
$insert = $wpdb -> insert (
$wpdb -> prefix . 'woocommerce_attribute_taxonomies' ,
$args ,
array ( '%s' , '%s' , '%s' , '%s' , '%d' )
);
2016-03-07 22:57:24 +00:00
// Checks for errors.
2016-03-07 22:36:34 +00:00
if ( is_wp_error ( $insert ) ) {
2016-03-09 07:56:35 +00:00
return new WP_Error ( 'woocommerce_rest_cannot_create' , $insert -> get_error_message (), array ( 'status' => 400 ) );
2016-03-07 22:36:34 +00:00
}
$attribute = $this -> get_attribute ( $wpdb -> insert_id );
if ( is_wp_error ( $attribute ) ) {
return $attribute ;
}
$this -> update_additional_fields_for_object ( $attribute , $request );
/**
* Fires after a single product attribute is created or updated via the REST API .
*
* @ param stdObject $attribute Inserted attribute object .
* @ param WP_REST_Request $request Request object .
* @ param boolean $creating True when creating attribute , false when updating .
*/
2016-03-07 22:57:24 +00:00
do_action ( 'woocommerce_rest_insert_product_attribute' , $attribute , $request , true );
2016-03-07 22:36:34 +00:00
2016-04-04 19:13:38 +00:00
$request -> set_param ( 'context' , 'edit' );
2016-03-07 22:36:34 +00:00
$response = $this -> prepare_item_for_response ( $attribute , $request );
$response = rest_ensure_response ( $response );
$response -> set_status ( 201 );
$response -> header ( 'Location' , rest_url ( '/' . $this -> namespace . '/' . $this -> rest_base . '/' . $attribute -> attribute_id ) );
// Clear transients.
flush_rewrite_rules ();
delete_transient ( 'wc_attribute_taxonomies' );
return $response ;
}
2016-03-07 22:10:03 +00:00
/**
* Get a single attribute .
2016-03-07 20:32:25 +00:00
*
* @ param WP_REST_Request $request Full details about the request .
* @ return WP_REST_Request | WP_Error
*/
public function get_item ( $request ) {
global $wpdb ;
2016-03-07 22:10:03 +00:00
$attribute = $this -> get_attribute ( $request [ 'id' ] );
2016-03-07 20:32:25 +00:00
2016-03-07 22:10:03 +00:00
if ( is_wp_error ( $attribute ) ) {
return $attribute ;
2016-03-07 20:32:25 +00:00
}
$response = $this -> prepare_item_for_response ( $attribute , $request );
2016-03-07 22:57:24 +00:00
return rest_ensure_response ( $response );
}
/**
* Update a single term from a taxonomy .
*
* @ param WP_REST_Request $request Full details about the request .
* @ return WP_REST_Request | WP_Error
*/
public function update_item ( $request ) {
global $wpdb ;
$id = ( int ) $request [ 'id' ];
$format = array ( '%s' , '%s' , '%s' , '%s' , '%d' );
$args = array (
'attribute_label' => $request [ 'name' ],
'attribute_name' => $request [ 'slug' ],
'attribute_type' => $request [ 'type' ],
'attribute_orderby' => $request [ 'order_by' ],
'attribute_public' => $request [ 'has_archives' ],
);
$i = 0 ;
foreach ( $args as $key => $value ) {
if ( empty ( $value ) && ! is_bool ( $value ) ) {
unset ( $args [ $key ] );
unset ( $format [ $i ] );
}
$i ++ ;
}
// Set the attribute slug.
if ( ! empty ( $args [ 'attribute_name' ] ) ) {
$args [ 'attribute_name' ] = preg_replace ( '/^pa\_/' , '' , wc_sanitize_taxonomy_name ( stripslashes ( $args [ 'attribute_name' ] ) ) );
2016-07-07 02:23:53 +00:00
$valid_slug = $this -> validate_attribute_slug ( $args [ 'attribute_name' ], false );
2016-03-07 22:57:24 +00:00
if ( is_wp_error ( $valid_slug ) ) {
return $valid_slug ;
}
}
$update = $wpdb -> update (
$wpdb -> prefix . 'woocommerce_attribute_taxonomies' ,
$args ,
array ( 'attribute_id' => $id ),
$format ,
array ( '%d' )
);
// Checks for errors.
if ( false === $update ) {
2016-03-09 07:56:35 +00:00
return new WP_Error ( 'woocommerce_rest_cannot_edit' , __ ( 'Could not edit the attribute' , 'woocommerce' ), array ( 'status' => 400 ) );
2016-03-07 22:57:24 +00:00
}
$attribute = $this -> get_attribute ( $id );
if ( is_wp_error ( $attribute ) ) {
return $attribute ;
}
$this -> update_additional_fields_for_object ( $attribute , $request );
/**
* Fires after a single product attribute is created or updated via the REST API .
*
* @ param stdObject $attribute Inserted attribute object .
* @ param WP_REST_Request $request Request object .
* @ param boolean $creating True when creating attribute , false when updating .
*/
do_action ( 'woocommerce_rest_insert_product_attribute' , $attribute , $request , false );
2016-04-04 19:13:38 +00:00
$request -> set_param ( 'context' , 'edit' );
2016-03-07 22:57:24 +00:00
$response = $this -> prepare_item_for_response ( $attribute , $request );
// Clear transients.
flush_rewrite_rules ();
delete_transient ( 'wc_attribute_taxonomies' );
2016-03-07 20:32:25 +00:00
return rest_ensure_response ( $response );
}
2016-03-07 23:12:51 +00:00
/**
* Delete a single attribute .
*
* @ param WP_REST_Request $request Full details about the request .
* @ return WP_REST_Response | WP_Error
*/
public function delete_item ( $request ) {
global $wpdb ;
$force = isset ( $request [ 'force' ] ) ? ( bool ) $request [ 'force' ] : false ;
// We don't support trashing for this type, error out.
if ( ! $force ) {
return new WP_Error ( 'woocommerce_rest_trash_not_supported' , __ ( 'Resource does not support trashing.' , 'woocommerce' ), array ( 'status' => 501 ) );
}
$attribute = $this -> get_attribute ( $request [ 'id' ] );
if ( is_wp_error ( $attribute ) ) {
return $attribute ;
}
2016-04-04 19:13:38 +00:00
$request -> set_param ( 'context' , 'edit' );
2016-03-07 23:12:51 +00:00
$response = $this -> prepare_item_for_response ( $attribute , $request );
$deleted = $wpdb -> delete (
$wpdb -> prefix . 'woocommerce_attribute_taxonomies' ,
array ( 'attribute_id' => $attribute -> attribute_id ),
array ( '%d' )
);
if ( false === $deleted ) {
return new WP_Error ( 'woocommerce_rest_cannot_delete' , __ ( 'The resource cannot be deleted.' , 'woocommerce' ), array ( 'status' => 500 ) );
}
$taxonomy = wc_attribute_taxonomy_name ( $attribute -> attribute_name );
if ( taxonomy_exists ( $taxonomy ) ) {
$terms = get_terms ( $taxonomy , 'orderby=name&hide_empty=0' );
foreach ( $terms as $term ) {
wp_delete_term ( $term -> term_id , $taxonomy );
}
}
/**
* Fires after a single attribute is deleted via the REST API .
*
* @ param stdObject $attribute The deleted attribute .
* @ param WP_REST_Response $response The response data .
* @ param WP_REST_Request $request The request sent to the API .
*/
do_action ( 'woocommerce_rest_delete_product_attribute' , $attribute , $response , $request );
// Fires woocommerce_attribute_deleted hook.
do_action ( 'woocommerce_attribute_deleted' , $attribute -> attribute_id , $attribute -> attribute_name , $taxonomy );
// Clear transients.
flush_rewrite_rules ();
delete_transient ( 'wc_attribute_taxonomies' );
return $response ;
}
2016-03-07 20:32:25 +00:00
/**
* Prepare a single product attribute output for response .
*
* @ param obj $item Term object .
* @ param WP_REST_Request $request
* @ return WP_REST_Response $response
*/
public function prepare_item_for_response ( $item , $request ) {
$data = array (
'id' => ( int ) $item -> attribute_id ,
'name' => $item -> attribute_label ,
'slug' => wc_attribute_taxonomy_name ( $item -> attribute_name ),
'type' => $item -> attribute_type ,
'order_by' => $item -> attribute_orderby ,
'has_archives' => ( bool ) $item -> attribute_public ,
);
$context = ! empty ( $request [ 'context' ] ) ? $request [ 'context' ] : 'view' ;
$data = $this -> add_additional_fields_to_object ( $data , $request );
$data = $this -> filter_response_by_context ( $data , $context );
$response = rest_ensure_response ( $data );
$response -> add_links ( $this -> prepare_links ( $item ) );
/**
2016-03-07 22:36:34 +00:00
* Filter a attribute item returned from the API .
2016-03-07 20:32:25 +00:00
*
* Allows modification of the product attribute data right before it is returned .
*
* @ param WP_REST_Response $response The response object .
2016-03-07 22:36:34 +00:00
* @ param object $item The original attribute object .
2016-03-07 20:32:25 +00:00
* @ param WP_REST_Request $request Request used to generate the response .
*/
return apply_filters ( 'woocommerce_rest_prepare_product_attribute' , $response , $item , $request );
}
/**
* Prepare links for the request .
*
* @ param object $attribute Attribute object .
* @ return array Links for the given attribute .
*/
protected function prepare_links ( $attribute ) {
2016-03-31 19:14:18 +00:00
$base = '/' . $this -> namespace . '/' . $this -> rest_base ;
2016-03-07 20:32:25 +00:00
$links = array (
'self' => array (
'href' => rest_url ( trailingslashit ( $base ) . $attribute -> attribute_id ),
),
'collection' => array (
'href' => rest_url ( $base ),
),
);
return $links ;
}
/**
2016-03-10 00:34:14 +00:00
* Get the Attribute ' s schema , conforming to JSON Schema .
2016-03-07 20:32:25 +00:00
*
* @ return array
*/
public function get_item_schema () {
$schema = array (
'$schema' => 'http://json-schema.org/draft-04/schema#' ,
'title' => 'product_attribute' ,
'type' => 'object' ,
'properties' => array (
'id' => array (
'description' => __ ( 'Unique identifier for the resource.' , 'woocommerce' ),
'type' => 'integer' ,
'context' => array ( 'view' , 'edit' ),
'readonly' => true ,
),
'name' => array (
'description' => __ ( 'Attribute name.' , 'woocommerce' ),
'type' => 'string' ,
'context' => array ( 'view' , 'edit' ),
'arg_options' => array (
'sanitize_callback' => 'sanitize_text_field' ,
),
),
'slug' => array (
'description' => __ ( 'An alphanumeric identifier for the resource unique to its type.' , 'woocommerce' ),
'type' => 'string' ,
'context' => array ( 'view' , 'edit' ),
'arg_options' => array (
'sanitize_callback' => 'sanitize_title' ,
),
),
'type' => array (
'description' => __ ( 'Type of attribute.' , 'woocommerce' ),
'type' => 'string' ,
'default' => 'select' ,
'enum' => array_keys ( wc_get_attribute_types () ),
'context' => array ( 'view' , 'edit' ),
),
'order_by' => array (
'description' => __ ( 'Default sort order.' , 'woocommerce' ),
'type' => 'string' ,
'default' => 'menu_order' ,
'enum' => array ( 'menu_order' , 'name' , 'name_num' , 'id' ),
'context' => array ( 'view' , 'edit' ),
),
'has_archives' => array (
'description' => __ ( 'Enable/Disable attribute archives.' , 'woocommerce' ),
'type' => 'boolean' ,
2016-03-07 22:36:34 +00:00
'default' => false ,
2016-03-07 20:32:25 +00:00
'context' => array ( 'view' , 'edit' ),
),
),
);
return $this -> add_additional_fields_schema ( $schema );
}
2016-03-07 22:10:03 +00:00
/**
* Get the query params for collections
*
* @ return array
*/
public function get_collection_params () {
2016-03-09 04:46:04 +00:00
$params = array ();
$params [ 'context' ] = $this -> get_context_param ( array ( 'default' => 'view' ) );
2016-03-07 22:10:03 +00:00
2016-03-09 04:46:04 +00:00
return $params ;
2016-03-07 22:10:03 +00:00
}
2016-03-07 20:32:25 +00:00
/**
* Get attribute name .
*
* @ param WP_REST_Request $request Full details about the request .
2016-06-06 16:50:18 +00:00
* @ return string
2016-03-07 20:32:25 +00:00
*/
protected function get_taxonomy ( $request ) {
if ( '' !== $this -> attribute ) {
return $this -> attribute ;
}
if ( $request [ 'id' ] ) {
$name = wc_attribute_taxonomy_name_by_id ( ( int ) $request [ 'id' ] );
$this -> attribute = $name ;
}
2016-02-17 19:29:09 +00:00
2016-03-07 20:32:25 +00:00
return $this -> attribute ;
2016-02-17 19:29:09 +00:00
}
2016-03-07 22:10:03 +00:00
/**
* Get attribute data .
*
* @ param int $id Attribute ID .
* @ return stdClass | WP_Error
*/
protected function get_attribute ( $id ) {
2016-03-07 22:36:34 +00:00
global $wpdb ;
2016-03-07 22:10:03 +00:00
$attribute = $wpdb -> get_row ( $wpdb -> prepare ( "
SELECT *
FROM { $wpdb -> prefix } woocommerce_attribute_taxonomies
WHERE attribute_id = % d
" , $id ) );
if ( is_wp_error ( $attribute ) || is_null ( $attribute ) ) {
return new WP_Error ( 'woocommerce_rest_attribute_invalid' , __ ( " Resource doesn't exist. " , 'woocommerce' ), array ( 'status' => 404 ) );
}
return $attribute ;
}
2016-03-07 22:36:34 +00:00
/**
* Validate attribute slug .
*
* @ param string $slug
* @ param bool $new_data
* @ return bool | WP_Error
*/
protected function validate_attribute_slug ( $slug , $new_data = true ) {
if ( strlen ( $slug ) >= 28 ) {
return new WP_Error ( 'woocommerce_rest_invalid_product_attribute_slug_too_long' , sprintf ( __ ( 'Slug "%s" is too long (28 characters max).' , 'woocommerce' ), $slug ), array ( 'status' => 400 ) );
2016-05-30 22:22:26 +00:00
} elseif ( wc_check_if_attribute_name_is_reserved ( $slug ) ) {
2016-03-07 22:36:34 +00:00
return new WP_Error ( 'woocommerce_rest_invalid_product_attribute_slug_reserved_name' , sprintf ( __ ( 'Slug "%s" is not allowed because it is a reserved term.' , 'woocommerce' ), $slug ), array ( 'status' => 400 ) );
2016-05-30 22:22:26 +00:00
} elseif ( $new_data && taxonomy_exists ( wc_attribute_taxonomy_name ( $slug ) ) ) {
2016-03-07 22:36:34 +00:00
return new WP_Error ( 'woocommerce_rest_invalid_product_attribute_slug_already_exists' , sprintf ( __ ( 'Slug "%s" is already in use.' , 'woocommerce' ), $slug ), array ( 'status' => 400 ) );
}
return true ;
}
2016-02-17 19:29:09 +00:00
}