@graf45231

Как изменить цену товара при добавлении в корзину?

Сделал плагин для добавления монограмм к товарам вукоммерс. Использую хуки для добавления данных монограммы в мета данные товара, товары вариативные. Вот код в functions.php

//Monogramma
add_filter('woocommerce_add_cart_item_data', 'MTWC_add_item_data', 10, 3);

function MTWC_add_item_data($cart_item_data, $product_id, $variation_id)
{
    if( isset($_REQUEST['mono_check']))
    {
        $cart_item_data['mono_check'] =  $_REQUEST['mono_check'];
        if( isset($_REQUEST['mono_symbols']))
        {
            $cart_item_data['mono_symbols'] =  $_REQUEST['mono_symbols'];
        }
        if( isset($_REQUEST['mono_type']))
        {
            $cart_item_data['mono_type'] =  $_REQUEST['mono_type'];
        }
    }

    return $cart_item_data;
}
add_filter('woocommerce_get_item_data', 'MTWC_add_item_meta', 10, 2);

function MTWC_add_item_meta($item_data, $cart_item)
{
    if(array_key_exists('mono_check', $cart_item))
    {
        if($cart_item['mono_check'] == "on")
            $custom_details = "Есть";
        else
            $custom_details = "Нет";

        $item_data[] =  array(
            'key'   =>  'Монограмма',
            'value' => $custom_details.", Тип монограммы: ".$cart_item['mono_type'].", Символы: ".$cart_item['mono_symbols'],
        );
    }

    return $item_data;
}
add_action( 'woocommerce_checkout_create_order_line_item', 'MTWC_add_custom_order_line_item_meta', 10, 4 );

function MTWC_add_custom_order_line_item_meta($item, $cart_item_key, $values, $order)
{
    if(array_key_exists('mono_check', $values))
    {
        if($values['mono_check'] == "on")
            $custom_details = "Есть";
        else
            $custom_details= "Нет";

        $item->add_meta_data('Монограмма', $custom_details.", Тип монограммы: ".$values['mono_type'].", Символы: ".$values['mono_symbols']);
    }
}


Как мне изменить код для изменения цены товара?

И еще не связано с данным вопросом, но все же хотелось бы подсказки в этом...
Данные монограммы иногда не передаются. То есть хук не отлавливает передающиеся данные, касающиеся моего плагина.

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

<?php if (count($this->data['preview']) != 0): ?>
    <div class="adv preview">
        <input type="checkbox" name="mono_check" onclick="isChecked(this)"/>
        <label for="mono_check">Добавить монограмму</label>
        <div class="hidden overlay" onclick="overlayShowHide()"
             style="position: fixed;                   background: rgba(0, 0, 0, 0.5);                   top: 0;                   bottom: 0;                   left: 0;                   right: 0;                   z-index: 9999;            ">
            <div class="prev-panel" onclick="event.stopPropagation()">
                <div class="close_btn" onclick="overlayShowHide()">X</div>
                <h2>Предпросмотр</h2>
                <div class="monos">
                    <div class="mono_btn mono_btn_1"
                         style="background-image: url('<? echo $this->plugin_url ?>/monos/1.png')"
                         onclick="selectMono(this)" data-count="2" data-type="1"><p>R</p>
                        <p>A</p></div>
                    <div class="mono_btn mono_btn_2"
                         style="background-image: url('<? echo $this->plugin_url ?>/monos/2.png')"
                         onclick="selectMono(this)" data-count="2" data-type="2"><p>A</p>
                        <p>B</p></div>
                    <div class="mono_btn mono_btn_3"
                         style="background-image: url('<? echo $this->plugin_url ?>/monos/3.png')"
                         onclick="selectMono(this)" data-count="1" data-type="3"><p>M</p></div>
                    <div class="mono_btn mono_btn_4"
                         style="background-image: url('<? echo $this->plugin_url ?>/monos/4.png')"
                         onclick="selectMono(this)" data-count="1" data-type="4"><p>M</p></div>
                    <div class="mono_btn mono_btn_5"
                         style="background-image: url('<? echo $this->plugin_url ?>/monos/5.png')"
                         onclick="selectMono(this)" data-count="3" data-type="5"><p>M</p>
                        <p>A</p>
                        <p>G</p></div>
                    <div class="mono_btn mono_btn_6" onclick="selectMono(this)" data-count="2" data-type="6"><p>S&P</p>
                    </div>
                    <div class="mono_btn mono_btn_7" onclick="selectMono(this)" data-count="1" data-type="7"><p>A</p>
                    </div>
                </div>
                <p class="input_text">Введите 1 символ</p> 
                <input name="mono_symbols" class="symbols"
                                                                                type="text" onchange="symbol(this)"
                                                                                onkeyup="this.value = this.value.toUpperCase();"
                                                                                maxlength="3"/> <input name="mono_type"
                                                                                                       class="mono_type hidden"
                                                                                                       type="text"/>
                <div class="prev_image" style="background-image: url(<? echo $this->data['preview']['prev_src'] ?> )"
                     onclick="look(this)">
                    <div style="background-image: url('<? echo $this->plugin_url ?>monos/2.png'); left: <?php echo $this->data['preview']['prev_X'] ?>; top: <?php echo $this->data['preview']['prev_Y'] ?>;  width: <?php echo $this->data['preview']['preview_size'] ?>px" class="draggable"/>
                </div>
            </div>
        </div>
    </div>
