как получить идентификатор изменения по атрибутам в woocommerce

#php #wordpress #woocommerce #wordpress-theming #hook-woocommerce

Вопрос:

Я хочу найти идентификатор и проверить его, когда пользователь нажимает на мои атрибуты, пожалуйста, помогите. Например, у нас есть два атрибута: Регион = Сумма сбора ars = 100 долларов

Если выбраны оба варианта, необходимо вернуть действительный идентификатор

мой код:

 <?php $attributes = $product->get_attributes() // GET ALL ATRIBUTES ?>
                        <?php foreach ($attributes as $key => $value): ?>
                            <?php $attribute_name_ = preg_replace('/pa_/', '', $key); // GET ATTRIBUTE NAME


                            ?>

                            <div class="<?= ($attribute_name_ == 'regions') ? 'region' : 'charge'; ?>">


                                <?php $attribute_name = wc_get_product_terms(get_the_ID(), $key);

                                $attribute_slug = wc_get_product_terms(get_the_ID(), $key, array('fields' => 'slugs')); // GET ATTRIBUTE SLUG


                                ?>
                                <?php for ($i = 0; $i < count($attribute_name); $i  ): // array_slice BECAUSE ARRAY INDEX IS NOT SEQUENCIAL

                                    $slug = array_slice($attribute_slug, $i, 1);


                                    $atribute_list = [];
                                    if ($attribute_name_ == 'regions') {

                                        $atribute_list['attribute_pa_regions'] = $slug['0'];
                                    }
                                    if ($attribute_name_ == 'charge-amount') {
                                        $atribute_list['attribute_pa_charge-amount'] = $slug['0'];
                                    }

//                                    echo find_matching_product_variation_id($product, $atribute_list);


                                    ?>


                                    <?php
                                    if ($attribute_name_ == 'regions') {


                                        ?>
                                        <div id="<?= $slug['0'] ?>"
                                             class="region-item">

                                            <img src="https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg"
                                                 alt="">
                                            <span>
                        <?php

                        $name = array_slice($attribute_name, $i, 1);
                        echo $name[0]->name;

                        ?>
                    </span>
                                        </div>
                                        <?php

                                    }


                                    if ($attribute_name_ == 'charge-amount') {

                                        $atribute_list['attribute_pa_charge-amount'] = $slug['0'];
                                        ?>

                                        <div id="<?= $slug['0'] ?>"
                                             class="charge-item">

                                            <?php

                                            $name = array_slice($attribute_name, $i, 1);
                                            echo $name[0]->name;

                                            ?>

                                        </div>
                                        <?php
                                    }


                                    ?>


                                <?php endfor ?>
                            </div>
                        <?php endforeach ?>
 

Мне удалось отобразить здесь отдельно только атрибуты, и теперь я хочу, чтобы идентификатор и проверяемый отображались или заключались в переменную при нажатии на связанные атрибуты.

Вот как выводится мой код:

введите описание изображения здесь

Ответ №1:

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

мои коды:

 <?php


                    foreach ($attributes as $key => $value):
                        $attribute_name_ = preg_replace('/pa_/', '', $key); // GET ATTRIBUTE NAME


                        ?>

                        <div class="<?= ($attribute_name_ == 'regions') ? 'region' : 'charge'; ?>">


                            <?php $attribute_name = wc_get_product_terms(get_the_ID(), $key);

                            $attribute_slug = wc_get_product_terms(get_the_ID(), $key, array('fields' => 'slugs')); // GET ATTRIBUTE SLUG
                            $attribute_name = wc_get_product_terms(get_the_ID(), $key); // GET ATTRIBUTE SLUG
                            $attribute_thumbnail_id = wc_get_product_terms(get_the_ID(), $key, array('fields' => 'term_id')); // GET ATTRIBUTE SLUG


                            for ($i = 0; $i < count($attribute_name); $i  ): // array_slice BECAUSE ARRAY INDEX IS NOT SEQUENCIAL

                                $slug = array_slice($attribute_slug, $i, 1);


                                if ($attribute_name_ == 'regions') {

                                    $thumb_id = get_term_meta($attribute_name[$i]->term_id);

                                    $thumb_id_ = get_term_meta($attribute_name[$i]->term_id, 'product_attribute_image', true);

                                    $img_src = wp_get_attachment_thumb_url($thumb_id_);

                                    ?>
                                    <div id="<?= $slug['0'] ?>"
                                         class="region-item">

                                        <img src="<?= $img_src ?>"
                                             alt="">
                                        <span>
                    <?php

                    $name = array_slice($attribute_name, $i, 1);
                    echo $name[0]->name;

                    ?>
                </span>
                                    </div>
                                    <?php

                                }
                                ?>


                            <?php endfor ?>
                        </div>
                    <?php endforeach ?>


                    <div class="buy-btn">
                        <div class="price-section">
                            <div class="price-lable">
                                price : 
                            </div>
                            <div class="price">

                            </div>
                        </div>


                        <a class="add-to-cart" value="">add to cart</a>
                    </div>
 

