Сохраните и отобразите дополнительное поле платежного шлюза везде в Woocommerce - PullRequest
1 голос
/ 22 мая 2019

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

Как сохранить и отобразить параметры заказов и уведомлений по электронной почте?

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Продолжение " Дополнительное поле для оформления заказа для определенного платежного шлюза в Woocommerce "

Вот полный способ:

  1. Добавить выпадающий список с вариантами оплаты BACS
  2. Проверка поля (обязательная опция)
  3. Сохранить выбранную опцию как заказ пользовательских метаданных
  4. Отображение выбранной опции в итоговых суммах заказов (уведомления о заказах и электронных письмах)
  5. Отображение выбранной опции на странице редактирования заказа администратора ниже платежных данных.

код:

// BACS payement gateway description: Append custom select field
add_filter( 'woocommerce_gateway_description', 'gateway_bacs_custom_fields', 20, 2 );
function gateway_bacs_custom_fields( $description, $payment_id ){
    //
    if( 'bacs' === $payment_id ){
        ob_start(); // Start buffering

        echo '<div  class="bacs-options" style="padding:10px 0;">';

        woocommerce_form_field( 'bacs_option', array(
            'type'          => 'select',
            'label'         => __("Fill in this field", "woocommerce"),
            'class'         => array('form-row-wide'),
            'required'      => true,
            'options'       => array(
                ''          => __("Select something", "woocommerce"),
                'Option 1'  => __("Choice one", "woocommerce"),
                'Option 2'  => __("Choice two", "woocommerce"),
            ),
        ), '');

        echo '<div>';

        $description .= ob_get_clean(); // Append buffered content
    }
    return $description;
}

// Checkout custom field validation
add_action('woocommerce_checkout_process', 'bacs_option_validation' );
function bacs_option_validation() {
    if ( isset($_POST['payment_method']) && $_POST['payment_method'] === 'bacs'
    && isset($_POST['bacs_option']) && empty($_POST['bacs_option']) ) {
        wc_add_notice( __( 'Please Select an option for "Direct Bank Transfer" payment, please.' ), 'error' );
    }
}

// Checkout custom field save to order meta
add_action('woocommerce_checkout_create_order', 'save_bacs_option_order_meta', 10, 2 );
function save_bacs_option_order_meta( $order, $data ) {
    if ( isset($_POST['bacs_option']) && ! empty($_POST['bacs_option']) ) {
        $order->update_meta_data( '_bacs_option' , esc_attr($_POST['bacs_option']) );
    }
}

// Display custom field on order totals lines everywhere
add_action('woocommerce_get_order_item_totals', 'display_bacs_option_on_order_totals', 10, 3 );
function display_bacs_option_on_order_totals( $total_rows, $order, $tax_display ) {
    if ( $order->get_payment_method() === 'bacs' && $bacs_option = $order->get_meta('_bacs_option') ) {
        $sorted_total_rows = [];

        foreach ( $total_rows as $key_row => $total_row ) {
            $sorted_total_rows[$key_row] = $total_row;
            if( $key_row === 'payment_method' ) {
                $sorted_total_rows['bacs_option'] = [
                    'label' => __( "Bank wire option", "woocommerce"),
                    'value' => esc_html( $bacs_option ),
                ];
            }
        }
        $total_rows = $sorted_total_rows;
    }
    return $total_rows;
}

// Display custom field in Admin orders, below billing address block
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_bacs_option_near_admin_order_billing_address', 10, 1 );
function display_bacs_option_near_admin_order_billing_address( $order ){
    if( $bacs_option = $order->get_meta('_bacs_option') ) {
        echo '<div class="bacs-option">
        <p><strong>'.__('BACS option').':</strong> ' . $bacs_option . '</p>
        </div>';
    }
}

Код помещается в файл functions.php вашей активной дочерней темы (или активной темы). проверено и работает.

На странице оформления заказа :

enter image description here


На странице получения заказа (при просмотре заказа и уведомлениях по электронной почте):

enter image description here


На страницах заказа администратора :

enter image description here

0 голосов
/ 22 мая 2019

add_action ('woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta');

функция custom_checkout_field_update_order_meta ($ order_id)

{

if (! Empty ($ _ POST ['field_slug'])) {

update_post_meta ($ order_id, 'Some key', sanitize_text_field ($ _ POST ['field_slug']));

}

} чтобы получить это значение в деталях заказа или на странице шаблона электронной почты, вы можете использовать get_post_meta ($ order_id, 'Some key', false);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...