web-dev-qa-db-ja.com

Woocommerceでプログラムで新しい商品属性を作成する

プラグインからWooCommerceの属性を作成するにはどうすればよいですか?私は見つけるだけです:

wp_set_object_terms( $object_id, $terms, $taxonomy, $append);

から このスタック-質問

ただし、このアプローチでは、一部の製品のIDが必要でした。どの製品にも関連付けられていないいくつかの属性を生成する必要があります。

8
WebArtisan

用語を作成するには、 wp_insert_term() を使用できます。

そのようです:

_wp_insert_term( 'red', 'pa_colors' );
_

ここで、colorsは属性の名前です。属性の分類名には、常に_pa__が付加されます。

編集属性は単なるカスタム分類法です。または、バックエンドでユーザーが手動で作成する動的な分類法であると言えます。それでも、すべて同じ、カスタム分類規則が適用されます。

ソースコードはこちら 属性をループしてそれぞれで register_taxonomy() を実行します。したがって、新しい属性を作成するには(これは単なる分類法であることを忘れないでください)、register_taxonomy()を実行し、分類法名の先頭に_pa__を追加する必要があります。

コアから分類法引数の値の一部を模倣すると、「色」属性に対して次のようなものが得られます。

_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 );

}
_
10
helgatheviking

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');
}
_

コードは、アクティブな子テーマ(またはアクティブなテーマ)のfunction.phpファイルに入ります。テストされ、動作します。


に基づく:

関連:Woocommerce 3のCRUDメソッドを使用してプログラムで製品を作成する

4
LoicTheAztec