Сделать так, чтобы электронная почта администратора Woocommerce (3.8.0) включала данные моих настраиваемых полей со страницы оформления заказа

Я создал несколько настраиваемых полей на странице оформления заказа woocommerce. Мой код правильный, и поля отображаются правильно. Я сохранил данные поля и отобразил их в панели администратора. Мой код правильный, и поля отображаются правильно.

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

Все остальные ответы stackoverflow по этой теме полагаются на устаревший фильтр woocommerce_email_order_meta_keys Нет stackoverflow, который отвечает фильтром woocommerce 3.8.0 woocommerce_email_order_meta_fields.

Я использую woocommerce 3.8.0 и wordpress 5.3. Я сохраняю эти файлы в wp-content / themes / child-theme / functions.php

WTF не так с моим кодом? Я проверял это снова и снова и не могу понять, что не так. Может кто-нибудь сказать мне, что я делаю не так? Я рубиновый разработчик, пытающийся научиться php и wordpress.

add_filter('woocommerce_email_order_meta_fields','custom_woocommerce_email_order_meta_fields', 10, 3 );

function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
    $fields['custom_field_1'] = array(
        'label' => __( 'custom_field_1' ),
        'value' => get_post_meta( $order->id, 'custom_field_1', true ),
    );
    $fields['custom_field_2'] = array(
        'label' => __( 'custom_field_2' ),
        'value' => get_post_meta( $order->id, 'custom_field_2', true ),
    );
    $fields['custom_field_3'] = array(
        'label' => __( 'custom_field_3' ),
        'value' => get_post_meta( $order->id, 'custom_field_3', true ),
    );
    $fields['custom_field_4'] = array(
        'label' => __( 'custom_field_4' ),
        'value' => get_post_meta( $order->id, 'custom_field_4', true ),
    );
    return $fields;
}

Мои настраиваемые поля формы на странице оформления заказа woocommerce находятся здесь

add_filter( 'woocommerce_checkout_fields', 'isca_custom_checkout_fields' );`
function isca_custom_checkout_fields($fields){
    $fields['isca_extra_fields'] = array(
            'custom_field_1' => array(
                'class' => array(
                    'form-row-first'
                  ),
                'type' => 'text',
                'required'      => true,
                'placeholder' => __( 'Name' )
                ),
            'custom_field_2' => array(
                'class' => array(
                    'form-row-last'
                  ),
                'type' => 'text',
                'required'      => true,
                'placeholder' => __( 'Nickname' )
                ),   
            'custom_field_3' => array(
                'class' => array(
                    'form-row-first'
                  ),
                'type' => 'text',
                'required'      => true,
                'placeholder' => __( 'Favorite Exercise' )
                ),  
            'custom_field_4' => array(
                'class' => array(
                    'form-row-last'
                  ),
                'type' => 'text',
                'required'      => false,
                'placeholder' => __( 'Favorite Stretch' )
                ),   
            );
    return $fields;
}

Затем я добавляю его на страницу оформления заказа woocomerce с помощью этого кода

add_action( 'woocommerce_after_checkout_billing_form' ,'isca_extra_checkout_fields' );
function isca_extra_checkout_fields(){
    $checkout = WC()->checkout(); ?>
    <br/>
    <div class="extra-fields">
    <h3><?php _e( 'Fitness Information' ); ?></h3>
    <?php
       foreach ( $checkout->checkout_fields['isca_extra_fields'] as $key => $field ) : ?>
            <?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
        <?php endforeach; ?>
    </div>
<?php }


person David Lee    schedule 14.11.2019    source источник


Ответы (1)


WordPress имеет возможность включить режим отладки, чтобы можно было выявлять и устранять ошибки и предупреждения. Ошибки будут регистрироваться в файле с именем debug.log в папке wp-content папки WordPress, пока ваш код будет делать какие-либо ошибки. Поэтому при разработке в WordPress вам нужно включить три варианта. Перейдите к wp-config.php и добавьте эти три строки кода

define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );

ваша функция custom_woocommerce_email_order_meta_fields имеет ошибку. Вы неправильно позвонили по идентификатору заказа. Журнал ошибок покажет это. Свойства заказа не следует вызывать напрямую. Поэтому вам нужно изменить $order->id на $order->get_id(). Так что измените функцию на

function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
    if( !$sent_to_admin ){
        return;
    }
    $fields['custom_field_1'] = array(
        'label' => __( 'custom field 1' ),
        'value' => get_post_meta( $order->get_id(), 'custom_field_1', true ),
    );
    $fields['custom_field_2'] = array(
        'label' => __( 'custom field 2' ),
        'value' => get_post_meta( $order->get_id(), 'custom_field_2', true ),
    );
    $fields['custom_field_3'] = array(
        'label' => __( 'custom field 3' ),
        'value' => get_post_meta( $order->get_id(), 'custom_field_3', true ),
    );
    $fields['custom_field_4'] = array(
        'label' => __( 'custom field 4' ),
        'value' => get_post_meta( $order->get_id(), 'custom_field_4', true ),
    );
    return $fields;
}

Также вы не написали код для сохранения настраиваемых полей, которые вы добавили на страницу оформления заказа. Вы пытаетесь найти значения, которые не сохранены в мета-порядке. Вам необходимо написать код, чтобы сохранить добавленные настраиваемые поля оформления заказа в метаданные для заказа, как показано ниже.

add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');
function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ($_POST['custom_field_1']) update_post_meta( $order_id, 'custom_field_1', esc_attr($_POST['custom_field_1']));
    if ($_POST['custom_field_2']) update_post_meta( $order_id, 'custom_field_2', esc_attr($_POST['custom_field_2']));
    if ($_POST['custom_field_3']) update_post_meta( $order_id, 'custom_field_3', esc_attr($_POST['custom_field_3']));
    if ($_POST['custom_field_4']) update_post_meta( $order_id, 'custom_field_4', esc_attr($_POST['custom_field_4']));
}

Выполнено . . . Теперь все отлично добавлено в емейл (проверено и подтверждено). Кроме того, поскольку вы сказали, что эти поля отображаются в электронных письмах администратора, вы должны проверить это условие, используя

if( !$sent_to_admin ){
   return;
}

который я добавил в функцию custom_woocommerce_email_order_meta_fields.

person melvin    schedule 14.11.2019
comment
OMG, вы решили это. Если бы я был в одной комнате с вами, я бы поцеловал землю, по которой вы идете. Также благодарю за совет WP_DEBUG. Это позволит сэкономить время в будущем. - person David Lee; 14.11.2019
comment
@davidlee Оххх. . . Это лучшие слова, которые я слышал за долгое время :) Каждый заслуживает помощи. Вот так все растут;) - person melvin; 15.11.2019