Woocomerce, добавить переменный продукт c dinamy на основе полей ACF. События Reecuring - PullRequest
0 голосов
/ 30 марта 2020

Требуется помощь по добавлению продукта вариаций 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 после него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...