</div>


А вот ниже будет код внутри шаблона "variation-add-to-cart-button.php".

На моем сайте все нормально работает, но на сайте, в который закинул плагин, отказывается нормально работать. У меня сайт по минимум загружен плагинами, стоит только вукомерс и пару вспомогательных плагинов, не касающихся вукоммерс, а вот сайт друга использует кучу плагинов, которые напрямую связаны с вукоммерс. Как понять в чем проблема? Он не отправляет мета данные монограммы при отправке товара.
При изменении onclick кнопки отправки товара в корзину, начал отправлять данные, но не всегда, иногда не отправляет. понять почему так происходит не получилось. Плагины только учусь писать, строго не судите.

<?
    require_once ABSPATH . 'wp-admin/includes/plugin.php';
    if(is_plugin_active( 'monogramm-to-woocommerce/monogramm-to-woocommerce.php' )) {
        echo do_shortcode('[show_preview]');
    }
    ?>
    <script>
        document.querySelector('form.variations_form.cart [type="submit"]').onclick = function (e) {
                e.preventDefault();
                document.querySelector('form.variations_form.cart').submit();
            }
    </script>


Уже третий день бьюсь наж этим, не могу разобраться. Если каких то данных не хватает, то пишите, все скину.
  • Вопрос задан
  • 847 просмотров
Решения вопроса 1
@graf45231 Автор вопроса
Решил первую проблему путем добавления одной функции и редактирования написанной. Вот код, мб кому то пригодится.

function MTWC_add_item_data($cart_item_data, $product_id, $variation_id)
{
    if( isset($_REQUEST['mono_check'])) {
        $cart_item_data['mono_check'] = $_REQUEST['mono_check'];
        if (isset($_REQUEST['mono_symbols'])) {
            $cart_item_data['mono_symbols'] = $_REQUEST['mono_symbols'];
        }
        if (isset($_REQUEST['mono_type'])) {
            $cart_item_data['mono_type'] = $_REQUEST['mono_type'];
        }
        //Запоминаем новую цену товара при отправке в корзину
        $product = wc_get_product($product_id); 
        $price = $product->get_price();
        $cart_item_data['warranty_price'] = $price + 700;
    }
    return $cart_item_data;
}
add_filter('woocommerce_get_item_data', 'MTWC_add_item_meta', 10, 2);

//Меняем цену товара перед расчетом цены
function before_calculate_totals( $cart_obj ) {
    foreach( $cart_obj->get_cart() as $key=>$value ) {
        if( isset( $value['warranty_price'] ) ) {
            $price = $value['warranty_price'];
            $value['data']->set_price( ( $price ) );
        }
    }
}
add_action( 'woocommerce_before_calculate_totals', 'before_calculate_totals', 10, 1 );
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы