У меня есть уникальный проект, использующий woocommerce.Я создал форму с Formidable Forms, чтобы добавить переменные продукты из внешнего интерфейса.Это работает хорошо с кодом ниже.У меня есть несколько атрибутов, которые созданы.Если атрибуты не пустые, они правильно отображаются как вариант раскрывающегося списка вариантов.
Моя проблема в том, что атрибут - например, «Цвет» - пустой и не передан.Атрибут «Цвет» варианта все еще создается, значение пустое, а раскрывающийся список пуст.Я искал несколько дней, чтобы решить эту проблему.Как не создавать вариант / атрибут, если он не представлен.
Я также попытался программно изменить set_variation на '', если значение настраиваемого поля пусто.Но это не сработало.
Код был найден здесь: Автоматически добавлять все атрибуты товара при добавлении нового товара в Woocommerce
add_action( 'save_post', 'create_product_attributes_variations', 80, 3 );
function create_product_attributes_variations( $post_id, $post, $update ) {
## --- Checking --- ##
if ( $post->post_type != 'product') return; // Only products
// Exit if it's an autosave
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return $post_id;
// Exit if it's an update
if( $update )
return $post_id;
// Exit if user is not allowed
if ( ! current_user_can( 'edit_product', $post_id ) )
return $post_id;
## -- Set product as variable and set quote option --- ##
update_post_meta( $post_id, 'qwc_enable_quotes', 'on');
wp_set_object_terms( $post_id, 'variable', 'product_type', false );
## --- The Settings for your product attributes --- ##
$visible = ''; // can be: '' or '1'
$variation = '1'; // can be: '' or '1'
## --- The code --- ##
// Get all existing product attributes
global $wpdb;
$attributes = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}woocommerce_attribute_taxonomies" );
$position = 0; // Auto incremented position value starting at '0'
$data = array(); // initialising (empty array)
// Loop through each exiting product attribute
foreach( $attributes as $attribute ){
// Get the correct taxonomy for product attributes
$taxonomy = 'pa_'.$attribute->attribute_name;
$attribute_id = $attribute->attribute_id;
$term_ids = get_terms(array('taxonomy' => $taxonomy, 'fields' => 'ids'));
$product_attribute = new WC_Product_Attribute();
// Set the related data in the WC_Product_Attribute object
$product_attribute->set_id( $attribute_id );
$product_attribute->set_name( $taxonomy );
$product_attribute->set_options( $term_ids );
$product_attribute->set_position( $position );
$product_attribute->set_visible( $visible );
$product_attribute->set_variation( $variation );
// Add the product WC_Product_Attribute object in the data array
$data[$taxonomy] = $product_attribute;
$position++; // Incrementing position
}
// Get an instance of the WC_Product object
$product = wc_get_product( $post_id );
// Set the array of WC_Product_Attribute objects in the product
$product->set_attributes( $data );
//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(
));
//Save variation, returns variation id
$variation->save();
}