wc_create_attribute( array $args )
Create attribute.
Description Description
Parameters Parameters
- $args
-
(Required) Attribute arguments { 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. }
Return Return
(int|WP_Error)
Source Source
File: includes/wc-attribute-functions.php
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_pa_' . sanitize_title( $data['attribute_name'] ) ), // WPCS: slow query ok. 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; }
Changelog Changelog
Version | Description |
---|---|
3.2.0 | Introduced. |