и foreach, чтобы динамически создавать все варианты моих продуктов

дал переменный продукт («родительский» продукт) в версии Woocommerce 3+. Из плагина Wordpress я хотел бы программно создавать варианты продукта («дети») с новыми значениями атрибутов.

Атрибуты вариаций уже установлены в Woocommerce.
Таким образом, каждый раз, когда создается один вариант, значения нового атрибута также должны создаваться программно и устанавливаться в родительском продукте Variable.

Как это может быть сделано? Является ли это возможным?

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

 j0869111 дек. 2017 г., 22:29
Поделиться своими исследованиями помогает всем. Расскажите нам, что вы пробовали и почему это не соответствует вашим потребностям. Это свидетельствует о том, что вы потратили время, чтобы попытаться помочь себе, избавляет нас от повторения очевидных ответов и, прежде всего, помогает получить более конкретный и актуальный ответ! Смотрите также:Как спросить
 Adam11 дек. 2017 г., 22:36
Вы должны закрыть один из них -stackoverflow.com/questions/47518333/...

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

если таксономия продукта заранее не зарегистрирована в другом месте. Если вы хотите убедиться, что таксономия существует, вы можете добавить условие к ответу LoicTheAztec.

Что-то вроде этого.

foreach ($variation_data['attributes'] as $attribute => $term_name )
{
    //echo 'attribute ' . $attribute . ' term name ' . $term_name;

    $taxonomy = 'pa_' . $attribute; // The attribute taxonomy

    // Check if the Taxonomy exists, and if not we create it.

    if (! taxonomy_exists($taxonomy)){
        register_taxonomy(  
            $taxonomy,  //The name of the taxonomy. Name should be in slug form (must not contain capital letters or spaces). 
            'product',        //post type name
            array(  
                'hierarchical' => false,  
                'label' => ucfirst($taxonomy),  //Display name
                'query_var' => true,
                'rewrite' => array(
                    'slug' => $taxonomy, // This controls the base slug that will display before each term
                    'with_front' => false // Don't display the category base before 
                ),
            )  
        ); 

    }
...

но нуждается в небольших исправлениях (2 запятых в массиве fuctions), я отредактировал часть кода под свои нужды.

(работает на wp 4.9 | wc 3.5)

Сначала продукт должен иметь атрибут, уже созданный и связанный, моя таксономия - «pa_r», понятное имя «R».атрибут backend связанный img

функция с коррекцией

function create_product_variation( $product_id, $variation_data ){
// Get the Variable product object (parent)
$product = wc_get_product($product_id);

$variation_post = array(
    'post_title'  => $product->get_title(),
    'post_name'   => 'product-'.$product_id.'-variation',
    'post_status' => 'publish',
    'post_parent' => $product_id,
    'post_type'   => 'product_variation',
    'guid'        => $product->get_permalink()
);

// Creating the product variation
$variation_id = wp_insert_post( $variation_post );

// Get an instance of the WC_Product_Variation object
$variation = new WC_Product_Variation( $variation_id );

// Iterating through the variations attributes
foreach ($variation_data['attributes'] as $attribute => $term_name )
{
    $taxonomy = 'pa_'.$attribute; // The attribute taxonomy

    // If taxonomy doesn't exists we create it (Thanks to Carl F. Corneil)
    if( ! taxonomy_exists( $taxonomy ) ){
        register_taxonomy(
            $taxonomy,
            'product_variation',
            array(
                'hierarchical' => false,
                'label' => ucfirst( $taxonomy ),
                'query_var' => true,
                'rewrite' => array( 'slug' => '$taxonomy') // The base slug
            )
        );
    }

    // Check if the Term name exist and if not we create it.
    if( ! term_exists( $term_name, $taxonomy ) )
        wp_insert_term( $term_name, $taxonomy ); // Create the term

    $term_slug = get_term_by('name', $term_name, $taxonomy )->slug; // Get the term slug

    // Get the post Terms names from the parent variable product.
    $post_term_names =  wp_get_post_terms( $product_id, $taxonomy, array('fields' => 'names') );

    // Check if the post term exist and if not we set it in the parent variable product.
    if( ! in_array( $term_name, $post_term_names ) )
        wp_set_post_terms( $product_id, $term_name, $taxonomy, true );

    // Set/save the attribute data in the product variation
    update_post_meta( $variation_id, 'attribute_'.$taxonomy, $term_slug );
}

## Set/save all other data

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

// Prices
if( empty( $variation_data['sale_price'] ) ){
    $variation->set_price( $variation_data['regular_price'] );
} else {
    $variation->set_price( $variation_data['sale_price'] );
    $variation->set_sale_price( $variation_data['sale_price'] );
}
$variation->set_regular_price( $variation_data['regular_price'] );

// Stock
if( ! empty($variation_data['stock_qty']) ){
    $variation->set_stock_quantity( $variation_data['stock_qty'] );
    $variation->set_manage_stock(true);
    $variation->set_stock_status('');
} else {
    $variation->set_manage_stock(false);
}

$variation->set_weight(''); // weight (reseting)

$variation->save(); // Save the data
}

Я сделал массив с нужными мне данными в вариациях [id_post, attribute, sku, normal_price, stock]

$hijos = array(
[9623,'265/70 R16','NE-CT-CO-USA-016-005','0',53],
[9624,'235/65 R17','NE-AU-CO-EUR-017-050','189000',56]
);

и foreach, чтобы динамически создавать все варианты моих продуктов

foreach ($hijos as $vari) {
// The variation data
$variation_data =  array(
    'attributes' => array(
        'r'  => $vari[1],
    ),
    'sku'           => $vari[2],
    'regular_price' => str_replace('.', '', $vari[3]),
    'stock_qty'     => $vari[4]
);
// var_dump($variation_data);
create_product_variation( $vari[0], $variation_data );
}

вы можете проверить, существует ли комбинация атрибутов со следующей модификацией его кода.

function create_update_product_variation( $product_id, $variation_data ){

    if(isset($variation_data['variation_id'])) {

      $variation_id = $variation_data['variation_id'];

    } else {

      // if the variation doesn't exist then create it

      // Get the Variable product object (parent)
      $product = wc_get_product($product_id);

      $variation_post = array(
          'post_title'  => $product->get_title(),
          'post_name'   => 'product-'.$product_id.'-variation',
          'post_status' => 'publish',
          'post_parent' => $product_id,
          'post_type'   => 'product_variation',
          'guid'        => $product->get_permalink()
      );

      // Creating the product variation
      $variation_id = wp_insert_post( $variation_post );

    }

    // ...

}

Пример использования

// The variation data
$variation_data =  array(
    'attributes' => array(
        'size'  => 'M',
        'color' => 'Green',
    ),
    'sku'           => '',
    'regular_price' => '22.00',
    'sale_price'    => '1',
    'stock_qty'     => 1,
);

// check if variation exists
$meta_query = array();
foreach ($variation_data['attributes'] as $key => $value) {
  $meta_query[] = array(
    'key' => 'attribute_pa_' . $key,
    'value' => $value
  );
}

$variation_post = get_posts(array(
  'post_type' => 'product_variation',
  'numberposts' => 1,
  'post_parent'   => $parent_id,
  'meta_query' =>  $meta_query
));

if($variation_post) {
  $variation_data['variation_id'] = $variation_post[0]->ID;
}

create_update_product_variation( $product_id, $variation_data );

вы можете использоватьWooCommerce Smooth Generator, сделанный самой WooCommerce.

https://github.com/woocommerce/wc-smooth-generator

Пример:

// Generate WC_Product object and save it to database
// 70% change generated product is simple
// 30% chance generated product is variable
$product = \WC\SmoothGenerator\Generator\Product::generate();

// Returns WC_Product object of Simple product and don't save it  to database
$product = \WC\SmoothGenerator\Generator\Product::generate_simple_product();

// Returns WC_Product object of Variable Product and saves it to database
$variable_product = \WC\SmoothGenerator\Generator\Product::generate_variable_product();

Src:https://github.com/woocommerce/wc-smooth-generator/blob/master/includes/Generator/Product.php

Если вы хотите создавать продукты программно, вы можете выбрать класс продукта с вашими потребностями.

Решение Вопроса

Обновление сентября 2018 года: Обработка создания таксономии(Спасибо Карлу Ф. Корнелю)

Из определенной переменной ID продукта вы найдете ниже пользовательскую функцию, которая добавит (создаст) вариант Product. Переменная родительский продукт должен иметь для него необходимые атрибуты.

Вам нужно будет предоставить некоторую информацию в виде:

массив атрибутов / значенийСку, цены и сток….

Эти данные должны храниться в отформатированном многомерном массиве(см. пример в конце).

Эта функция проверит, существуют ли уже значения атрибутов (имя термина), и если нет: - создаст его для атрибута продукта - установит его в родительской переменной product.

Код пользовательской функции:

/**
 * Create a product variation for a defined variable product ID.
 *
 * @since 3.0.0
 * @param int   $product_id | Post ID of the product parent variable product.
 * @param array $variation_data | The data to insert in the product.
 */

function create_product_variation( $product_id, $variation_data ){
    // Get the Variable product object (parent)
    $product = wc_get_product($product_id);

    $variation_post = array(
        'post_title'  => $product->get_title(),
        'post_name'   => 'product-'.$product_id.'-variation',
        'post_status' => 'publish',
        'post_parent' => $product_id,
        'post_type'   => 'product_variation',
        'guid'        => $product->get_permalink()
    );

    // Creating the product variation
    $variation_id = wp_insert_post( $variation_post );

    // Get an instance of the WC_Product_Variation object
    $variation = new WC_Product_Variation( $variation_id );

    // Iterating through the variations attributes
    foreach ($variation_data['attributes'] as $attribute => $term_name )
    {
        $taxonomy = 'pa_'.$attribute; // The attribute taxonomy

        // If taxonomy doesn't exists we create it (Thanks to Carl F. Corneil)
        if( ! taxonomy_exists( $taxonomy ) ){
            register_taxonomy(
                $taxonomy,
               'product_variation',
                array(
                    'hierarchical' => false,
                    'label' => ucfirst( $taxonomy ),
                    'query_var' => true,
                    'rewrite' => array( 'slug' => '$taxonomy'), // The base slug
                ),
            );
        }

        // Check if the Term name exist and if not we create it.
        if( ! term_exists( $term_name, $taxonomy ) )
            wp_insert_term( $term_name, $taxonomy ); // Create the term

        $term_slug = get_term_by('name', $term_name, $taxonomy )->slug; // Get the term slug

        // Get the post Terms names from the parent variable product.
        $post_term_names =  wp_get_post_terms( $product_id, $taxonomy, array('fields' => 'names') );

        // Check if the post term exist and if not we set it in the parent variable product.
        if( ! in_array( $term_name, $post_term_names ) )
            wp_set_post_terms( $product_id, $term_name, $taxonomy, true );

        // Set/save the attribute data in the product variation
        update_post_meta( $variation_id, 'attribute_'.$taxonomy, $term_slug );
    }

    ## Set/save all other data

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

    // Prices
    if( empty( $variation_data['sale_price'] ) ){
        $variation->set_price( $variation_data['regular_price'] );
    } else {
        $variation->set_price( $variation_data['sale_price'] );
        $variation->set_sale_price( $variation_data['sale_price'] );
    }
    $variation->set_regular_price( $variation_data['regular_price'] );

    // Stock
    if( ! empty($variation_data['stock_qty']) ){
        $variation->set_stock_quantity( $variation_data['stock_qty'] );
        $variation->set_manage_stock(true);
        $variation->set_stock_status('');
    } else {
        $variation->set_manage_stock(false);
    }

    $variation->set_weight(''); // weight (reseting)

    $variation->save(); // Save the data
}

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

Использование (пример с 2 атрибутами):

$parent_id = 746; // Or get the variable product id dynamically

// The variation data
$variation_data =  array(
    'attributes' => array(
        'size'  => 'M',
        'color' => 'Green',
    ),
    'sku'           => '',
    'regular_price' => '22.00',
    'sale_price'    => '',
    'stock_qty'     => 10,
);

// The function to be run
create_product_variation( $parent_id, $variation_data );

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

Часть 2: Создать программно переменный продукт и два новых атрибута в Woocommerce

Вы получите это в бэкэнде:

И это будет отлично работать в передней части.

Связанный: Создание программного продукта с использованием методов CRUD в Woocommerce 3

 Cedric12 дек. 2017 г., 18:59
Акция может быть 0 - поэтому, возможно, у нас не должно быть :: if (! Empty ($ var_data ['stock_qty'])) {:: but :: if (isset ($ var_data ['stock_qty']) && is_numeric ( $ var_data ['stock_qty'])) {
 Cedric12 дек. 2017 г., 19:03
Я добавил некоторые данные - вес (если я не ошибаюсь, вариация может иметь вес, отличный от родительского / переменного или другого варианта), описание, слаг.
 Davey31 янв. 2018 г., 17:40
@LiocTheAztec Я считаю, что некоторый код обычно приемлем, но, конечно, нет проблем. Я разместил свое предложение в качестве нового ответа, надеюсь, вы или другие найдете его полезным. Спасибо за ваш код, он работал отлично!
 Cedric12 дек. 2017 г., 19:03
if (is_numeric (($ var_data ['weight']))) $ var-> set_weight ($ var_data ['weight']); if (is_string (($ var_data ['long_description'])) && strlen ($ var_data ['long_description'])) $ var-> set_description ($ var_data ['long_description']); if (is_string (($ var_data ['slug'])) && strlen ($ var_data ['slug'])) $ var-> set_slug ($ var_data ['slug']);
 Cedric12 дек. 2017 г., 19:08
Как только мы уточнили вышеупомянутое примечание, вы можете добавить фиктивный ответ наstackoverflow.com/questions/47518333/... - Решив статью «Вариант продукта с новым значением атрибута», вы решили для меня другой. Так что я могу приписать вам награду другого поста тоже.

так как я не смог заставить работать ни один из приведенных выше примеров. Не спрашивайте меня почему, потому что другие люди, кажется, имеют успех. Итак, я выбрал минималистский подход и попытался выяснить самое необходимое для атрибута продукта + вариант (создав его вручную в wp и просмотрев базу данных) и придумал это.

$article_name = 'Test';

$post_id = wp_insert_post( array(
    'post_author' => 1,
    'post_title' => $article_name,
    'post_content' => 'Lorem ipsum',
    'post_status' => 'publish',
    'post_type' => "product",
) );
wp_set_object_terms( $post_id, 'variable', 'product_type' );

$attr_label = 'Test attribute';
$attr_slug = sanitize_title($attr_label);

$attributes_array[$attr_slug] = array(
    'name' => $attr_label,
    'value' => 'alternative 1 | alternative 2',
    'is_visible' => '1',
    'is_variation' => '1',
    'is_taxonomy' => '0' // for some reason, this is really important       
);
update_post_meta( $post_id, '_product_attributes', $attributes_array );

$parent_id = $post_id;
$variation = array(
    'post_title'   => $article_name . ' (variation)',
    'post_content' => '',
    'post_status'  => 'publish',
    'post_parent'  => $parent_id,
    'post_type'    => 'product_variation'
);

$variation_id = wp_insert_post( $variation );
update_post_meta( $variation_id, '_regular_price', 2 );
update_post_meta( $variation_id, '_price', 2 );
update_post_meta( $variation_id, '_stock_qty', 10 );
update_post_meta( $variation_id, 'attribute_' . $attr_slug, 'alternative 1' );
WC_Product_Variable::sync( $parent_id );

$variation_id = wp_insert_post( $variation );
update_post_meta( $variation_id, '_regular_price', 2 );
update_post_meta( $variation_id, '_price', 2 );
update_post_meta( $variation_id, '_stock_qty', 10 );
update_post_meta( $variation_id, 'attribute_' . $attr_slug, 'alternative 2' );
WC_Product_Variable::sync( $parent_id );

Это не глобальные атрибуты продукта, а специфичные для статьи. Надеюсь, это поможет кому-то, так как я был готов вырвать мои волосы, прежде чем я заработал.

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