Проверьте и сохраните дополнительное поле оформления заказа для определенного платежного шлюза в Woocommerce
Мне нужно показать поле ввода текста, когда клиенты выбирают шлюз BACS, и я хотел бы, чтобы значение поля ввода добавлялось к заказам и уведомлениям по электронной почте.
Я использую дополнительное поле при оформлении заказа для определенного шлюза оплаты в коде ответа Woocommerce, где я изменил поле выбора на поле ввода текста:
add_filter( 'woocommerce_gateway_description', 'gateway_bacs_custom_fields', 20, 2 );
function gateway_bacs_custom_fields( $description, $method_id ){
//
if( $method_id == 'bacs' ){
ob_start(); // Start buffering
echo '<div class="bacs-fields" style="padding:10px 0;">';
woocommerce_form_field( 'field_slug', array(
'type' => 'text',
'label' => __("Udfyld EAN", "woocommerce"),
'class' => array('form-row-wide'),
'required' => true,
), '');
echo '<div>';
$description .= ob_get_clean(); // Append buffered content
}
return $description;
}
Он отлично работает на странице оформления заказа, где отображается поле.
Но введенное текстовое значение не сохраняется в заказах и почтовых уведомлениях.
Как сохранить и добавить это введенное текстовое значение в заказы и уведомления по электронной почте?
1 ответ
Существует много пропущенных шагов, так как код ответа, который вы используете, просто отображает поле в кассе под описанием платежа BACS:
Вам необходимо (только когда BACS является выбранным способом оплаты):
- Проверить поле
- Сохранить введенное значение в заказ
- Отображение значения поля в Заказе получен и Просмотр заказа (Моя учетная запись)
- Отображать значение поля в уведомлениях по электронной почте
- Отобразить значение поля на страницах заказа на правку администратора.
Таким образом, как вы видите, то, что вы спрашиваете, огромно (слишком широко) и потребует дополнительного нового вопроса для пунктов 3, 4 и 5, где вам нужно будет указать, где вы хотите вывести его (местоположение).
Весь код для шагов 1 и 2:
add_filter( 'woocommerce_gateway_description', 'gateway_bacs_appended_custom_text_fields', 10, 2 );
function gateway_bacs_appended_custom_text_fields( $description, $payment_id ){
if( $payment_id === 'bacs' ){
ob_start(); // Start buffering
echo '<div class="bacs-fields" style="padding:10px 0;">';
woocommerce_form_field( 'udfyld_ean', array(
'type' => 'text',
'label' => __("Udfyld EAN", "woocommerce"),
'class' => array('form-row-wide'),
'required' => true,
), '');
echo '<div>';
$description .= ob_get_clean(); // Append buffered content
}
return $description;
}
// Process the field (validation)
add_action('woocommerce_checkout_process', 'udfyld_ean_checkout_field_validation');
function udfyld_ean_checkout_field_validation() {
if ( $_POST['payment_method'] === 'bacs' && isset($_POST['udfyld_ean']) && empty($_POST['udfyld_ean']) )
wc_add_notice( __( 'Please enter your "Udfyld EAN" number.' ), 'error' );
}
// Save "Udfyld EAN" number to the order as custom meta data
add_action('woocommerce_checkout_create_order', 'save_udfyld_ean_to_order_meta_data', 10, 4 );
function save_udfyld_ean_to_order_meta_data( $order, $data ) {
if( $data['payment_method'] === 'bacs' && isset( $_POST['udfyld_ean'] ) ) {
$order->update_meta_data( '_udfyld_ean', sanitize_text_field( $_POST['udfyld_ean'] ) );
}
}
Код помещается в файл function.php вашей активной дочерней темы (или активной темы). проверено и работает.
Чтобы получить значение этого настраиваемого поля из
$order
WC_Order
объект, который вы будете использовать:$udfyld_ean = $order->get_meta('_udfyld_ean');
Или из
$order_id
идентификатор заказа вы можете использовать WordPressget_post_meta()
функция:$udfyld_ean = get_post_meta( $order_id, '_udfyld_ean', true );
Проверка поля (для BACS в качестве выбранного способа оплаты):
Введенное значение поля сохраняется в метаданных заказа (вид phpMyAdmin в wp_postmeta
Таблица):