Значение флажка не сохраняется в корзине Woocommerce и при оформлении заказа

У меня проблема с сохранением пользовательского значения флажка в корзине woocommerce и при оформлении заказа.

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

Я попытался сохранить значение флажка в файлах cookie с чем-то вроде этого

var checkbox = $('#your-form :checkbox:first'),
    checkboxCookieName = 'checkbox-state';

checkbox.prop('checked', +$.cookie(checkboxCookieName));

checkbox.click(function() {
   $.cookie(checkboxCookieName, +this.checked);
});

Но это не сработало.

Код для флажка:

function my_custom_checkout_field() {
    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    $chosen_shipping = $chosen_methods[0]; 
    if ($chosen_shipping == 'nova_poshta_shipping_method') { 
    echo '<div id = "my_custom_checkout_field">';

    woocommerce_form_field( 'my_field_name', array(
        'type'      => 'checkbox',
        'checked'      => 'checked',
        'class'     => array('input-checkbox'),
        'label'     => __('<span class = "paperbagspan">Добавить фирменный пакет <img class = "paperbag" src = "https://paradisefruit.com.ua/wp-content/uploads/2019/06/paper-bag.png" style = "width:30px"><img class = "paperbagpink" style = "display:none; width:30px" src = "https://paradisefruit.com.ua/wp-content/uploads/2019/06/paper-bag-pink.png" ></span>'),
    ),  WC()->checkout->get_value( 'my_field_name' ) );
    echo '</div>';
}
}
add_action( 'woocommerce_after_shipping_rate', 'checkout_shipping_additional_field', 20, 2 );
function checkout_shipping_additional_field( $method, $index )
{
    if ( $method->get_id() == 'nova_poshta_shipping_method' ){
       return my_custom_checkout_field();
    }
}


// Save the custom checkout field in the order meta, when checkbox has been checked
add_action( 'woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta', 10, 1 );
function custom_checkout_field_update_order_meta( $order_id ) {

    if ( ! empty( $_POST['my_field_name'] ) )
        update_post_meta( $order_id, 'my_field_name', sanitize_text_field($_POST['my_field_name'] ));
}

Что я делаю неправильно или есть какая-то функция WordPress, которая сохраняет значения настраиваемых полей?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
399
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Надеюсь, я правильно понял, т.е. у вас есть флажок, и при каждом вводе значение сохраняется в файле cookie. При загрузке страницы вы извлекаете значение файла cookie и устанавливаете для него флажок. Все работает хорошо, за исключением случаев, когда вы делаете запрос AJAX и загружаете все это.

Похоже, это скорее проблема с javascript (а не с PHP).

При загрузке страницы вы уже отмечаете флажок как выбранный на основе значения файла cookie. Однако, когда вы выполняете запрос AJAX, вы вытаскиваете флажок, и код javascript, который отвечает за установку значения флажка, больше не вызывается. (т.е. checkbox.prop('checked', +$.cookie(checkboxCookieName))).

Что вам нужно сделать, это вызвать:

checkbox.prop('checked', +$.cookie(checkboxCookieName));

при завершении запроса ajax и ПОСЛЕ внедрения HTML

Woocommerce имеет эти три события:

updated_wc_div updated_cart_totals updated_shipping_method

Я не совсем понимаю, что вы пытаетесь сделать, но вы должны подключить свой код к одному из них в зависимости от ваших потребностей. Способ сделать это (например, используя updated_cart_totals):

$(document).on('updated_cart_totals', function(){
    checkbox.prop('checked', +$.cookie(checkboxCookieName));
});

Надеюсь, это полезно.

я должен поместить его в checkout.js Woocommerce? Или сделать отдельный вызов ajax в пользовательском файле js?

Roman Selin 19.06.2019 14:25

Не рекомендуется редактировать исходные файлы, так как вы потеряете свои изменения при каждом обновлении. Woocommerce JS запускает события в определенные моменты, поэтому вам нужно привязать свое действие к этому хуку. Однако я не совсем понимаю, что вы пытаетесь сделать, поэтому я не могу предложить вам использовать какие-либо события. Или вы можете просмотреть файлы cookie PHP и установить значение прямо из PHP.

CptKicks 19.06.2019 14:37

Другие вопросы по теме