это работает для меня, очень простое и чистое решение

ел бы программно создать переменный продукт («родительский» продукт) с двумя новыми атрибутами variante - все это из плагина Wordpress (поэтому нет HTTP-запроса к API).

Эти два атрибута variante также должны создаваться на лету.

Как это может быть сделано ?

(с версией Woocommerce 3)

Обновление: я написал больше строк кода для этого, что я хотел, и попробовал много вещей, чтобы решить это, используя объекты woocommerce, и добавил недостающие данные о терминах, termmeta, связи от термина с постом, в базу данных, используя базу данных wordpress. объект - но ничего не хватило, чтобы заставить его работать. И я не мог точно определить, где я ошибся - вот почему я не мог предоставить более узкую проблему - вещи, для которых стековый поток больше предназначен.

 LordNeo27 нояб. 2017 г., 21:04
создание атрибута никогда не было проблемой. присоединение этого не делает, если я не делаю 2 вызова, один, чтобы создать "родительский" продукт и один для вариантов.
 j0869111 дек. 2017 г., 22:29
Поделиться своими исследованиями помогает всем. Расскажите нам, что вы пробовали и почему это не соответствует вашим потребностям. Это свидетельствует о том, что вы потратили время, чтобы попытаться помочь себе, избавляет нас от повторения очевидных ответов и, прежде всего, помогает получить более конкретный и актуальный ответ! Смотрите также:Как спросить
 Cedric27 нояб. 2017 г., 20:41
Я перепробовал много вещей, в том числе и этот, но всегда терпел неудачу ..
 LordNeo27 нояб. 2017 г., 20:29
Вы пытались использовать API для получения значений родительского продукта, а затем создать новый объект продукта?
 Cedric27 нояб. 2017 г., 20:42
Также обратите внимание, что в вопросе есть две части - также необходимо создать параметр атрибута variante и «прикрепить» его к переменной product.

Ответы на вопрос(2)

используя новые встроенные функции для настройки / получения данных из postmeta.

Вот пример, который работает (на основе фиктивных продуктов по умолчанию из Woocommerce 3)

//Create main product
$product = new WC_Product_Variable();

//Create the attribute object
$attribute = new WC_Product_Attribute();
//pa_size tax id
$attribute->set_id( 1 );
//pa_size slug
$attribute->set_name( 'pa_size' );

//Set terms slugs
$attribute->set_options( array(
        'blue',
        'grey'
) );
$attribute->set_position( 0 );

//If enabled
$attribute->set_visible( 1 );

//If we are going to use attribute in order to generate variations
$attribute->set_variation( 1 );

$product->set_attributes(array($attribute));

//Save main product to get its id
$id = $product->save();


$variation = new WC_Product_Variation();
$variation->set_regular_price(5);
$variation->set_parent_id($id);

//Set attributes requires a key/value containing
// tax and term slug
$variation->set_attributes(array(
        'pa_size' => 'blue'
));

//Save variation, returns variation id
$variation->save();

Вы можете добавлять такие вещи, как вес, налог, sku и т. Д., Используя встроенные функции, доступные в Woocommerce 3, и такие как set_price, set_sku и т. Д.

Оберните это в функцию, и вы готовы к работе.

 EliaszKubala23 июн. 2018 г., 16:30
не работает для меня
 Mario Shtika08 февр. 2019 г., 17:52
это работает для меня, очень простое и чистое решение
Решение Вопроса

После: Создайте программно вариант продукта WooCommerce с новыми значениями атрибутов

Здесь вы получаете способ создать новый переменный продукт с новыми атрибутами продукта + значениями:

/**
 * Save a new product attribute from his name (slug).
 *
 * @since 3.0.0
 * @param string $name  | The product attribute name (slug).
 * @param string $label | The product attribute label (name).
 */
function save_product_attribute_from_name( $name, $label='', $set=true ){
    if( ! function_exists ('get_attribute_id_from_name') ) return;

    global $wpdb;

    $label = $label == '' ? ucfirst($name) : $label;
    $attribute_id = get_attribute_id_from_name( $name );

    if( empty($attribute_id) ){
        $attribute_id = NULL;
    } else {
        $set = false;
    }
    $args = array(
        'attribute_id'      => $attribute_id,
        'attribute_name'    => $name,
        'attribute_label'   => $label,
        'attribute_type'    => 'select',
        'attribute_orderby' => 'menu_order',
        'attribute_public'  => 0,
    );

    if( empty($attribute_id) )
        $wpdb->insert(  "{$wpdb->prefix}woocommerce_attribute_taxonomies", $args );

    if( $set ){
        $attributes = wc_get_attribute_taxonomies();
        $args['attribute_id'] = get_attribute_id_from_name( $name );
        $attributes[] = (object) $args;
        //print_r($attributes);
        set_transient( 'wc_attribute_taxonomies', $attributes );
    } else {
        return;
    }
}

/**
 * Get the product attribute ID from the name.
 *
 * @since 3.0.0
 * @param string $name | The name (slug).
 */