мои функции :

 function get_varible_data()
{

    $producit_id = $_POST['p_id'];
    $region_id = $_POST['region_id'];

    $product = wc_get_product($producit_id);

    $attributes = $product->get_attributes();
    $get_variation_attributes = $product->get_variation_attributes();
    $available_variations = $product->get_available_variations();

    foreach ($available_variations as $available_variation) {
        $regions = $available_variation['attributes']['attribute_pa_regions'];
        $varible_id = $available_variation['variation_id'];
        $charge = $available_variation['attributes']['attribute_pa_charge-amount'];
        $display_price = $available_variation['display_price'];


        $pa_charge_amount_ = 'pa_charge-amount';
        $pa_charge_amount_meta = get_post_meta($available_variation['variation_id'], 'attribute_' . $pa_charge_amount_, true);
        $pa_charge_amount_term = get_term_by('slug', $pa_charge_amount_meta, $pa_charge_amount_);


        if ($region_id === $regions) {

            $vari_g[] = array(
                'group' => $region_id,
                'price' => $display_price,
                'slug' => $charge,
                'id' => $varible_id,
                'name' => $pa_charge_amount_term->name,
            );

            $html = '<div id="' . $varible_id . '" class="charge-item">' . $pa_charge_amount_term->name . '</div>';

            echo $html;
        }
    }

    wp_die();

}

add_action("wp_ajax_get_varible_data", "get_varible_data");
add_action("wp_ajax_nopriv_get_varible_data", "get_varible_data");

function get_varible_ch_data()
{


    $variation_id = $_POST['charge_id'];
    $price = get_post_meta($variation_id, '_price', true);

    echo $price;

    wp_die();

}

add_action("wp_ajax_get_varible_ch_data", "get_varible_ch_data");
add_action("wp_ajax_nopriv_get_varible_ch_data", "get_varible_ch_data");
 

и мой аякс :

 <script>

            function request_ajax_call_varible(metodth, id) {

                $('.card-buy').css('cursor', 'wait');
                var hastag = '#';
                var ajaxurl = "<?php bloginfo('url'); ?>/wp-admin/admin-ajax.php";

                if (metodth === 'get_var_id') {

                    jQuery.ajax({

                        type: "POST",
                        url: ajaxurl,
                        dataType: 'html',
                        data: {
                            action: "get_varible_data",
                            p_id: <?= get_the_id() ?>,
                            region_id: id,

                        },


                        success: function (response) {

                            jQuery(hastag   id).addClass('active');
                            jQuery('.charge').html(response);

                            $('.card-buy').css('cursor', 'default');

                        }
                    })
                }

                if (metodth === 'get_price') {

                    var before_link = '<?php bloginfo('url'); ?>/cart/?add-to-cart=';
                    var link = before_link   id;
                    jQuery.ajax({

                        type: "POST",
                        url: ajaxurl,
                        dataType: 'html',
                        data: {
                            action: "get_varible_ch_data",
                            charge_id: id,
                        },


                        success: function (response) {

                            jQuery('.price').html(toFarsiNumber(numberWithCommas(response))   '<span class="price-symbole">تومان </span>');


                            jQuery(hastag   id).addClass('active');
                            jQuery("a.add-to-cart").attr("href", link)
                            $('.card-buy').css('cursor', 'default');

                        }
                    })
                }
            }

            jQuery('.region-item').click(function (e) {

                $('div.region-item').removeClass('active');
                request_ajax_call_varible('get_var_id', jQuery(this).attr('id'))

            });


            $('div.charge').on('click', 'div.charge-item', function () {

                $('div.charge-item').removeClass('active');
                request_ajax_call_varible('get_price', jQuery(this).attr('id'))

            })


            function numberWithCommas(x) {
                return x.toString().replace(/B(?=(d{3}) (?!d))/g, ",");
            }


            function toFarsiNumber(n) {
                const farsiDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];

                return n
                    .toString()
                    .replace(/d/g, x => farsiDigits[x]);
            }

            var first_item = $($('.region-item')[0]);
            first_item.ready(function () {

                first_item.addClass('active');
                request_ajax_call_varible('get_var_id', first_item.attr('id'))
            });


            $(document).ready(function () {
                setTimeout(function () {
                    var first_cha = $($('.charge-item')[0]);
                    first_cha.ready(function () {

                        first_cha.addClass('active');

                        request_ajax_call_varible('get_price', first_cha.attr('id'))
                    });
                }, 1000);
            })


        </script>
 

Я надеюсь, что этот метод сработает для вас.
Если у вас есть другой метод, пожалуйста, скажите мне
спасибо