Создание нового атрибута продукта программно в Woocommerce
Как я могу создать атрибуты для WooCommerce из плагина? Я нахожу только :
wp_set_object_terms( $object_id, $terms, $taxonomy, $append);
но этот подход требовал id некоторого продукта. Мне нужно создать некоторые атрибуты, не прикрепленные к каким-либо продуктам.
2 ответов
для создания термина вы можете использовать wp_insert_term()
вот так:
wp_insert_term( 'red', 'pa_colors' );
здесь colors
- имя атрибута. Имя таксономии атрибута всегда добавляется pa_
.
редактировать атрибуты - это просто пользовательские таксономии. Или вы можете сказать, что это динамические таксономии, которые вручную создаются Пользователем в фоновом режиме. Все те же правила таксономии.
вы можете увидеть здесь исходный код который проходит через атрибуты и запускает register_taxonomy()
на каждого. Поэтому, чтобы создать новый атрибут (помните, что это просто таксономия), вам нужно запустить register_taxonomy()
и простое добавление pa_
к началу имени таксономии.
имитируя некоторые значения таксономии args из core, Вы получите что-то вроде этого для атрибута "цвета".
add_action( 'woocommerce_after_register_taxonomy', 'so_29549525_register_attribute' );
function so_29549525_register_attribute(){
$permalinks = get_option( 'woocommerce_permalinks' );
$taxonomy_data = array(
'hierarchical' => true,
'update_count_callback' => '_update_post_term_count',
'labels' => array(
'name' => 'Colors',
'singular_name' => 'Color',
'search_items' => sprintf( __( 'Search %s', 'woocommerce' ), $label ),
'all_items' => sprintf( __( 'All %s', 'woocommerce' ), $label ),
'parent_item' => sprintf( __( 'Parent %s', 'woocommerce' ), $label ),
'parent_item_colon' => sprintf( __( 'Parent %s:', 'woocommerce' ), $label ),
'edit_item' => sprintf( __( 'Edit %s', 'woocommerce' ), $label ),
'update_item' => sprintf( __( 'Update %s', 'woocommerce' ), $label ),
'add_new_item' => sprintf( __( 'Add New %s', 'woocommerce' ), $label ),
'new_item_name' => sprintf( __( 'New %s', 'woocommerce' ), $label )
),
'show_ui' => false,
'query_var' => true,
'rewrite' => array(
'slug' => empty( $permalinks['attribute_base'] ) ? '' : trailingslashit( $permalinks['attribute_base'] ) . sanitize_title( 'colors' ),
'with_front' => false,
'hierarchical' => true
),
'sort' => false,
'public' => true,
'show_in_nav_menus' => false,
'capabilities' => array(
'manage_terms' => 'manage_product_terms',
'edit_terms' => 'edit_product_terms',
'delete_terms' => 'delete_product_terms',
'assign_terms' => 'assign_product_terms',
)
);
register_taxonomy( 'pa_colors', array( 'product' ) ), $taxonomy_data );
}
Для Woocommerce 3+ (2018)
чтобы создать новый атрибут продукта из имени метки, используйте следующую функцию:
function create_product_attribute( $label_name ){
global $wpdb;
$slug = sanitize_title( $label_name );
if ( strlen( $slug ) >= 28 ) {
return new WP_Error( 'invalid_product_attribute_slug_too_long', sprintf( __( 'Name "%s" is too long (28 characters max). Shorten it, please.', 'woocommerce' ), $slug ), array( 'status' => 400 ) );
} elseif ( wc_check_if_attribute_name_is_reserved( $slug ) ) {
return new WP_Error( 'invalid_product_attribute_slug_reserved_name', sprintf( __( 'Name "%s" is not allowed because it is a reserved term. Change it, please.', 'woocommerce' ), $slug ), array( 'status' => 400 ) );
} elseif ( taxonomy_exists( wc_attribute_taxonomy_name( $label_name ) ) ) {
return new WP_Error( 'invalid_product_attribute_slug_already_exists', sprintf( __( 'Name "%s" is already in use. Change it, please.', 'woocommerce' ), $label_name ), array( 'status' => 400 ) );
}
$data = array(
'attribute_label' => $label_name,
'attribute_name' => $slug,
'attribute_type' => 'select',
'attribute_orderby' => 'menu_order',
'attribute_public' => 0, // Enable archives ==> true (or 1)
);
$results = $wpdb->insert( "{$wpdb->prefix}woocommerce_attribute_taxonomies", $data );
if ( is_wp_error( $results ) ) {
return new WP_Error( 'cannot_create_attribute', $results->get_error_message(), array( 'status' => 400 ) );
}
$id = $wpdb->insert_id;
do_action('woocommerce_attribute_added', $id, $data);
wp_schedule_single_event( time(), 'woocommerce_flush_rewrite_rules' );
delete_transient('wc_attribute_taxonomies');
}
код в функцию.php-файл активной дочерней темы (или активной темы). Проверено и работает.
основывается на:
- Атрибут Продукта
wc_create_attribute()
функции код (Woocommerce 3.2+). - создать программно переменной продукт и два новых атрибута в Woocommerce