function get_attribute_id_from_name( $name ){
    global $wpdb;
    $attribute_id = $wpdb->get_col("SELECT attribute_id
    FROM {$wpdb->prefix}woocommerce_attribute_taxonomies
    WHERE attribute_name LIKE '$name'");
    return reset($attribute_id);
}

/**
 * Create a new variable product (with new attributes if they are).
 * (Needed functions:
 *
 * @since 3.0.0
 * @param array $data | The data to insert in the product.
 */

function create_product_variation( $data ){
    if( ! function_exists ('save_product_attribute_from_name') ) return;

    $postname = sanitize_title( $data['title'] );
    $author = empty( $data['author'] ) ? '1' : $data['author'];

    $post_data = array(
        'post_author'   => $author,
        'post_name'     => $postname,
        'post_title'    => $data['title'],
        'post_content'  => $data['content'],
        'post_excerpt'  => $data['excerpt'],
        'post_status'   => 'publish',
        'ping_status'   => 'closed',
        'post_type'     => 'product',
        'guid'          => home_url( '/product/'.$postname.'/' ),
    );

    // Creating the product (post data)
    $product_id = wp_insert_post( $post_data );

    // Get an instance of the WC_Product_Variable object and save it
    $product = new WC_Product_Variable( $product_id );
    $product->save();

    ## ---------------------- Other optional data  ---------------------- ##
    ##     (see WC_Product and WC_Product_Variable setters methods)

    // THE PRICES (No prices yet as we need to create product variations)

    // IMAGES GALLERY
    if( ! empty( $data['gallery_ids'] ) && count( $data['gallery_ids'] ) > 0 )
        $product->set_gallery_image_ids( $data['gallery_ids'] );

    // SKU
    if( ! empty( $data['sku'] ) )
        $product->set_sku( $data['sku'] );

    // STOCK (stock will be managed in variations)
    $product->set_stock_quantity( $data['stock'] ); // Set a minimal stock quantity
    $product->set_manage_stock(true);
    $product->set_stock_status('');

    // Tax class
    if( empty( $data['tax_class'] ) )
        $product->set_tax_class( $data['tax_class'] );

    // WEIGHT
    if( ! empty($data['weight']) )
        $product->set_weight(''); // weight (reseting)
    else
        $product->set_weight($data['weight']);

    $product->validate_props(); // Check validation

    ## ---------------------- VARIATION ATTRIBUTES ---------------------- ##

    $product_attributes = array();

    foreach( $data['attributes'] as $key => $terms ){
        $taxonomy = wc_attribute_taxonomy_name($key); // The taxonomy slug
        $attr_label = ucfirst($key); // attribute label name
        $attr_name = ( wc_sanitize_taxonomy_name($key)); // attribute slug

        // NEW Attributes: Register and save them
        if( ! taxonomy_exists( $taxonomy ) )
            save_product_attribute_from_name( $attr_name, $attr_label );

        $product_attributes[$taxonomy] = array (
            'name'         => $taxonomy,
            'value'        => '',
            'position'     => '',
            'is_visible'   => 0,
            'is_variation' => 1,
            'is_taxonomy'  => 1
        );

        foreach( $terms as $value ){
            $term_name = ucfirst($value);
            $term_slug = sanitize_title($value);

            // Check if the Term name exist and if not we create it.
            if( ! term_exists( $value, $taxonomy ) )
                wp_insert_term( $term_name, $taxonomy, array('slug' => $term_slug ) ); // Create the term

            // Set attribute values
            wp_set_post_terms( $product_id, $term_name, $taxonomy, true );
        }
    }
    update_post_meta( $product_id, '_product_attributes', $product_attributes );
    $product->save(); // Save the data
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

ИСПОЛЬЗОВАНИЕ (пример с 2 новыми атрибутами + значениями):

create_product_variation( array(
    'author'        => '', // optional
    'title'         => 'Woo special one',
    'content'       => '<p>This is the product content <br>A very nice product, soft and clear…<p>',
    'excerpt'       => 'The product short description…',
    'regular_price' => '16', // product regular price
    'sale_price'    => '', // product sale price (optional)
    'stock'         => '10', // Set a minimal stock quantity
    'image_id'      => '', // optional
    'gallery_ids'   => array(), // optional
    'sku'           => '', // optional
    'tax_class'     => '', // optional
    'weight'        => '', // optional
    // For NEW attributes/values use NAMES (not slugs)
    'attributes'    => array(
        'Attribute 1'   =>  array( 'Value 1', 'Value 2' ),
        'Attribute 2'   =>  array( 'Value 1', 'Value 2', 'Value 3' ),
    ),
) );

Проверено и работает.

Связанный:

Создать новый атрибут продукта программно в WoocommerceСоздайте программно вариант продукта WooCommerce с новыми значениями атрибутовСоздание программного продукта с использованием методов CRUD в Woocommerce 3
 Maciej Krawczyk30 июл. 2018 г., 22:06
Что такое $ вариация здесь?
 LoicTheAztec09 мар. 2018 г., 20:12
@codermjb Ответ был на первой связанной части:Создайте программно вариант продукта WooCommerce с новыми значениями атрибутов ... Так что я обновил ответ здесь тоже ... Извините
 codermjb10 мар. 2018 г., 20:55
о, я вижу, это была ссылка над ним. В любом случае, я выяснил это и автоматически определил, существует ли переменный продукт. Если он существует, он просто захватывает переменную id, а не вставляет ее заново.
 codermjb09 мар. 2018 г., 19:42
Я говорю, что нет никаких установленных цен для каждого переменного продукта. Я нашел другой сайт, который использовал wp_insert_post, поэтому я использовал это. Я буду в любом случае поддерживать, потому что это работает для продуктов простого стиля.
 codermjb08 мар. 2018 г., 19:11
Это отлично сработало для меня с небольшой модификацией для работы с моим кодом. Мне было интересно, как вы можете добавить это к вариантам и установить цены для них?

Ваш ответ на вопрос