Отображение значения поля пользовательской проверки WooCommerce в уведомлении по электронной почте - PullRequest
1 голос
/ 11 марта 2019

У меня проблемы с передачей пользовательских переменных поля в квитанцию ​​по электронной почте.Я просмотрел StackOverflow, но, к сожалению, ни один из ответов / решений в моем случае не помог.

Поля, которые я создал, действительно правильно отображаются на панели администратора и на странице после проверки, он просто выиграл 't показать переменные в любом письме.

Здесь я создаю свое настраиваемое поле в functions.php:

function my_custom_checkout_field( $checkout ) {
echo '<div id="my_custom_checkout_field"><h2>' . __('Bezorg moment') . '</h2>';

woocommerce_form_field( 'delivery_date', array(
    'type'          => 'select',
    'options'     => array(
        '17:30-18:00' => __('17:30 - 18:00', 'woocommerce' ),
        '18:00-18:30' => __('18:00 - 18:30', 'woocommerce' )),
    'class'         => array('my-field-class form-row-wide'),
    'label'         => __('Bezorgtijd'),
    'placeholder'   => __('Zo snel mogelijk'),
    ), $checkout->get_value( 'delivery_date' ));

echo '</div>';  }

add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );

Здесь я обновляю мета сообщения:

function my_custom_checkout_field_update_order_meta( $order_id ) {
if ( ! empty( $_POST['delivery_date'] ) ) {
    update_post_meta( $order_id, 'Bezorg moment', sanitize_text_field( $_POST['delivery_date'] ) );
} }

add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );

Вот где я передаю значение на панель управления заказами администратора:

function my_custom_checkout_field_display_admin_order_meta($order){
echo '<p><strong>'.__('Bezorg moment').':</strong> ' . get_post_meta( $order->id, 'Bezorg moment', true ) . '</p>'; }

add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );

И здесь я пытаюсь передать эти значения в уведомление о новом заказе:

function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
echo '<p><strong>'.__('Bezorg moment').':</strong> ' . get_post_meta( $order->id, 'Bezorg moment', true ) . '</p>'; }

add_action( 'woocommerce_email_after_order_table', 'custom_woocommerce_email_order_meta_fields', 10, 3 );

ОднакоНезависимо от того, что я пытаюсь, ярлык будет отображаться в электронном письме, но переменные всегда передают пустое значение.Я не могу понять это, потому что точно такой же эхо правильно отображает значения на входе и на панели управления.Что я делаю не так или чем отличается электронная почта?

Заранее большое спасибо.

WordPress: 5.1 WooCommerce: 3.5.5

1 Ответ

1 голос
/ 11 марта 2019

Обновлено - Есть несколько небольших ошибок, таких как:

  • Начиная с Woocommerce 3, для получения идентификатора заказа из объекта Order используйте: $order->get_id()
  • В вашей последней функции отсутствует переменная параметра из подключенной функции, поэтому вы не можете получить правильную переменную объекта WC_Order $order, необходимую в вашем коде.
  • Правильный мета-ключ сообщения:

Дополнительные советы:

  • Лучше использовать woocommerce_checkout_create_order action hook вводить в Woocommerce 3 вместо старого woocommerce_checkout_update_order_meta action hook.
  • Вы можете использовать метод WC_Data get_meta() с объектом WC_Order вместо get_post_meta()

Вот ваш полный повторный код:

// Display a custom checkout select field after Order notes
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field', 10, 1 );
function my_custom_checkout_field( $checkout ) {
    echo '<div id="my_custom_checkout_field">
    <h2>' . __('Bezorg moment') . '</h2>';

    woocommerce_form_field( 'delivery_date', array(
        'type'          => 'select',
        'options'     => array(
            '17:30-18:00' => __('17:30 - 18:00', 'woocommerce' ),
            '18:00-18:30' => __('18:00 - 18:30', 'woocommerce' )),
        'class'         => array('my-field-class form-row-wide'),
        'label'         => __('Bezorgtijd'),
        'placeholder'   => __('Zo snel mogelijk'),
        ), $checkout->get_value( 'delivery_date' ));

    echo '</div>';
}

// Save the dropdown custom field selected value as order custom meta data:
add_action( 'woocommerce_checkout_create_order', 'my_custom_checkout_field_update_order_meta', 10, 2 );
function my_custom_checkout_field_update_order_meta( $order, $data ) {
    if ( isset($_POST['delivery_date']) && ! empty($_POST['delivery_date']) ) {
        $order->update_meta_data( 'Bezorg moment', sanitize_text_field( $_POST['delivery_date'] ) );
    } 
}

// Display the custom field value on admin order pages after billing adress:
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
function my_custom_checkout_field_display_admin_order_meta( $order ) {
    echo '<p><strong>'.__('Bezorg moment').':</strong> ' . $order->get_meta('Bezorg moment') . '</p>'; 
}

// Display the custom field value on email notifications:
add_action( 'woocommerce_email_after_order_table', 'custom_woocommerce_email_order_meta_fields', 10, 4 );
function custom_woocommerce_email_order_meta_fields( $order, $sent_to_admin, $plain_text, $email ) {
    echo '<p><strong>'.__('Bezorg moment').':</strong> ' . $order->get_meta('Bezorg moment') . '</p>';
}

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


Если вы хотите настроить адрес электронной почты только для уведомления о новом заказе , используйте вместо этого:

// Display the custom field value on "New Order" notification:
add_action( 'woocommerce_email_after_order_table', 'custom_woocommerce_email_order_meta_fields', 10, 4 );
function custom_woocommerce_email_order_meta_fields( $order, $sent_to_admin, $plain_text, $email ) {
    if( 'new_order' === $email->id )
        echo '<p><strong>'.__('delivery_date').':</strong> ' . $order->get_meta('Bezorg moment') . '</p>';
}

enter image description here

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