Требуется помощь по добавлению продукта вариаций c в woocomerce.
Я создал собственный календарь событий с ACF, в котором есть повторяющиеся события и другие функции. Эти события перечислены в файле json, который извлекается с помощью rest-api для отображения их в календаре внешнего интерфейса.
Например: у меня есть событие, которое начинается с 2020-01-01 и заканчивается 2020-01-30 . Для каждого дня должна быть доступна цена и количество билетов, поэтому я использую переменный продукт woocomerce.
Мне нужно создать вариант динамичности c, основанный на рекурсивных событиях, которые я выбрали в АКФ. Я следовал этому примеру Программным путем создайте вариант продукта WooCommerce с новыми значениями атрибута , но без успеха.
Таксономия должна быть датой, а вариант должен быть повторяющимися датами.
Пример: Дата: 2020-01-01 | 2020-01-02 | 2020-01-03 et c ...
Ради этого примера я буду использовать фиктивный контент для вариантов.
Вот логика c, которую я придерживаюсь:
add_action( 'save_post', 'my_save_post_function', 10, 3 );
function my_save_post_function( $ID, $post, $update ) {
if ( !$post->post_type == 'product' ) {
return;
}
$variation_data = array(
'attributes' => array(
'size' => 'M',
'color' => 'Green',
),
'sku' => '',
'regular_price' => '22.00',
'sale_price' => '',
'stock_qty' => 10,
);
create_product_variation( $ID, $variation_data);
};
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
remove_action('save_post', 'my_save_post_function');
$variation_id = wp_insert_post( $variation_post );
add_action('save_post', 'my_save_post_function');
// 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_for_object_type(
$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
}
Поэтому, когда я создаю публикацию о продукте и обновляю публикацию о продукте, мне нужно, чтобы повторяющиеся события регистрировались как варианты.
Одна из проблем заключается в том, что в save_post action У меня также есть wp_insert_post , чтобы избежать l oop, я отменил обратный вызов для save_post после wp_insert_post и снова добавил действие save_post после него.