wc_create_attribute() │ WC 3.2.0 Create attribute.
Return
Int|WP_Error
.
Usage
wc_create_attribute( $args );
$args(array) (required)
Attribute arguments {
php Array of attribute parameters.
@type int $id Unique identifier, used to update an attribute.
@type string $name Attribute name. Always required.
@type string $slug Attribute alphanumeric identifier.
@type string $type Type of attribute.
Core by default accepts: 'select' and 'text'.
Default to 'select'.
@type string $order_by Sort order.
Accepts: 'menu_order', 'name', 'name_num' and 'id'.
Default to 'menu_order'.
@type bool $has_archives Enable or disable attribute archives. False by default.
}
Changelog
wc_create_attribute() wc create attribute code
WC 9.7.1
function wc_create_attribute( $args ) {
global $wpdb;
$args = wp_unslash( $args );
$id = ! empty( $args['id'] ) ? intval( $args['id'] ) : 0;
$format = array( '%s', '%s', '%s', '%s', '%d' );
// Name is required.
if ( empty( $args['name'] ) ) {
return new WP_Error( 'missing_attribute_name', __( 'Please, provide an attribute name.', 'woocommerce' ), array( 'status' => 400 ) );
}
// Set the attribute slug.
if ( empty( $args['slug'] ) ) {
$slug = wc_sanitize_taxonomy_name( $args['name'] );
} else {
$slug = preg_replace( '/^pa\_/', '', wc_sanitize_taxonomy_name( $args['slug'] ) );
}
// Validate slug.
if ( strlen( $slug ) > 28 ) {
/* translators: %s: attribute slug */
return new WP_Error( 'invalid_product_attribute_slug_too_long', sprintf( __( 'Slug "%s" is too long (28 characters max). Shorten it, please.', 'woocommerce' ), $slug ), array( 'status' => 400 ) );
} elseif ( wc_check_if_attribute_name_is_reserved( $slug ) ) {
/* translators: %s: attribute slug */
return new WP_Error( 'invalid_product_attribute_slug_reserved_name', sprintf( __( 'Slug "%s" is not allowed because it is a reserved term. Change it, please.', 'woocommerce' ), $slug ), array( 'status' => 400 ) );
} elseif ( ( 0 === $id && taxonomy_exists( wc_attribute_taxonomy_name( $slug ) ) ) || ( isset( $args['old_slug'] ) && $args['old_slug'] !== $slug && taxonomy_exists( wc_attribute_taxonomy_name( $slug ) ) ) ) {
/* translators: %s: attribute slug */
return new WP_Error( 'invalid_product_attribute_slug_already_exists', sprintf( __( 'Slug "%s" is already in use. Change it, please.', 'woocommerce' ), $slug ), array( 'status' => 400 ) );
}
// Validate type.
if ( empty( $args['type'] ) || ! array_key_exists( $args['type'], wc_get_attribute_types() ) ) {
$args['type'] = 'select';
}
// Validate order by.
if ( empty( $args['order_by'] ) || ! in_array( $args['order_by'], array( 'menu_order', 'name', 'name_num', 'id' ), true ) ) {
$args['order_by'] = 'menu_order';
}
$data = array(
'attribute_label' => $args['name'],
'attribute_name' => $slug,
'attribute_type' => $args['type'],
'attribute_orderby' => $args['order_by'],
'attribute_public' => isset( $args['has_archives'] ) ? (int) $args['has_archives'] : 0,
);
// Create or update.
if ( 0 === $id ) {
$results = $wpdb->insert(
$wpdb->prefix . 'woocommerce_attribute_taxonomies',
$data,
$format
);
if ( is_wp_error( $results ) ) {
return new WP_Error( 'cannot_create_attribute', $results->get_error_message(), array( 'status' => 400 ) );
}
$id = $wpdb->insert_id;
/**
* Attribute added.
*
* @param int $id Added attribute ID.
* @param array $data Attribute data.
*/
do_action( 'woocommerce_attribute_added', $id, $data );
} else {
$results = $wpdb->update(
$wpdb->prefix . 'woocommerce_attribute_taxonomies',
$data,
array( 'attribute_id' => $id ),
$format,
array( '%d' )
);
if ( false === $results ) {
return new WP_Error( 'cannot_update_attribute', __( 'Could not update the attribute.', 'woocommerce' ), array( 'status' => 400 ) );
}
// Set old slug to check for database changes.
$old_slug = ! empty( $args['old_slug'] ) ? wc_sanitize_taxonomy_name( $args['old_slug'] ) : $slug;
/**
* Attribute updated.
*
* @param int $id Added attribute ID.
* @param array $data Attribute data.
* @param string $old_slug Attribute old name.
*/
do_action( 'woocommerce_attribute_updated', $id, $data, $old_slug );
if ( $old_slug !== $slug ) {
// Update taxonomies in the wp term taxonomy table.
$wpdb->update(
$wpdb->term_taxonomy,
array( 'taxonomy' => wc_attribute_taxonomy_name( $data['attribute_name'] ) ),
array( 'taxonomy' => 'pa_' . $old_slug )
);
// Update taxonomy ordering term meta.
$wpdb->update(
$wpdb->termmeta,
array( 'meta_key' => 'order' ), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
array( 'meta_key' => 'order_pa_' . sanitize_title( $old_slug ) ) // WPCS: slow query ok.
);
// Update product attributes which use this taxonomy.
$old_taxonomy_name = 'pa_' . $old_slug;
$new_taxonomy_name = 'pa_' . $data['attribute_name'];
$old_attribute_key = sanitize_title( $old_taxonomy_name ); // @see WC_Product::set_attributes().
$new_attribute_key = sanitize_title( $new_taxonomy_name ); // @see WC_Product::set_attributes().
$metadatas = $wpdb->get_results(
$wpdb->prepare(
"SELECT post_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_product_attributes' AND meta_value LIKE %s",
'%' . $wpdb->esc_like( $old_taxonomy_name ) . '%'
),
ARRAY_A
);
foreach ( $metadatas as $metadata ) {
$product_id = $metadata['post_id'];
$unserialized_data = maybe_unserialize( $metadata['meta_value'] );
if ( ! $unserialized_data || ! is_array( $unserialized_data ) || ! isset( $unserialized_data[ $old_attribute_key ] ) ) {
continue;
}
$unserialized_data[ $new_attribute_key ] = $unserialized_data[ $old_attribute_key ];
unset( $unserialized_data[ $old_attribute_key ] );
$unserialized_data[ $new_attribute_key ]['name'] = $new_taxonomy_name;
update_post_meta( $product_id, '_product_attributes', wp_slash( $unserialized_data ) );
}
// Update variations which use this taxonomy.
$wpdb->update(
$wpdb->postmeta,
array( 'meta_key' => 'attribute_pa_' . sanitize_title( $data['attribute_name'] ) ), // WPCS: slow query ok.
array( 'meta_key' => 'attribute_pa_' . sanitize_title( $old_slug ) ) // WPCS: slow query ok.
);
}
}
// Clear cache and flush rewrite rules.
wp_schedule_single_event( time(), 'woocommerce_flush_rewrite_rules' );
delete_transient( 'wc_attribute_taxonomies' );
WC_Cache_Helper::invalidate_cache_group( 'woocommerce-attributes' );
return $id;
}