В моем проекте я настраиваю некоторые функции WooCommerce.
Мои «способы доставки»:
1. доставка
2. отнять
Я также добавил настраиваемое поле на странице проверки, которое является <select>
заполненным действительными сроками доставки (случай «1») или для удаления (случай «2»).
Может случиться так, что пользователь выбирает 2. take away
на странице корзины, затем выбирает время, действующее для «2», но затем меняется на 1. delivery
и выбранное время могут быть недействительными больше, ни список опций, ни пользовательский полевая метка.
Конечно, я использую woocommerce_checkout_process
чтобы предупредить пользователя через wc_add_notice()
, но даже если woocommerce_checkout_fields
крючок woocommerce_checkout_fields
(именно там я создаю список выбора), значения <select>
не обновляются.
Я думаю, что существует вызов AJAX, связанный только с методом доставки и не обновляющий другие поля проверки, хотя woocommerce_checkout_fields
hook.
Как обновить настраиваемые поля? Нужен ли мне js / jquery / AJAX?
Или: может ли настраиваемое поле быть связано с методом доставки (и обновляться через AJAX с ним)? Как?
РЕДАКТИРОВАТЬ
Код пользовательского поля:
add_filter( 'woocommerce_checkout_fields', 'fty_filter_checkout_fields' ); function my_filter_checkout_fields($fields) { $must_deliver = WC()->cart->shipping_total > 0.0; // true=deliver, false=take away // some complex code to calculate time lists omitted, samples array instead: $delivery_time_list = array( "deliver 10:00", "deliver 11:00", "deliver 12:00", "deliver 13:00" ); $takeaway_time_list = array( "takeaway 10:00", "takeaway 10:30", "takeaway 11:00", "takeaway 11:30", "takeaway 12:00", "takeaway 12:30", "takeaway 13:00", "takeaway 13:30" ); // add the new conditional field if($must_deliver) { $fields['my_delivery_datetime'] = array( 'my_delivery_time' => array( 'type' => 'select', 'options' => $delivery_time_list, 'required' => true, 'label' => __('Delivery time') ) ); } else { $fields['my_delivery_time'] = array( 'my_delivery_time' => array( 'type' => 'select', 'options' => $takeaway_time_list, 'required' => true, 'label' => __('Take away time') ) ); } return $fields; }
идея кода проверки:
add_action('woocommerce_checkout_process', 'my_checkout_date_time_validation', 30, 1); function my_checkout_date_time_validation($doh) { $time = filter_input(INPUT_POST, 'my_delivery_time'); $shipping = filter_input(INPUT_POST, 'shipping_method', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY); if(strpos($time, "deliver")!==FALSE && strpos($shipping[0], "local_pickup")!==FALSE) { wc_add_notice('Please re-select take away time', 'error'); } else if(strpos($time, "takeaway")!==FALSE && strpos($shipping[0], "distance_based_rate")!==FALSE) { wc_add_notice('Please re-select delivery time', 'error'); } }
вот о методах доставки;
add_action( 'woocommerce_flat_rate_shipping_add_rate', 'add_distance_based_delivery_rate', 10, 2 ); function add_distance_based_delivery_rate( $method, $rate ) { $new_rate = $rate; $new_rate['id'] .= ':' . 'distance_based_rate'; $new_rate['label'] = 'delivery'; // Rename to 'Rushed Shipping'. // incredibly complex code used to calculate delivery costs omitted $dist_cost = 1000; $new_rate['cost'] += $dist_cost; $method->add_rate( $new_rate ); }
Thanx!