Я использую WooCommerce, и у меня есть настраиваемое поле оформления заказа в виде списка выбора. Я пытаюсь удалить шлюз COD, когда клиент выбирает в пользовательском поле оформления заказа конкретную опцию (в данном случае «newyork»).
Ниже приведен мой фактический код, в котором я не знаю, как заставить работать часть условия оператора IF
:
add_filter('woocommerce_available_payment_gateways', 'woocs_filter_gateways', 1);
function woocs_filter_gateways($gateway_list)
{
if ( order_meta key = "wc_billing_field_7378" value = newyork )
{
unset($gateway_list['cod']);
}
return $gateway_list;
}
Как я могу получить выбранное значение моего пользовательского поля проверки в моем коде, чтобы мой оператор IF работал?
Редактировать:
Идентификатор пользовательского поля оформления заказа wc_billing_field_7789
генерируется плагином...
🤔 А знаете ли вы, что...
PHP - это акроним рекурсивного сокращения, означающего 'PHP: Hypertext Preprocessor'.
Обновлено - Обработка нескольких запрещенных направлений…
Во-первых, для тестирования я приведу перехваченную функцию, которая отображает настраиваемое поле выбора оформления заказа с несколькими параметрами:
// Just for testing
add_action( 'woocommerce_after_checkout_billing_form', 'custom_select_field_after_checkout_billing_form', 10, 1 );
function custom_select_field_after_checkout_billing_form ( $checkout ) {
woocommerce_form_field( 'wc_billing_field_7378', array(
'type' => 'select',
'label' => __( "Destinations (custom select field)"),
'class' => array( 'form-row-wide' ),
'options' => array(
'' => __("Choose a destination"),
'naeem' => __("Naeem"),
'saad-al-abdullah' => __("Saad Al Abdullah"),
'other-one' => __("Other one"),
'last-one' => __("Last one"),
),
'required' => true,
), $checkout->get_value( 'wc_billing_field_7378' ) );
}
См. ниже дисплей:
Теперь, чтобы получить эту работающую работу, требуются jQuery и Ajax, чтобы иметь возможность включить или отключить платеж «Треска» в зависимости от выбранного значения параметра в этом пользовательском поле выбора проверки.
С этим кодом, когда выбраны «Наим» или «Другой», он скроет способ оплаты «Наложенный платеж» (наложенный платеж). Если выбран другой вариант, «Наложенный платеж» снова будет виден.
Вот этот код:
// Jquery script that send the Ajax request
add_action( 'wp_footer', 'custom_checkout_js_script' );
function custom_checkout_js_script() {
// Only on checkout
if ( is_checkout() && ! is_wc_endpoint_url() ) :
?>
<script type = "text/javascript">
jQuery(function($){
if (typeof wc_checkout_params === 'undefined')
return false;
var field = 'select[name = "wc_billing_field_7378"]';
$( 'form.checkout' ).on('change blur', field, function() {
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'checkout_chosen_destination',
'chosen_destination': $(this).val(),
},
success: function (result) {
$(document.body).trigger('update_checkout');
console.info(result); // For testing only
},
});
});
});
</script>
<?php
endif;
}
// The Wordpress Ajax PHP receiver
add_action( 'wp_ajax_checkout_chosen_destination', 'get_ajax_checkout_chosen_destination' );
add_action( 'wp_ajax_nopriv_checkout_chosen_destination', 'get_ajax_checkout_chosen_destination' );
function get_ajax_checkout_chosen_destination() {
// Checking that the posted email is valid
if ( isset($_POST['chosen_destination']) ) {
// Set the value in a custom Woocommerce session identifier
WC()->session->set('chosen_destination', esc_attr($_POST['chosen_destination']) );
// Return the session value to jQuery
echo json_encode(WC()->session->get('chosen_destination')); // For testing only
}
die(); // always use die at the end
}
// Show/Hide payment gateways
add_filter('woocommerce_available_payment_gateways', 'show_hide_cod_payment_method', 10, 1 );
function show_hide_cod_payment_method( $available_gateways ) {
// Not in backend (admin)
if ( is_admin() )
return $available_gateways;
// HERE below set the not allowed destinations in the array
$not_allowed_destinations = array('naeem', 'other-one');
if ( in_array( WC()->session->get('chosen_destination'), $not_allowed_destinations ) ) {
unset($available_gateways['cod']);
}
return $available_gateways;
}
Код находится в файле function.php вашей активной дочерней темы (или активной темы). Проверено и работает.