У меня проблема с сохранением пользовательского значения флажка в корзине 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, которая сохраняет значения настраиваемых полей?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Надеюсь, я правильно понял, т.е. у вас есть флажок, и при каждом вводе значение сохраняется в файле 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));
});
Надеюсь, это полезно.
Не рекомендуется редактировать исходные файлы, так как вы потеряете свои изменения при каждом обновлении. Woocommerce JS запускает события в определенные моменты, поэтому вам нужно привязать свое действие к этому хуку. Однако я не совсем понимаю, что вы пытаетесь сделать, поэтому я не могу предложить вам использовать какие-либо события. Или вы можете просмотреть файлы cookie PHP и установить значение прямо из PHP.
я должен поместить его в checkout.js Woocommerce? Или сделать отдельный вызов ajax в пользовательском файле js?