Вызов функции WooCommerce | woocommerce_email_before_order_table не работает при первоначальной отправке электронной почты, но работает при изменении статуса

#php #email #woocommerce

#php #Адрес электронной почты #woocommerce

Вопрос:

Я добавил некоторые дополнительные поля настроек в электронные письма клиентов и вывожу сохраненные значения во все шаблоны электронной почты клиентов с обратным вызовом на woocommerce_email_before_order_table перехват.

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

Упрощенный пример ниже

Добавление полей в электронные письма

 add_action( 'woocommerce_email_classes', 'add_settings', 9999 );
function add_settings( $email_class_list ) {
    foreach( $email_class_list as $email_class ) {
        add_filter( 'woocommerce_settings_api_form_fields_' . $email_class->id, 'the_fields', 10, 1 );
    }

    return $email_class_list;
}
 

Поля

 function the_fields( $form_fields ) {

    $form_fields['field_id_one'] = array( 
        'title'         => 'Title',
        'description'   => 'This text will appear above the email templats default content',
        'type'          => 'textarea',
        'default'       => '',
    );

    $form_fields['field_id_two'] = array( 
        'title'         => 'Title',
        'description'   => 'This text will appear above the email templats default content',
        'type'          => 'textarea',
        'default'       => '',
    );

    return $form_fields;
}
 

Отображение данных в электронном письме

 add_action( 'woocommerce_email_before_order_table', 'display_in_email', 20, 4 );
function display_in_email( $order, $sent_to_admin, $plain_text, $email ) {
    echo wpautop( $email->get_option( 'field_id_one' ) );
}
 

Я попытался просто повторить некоторый произвольный текст, и с данными, работающими при изменении статуса, это не проблема с кодом внутри обратного вызова.

Я делаю этот вызов из файла в плагине.

Комментарии:

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

2. Данные находятся в базе данных. Он сохраняется при сохранении определенных параметров электронной почты. Я добавил поля через woocommerce_settings_api_form_fields_ фильтр, и поэтому они сохраняются через класс WC_Settings_API. Я добавил полный код.

3. Сохраняются ли данные как пользовательская мета заказа? Найдены ли пользовательские поля при оформлении заказа? Важно ли сохранять эти данные в качестве параметров электронной почты? Или ваша цель просто показать эти данные в теле письма?

4. Тело электронного письма. Это очень простая задача. И это работает, но не при первой отправке электронной почты. Добавьте поле в существующий массив настроек, который сохраняется в таблице параметров, а затем отобразите эту опцию в электронном письме. Он работает и в других электронных письмах. Просто не первый заказ получил электронное письмо, инициированное оформлением заказа. Но то же самое электронное письмо работает при инициализации ручного изменения статуса. Это не связано с заказом, и я мог бы переопределить шаблон в теме, но почему также не работает перехват?

5. Я попробовал ваш код, и он работает для меня. Чтобы выполнить тест, я просто добавил default ключ каждого поля с текстом-заполнителем. В каждом первом полученном электронном письме я правильно отображаю содержимое field_id_one поля. Шаблоны следующие: WC_Email_New_Order , WC_Email_Customer_On_Hold_Order и WC_Email_Customer_Processing_Order . Попробуйте увеличить приоритет фильтра следующим образом: add_filter( 'woocommerce_settings_api_form_fields_' . $email_class->id, 'the_fields', 9999, 1 );