Страница оформления заказа Woocommerce – значение пользовательского поля флажка в email

Вопрос или проблема

Я добавил флажок на страницу оформления заказа:

add_action('woocommerce_after_order_notes', 'client_already_field');

function client_already_field( $checkout ) {

    echo '<div id="client-already-field"><h3>'.__('КЛИЕНТ УЖЕ ЕСТЬ? ').'</h3>';

    woocommerce_form_field( 'client_already_checkbox_yes', array(
        'type'          => 'checkbox',
        'class'         => array('input-checkbox-yes'),
        'label'         => __('ДА!'),
        'required'  => false,
        ), $checkout->get_value( 'client_already_checkbox_yes' ));

    echo '</div>';
}

И сохранил его в метаданные заказа (обе функции работают):

//1
add_action('woocommerce_checkout_update_order_meta', 'client_already_order_meta_yes');

function client_already_order_meta_yes( $order_id ) {
    if ($_POST['client_already_checkbox_yes']) update_post_meta( $order_id, 'Клиент Уже:Да', esc_attr($_POST['client_already_checkbox_yes']));
}

// 2
function client_already_order_meta_yes( $order_id ) {
    if( !empty( $_POST['client_already_checkbox_yes'] ) && $_POST['client_already_checkbox_yes'] == 1 )
        update_post_meta( $order_id, 'Клиент Уже:ДА', 1 ); 
}

Но когда я ставлю галочку и завершаю транзакцию, ничего не отображается в письме для администратора о получении заказа. Что я пробовал:

// 1
add_filter( 'woocommerce_email_order_meta_fields', 'client_already_email', 10, 3 );

function client_already_email( $fields, $sent_to_admin, $order_obj ) {

    $is_yes = get_post_meta( $order_obj->get_order_number(), 'client_already_checkbox_yes', true );

    if( empty( $is_yes ) )
        return $fields;

    $fields['client_already_checkbox_yes'] = array(
        'label' => __( 'Клиент Уже' ),
        'value' => 'Да'
    );
    return $fields;
}

// 2
function client_already_email( $fields, $sent_to_admin, $order_obj ) {

    $is_yes = get_post_meta( $order_obj->get_order_number(), 'client_already_checkbox_yes', true );

    if( empty( $is_yes ) )
        return $fields;

    echo "Клиент Уже? Да";

    );
    return $fields;
}

// 3
function client_already_email( $fields, $sent_to_admin, $order ) {
    $fields['client_already_checkbox_yes'] = array(
        'label' => __( 'Клиент Уже? ДА' ),
        'value' => get_post_meta( $order->id, 'client_already_checkbox_yes', true ),
    );
    return $fields;
}

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

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

Я не так уж силен в PHP, поэтому нахожусь в знакомой, но некомфортной обстановке.

Не знаю, как я пропустил ответ, он гораздо проще того, что я пытался сделать.

Из документации:

/* Чтобы использовать: 
1. Добавьте этот фрагмент в файл functions.php вашей темы
2. Измените имена ключей метаданных в фрагменте
3. Создайте пользовательское поле в заказе - например, ключ = "Код отслеживания" значение = abcdefg
4. При следующем обновлении статуса или любом другом событии, которое отправляет электронное письмо пользователю, они увидят это поле в своем письме
*/
add_filter('woocommerce_email_order_meta_keys', 'my_custom_order_meta_keys');

function my_custom_order_meta_keys( $keys ) {
     $keys[] = 'Код отслеживания'; // Это будет искать пользовательское поле с названием 'Код отслеживания' и добавлять его в письма
     return $keys;
}

в моем случае

add_filter('woocommerce_email_order_meta_keys', 'client_already_email_yes');

function client_already_email_yes( $keys ) {
     $keys[] = 'Клиент Уже:ДА'; // Это будет искать пользовательское поле с названием 'Код отслеживания' и добавлять его в письма
     return $keys;
}

Это возвращает значение 1 из отмеченного флажка и помещает его в конец текста письма. Это не совсем красиво, но достаточно хорошо.

Ответ или решение

При интеграции пользовательских полей на страницу оформления заказа WooCommerce, часто возникают задачи отображения этих данных в уведомлениях для администратора и клиентов. Проблема, с которой столкнулись в данном случае, связана с отображением значения кастомного чекбокса в email-уведомлениях после оформления заказа. Давайте подробно разберем, как эффективно решить эту задачу.

Теория

В WooCommerce пользовательские поля на этапе оформления заказа можно добавить с помощью хуков и функций. Данные, введенные пользователем, сохраняются в мета-полях заказа, и затем эти мета-данные могут быть использованы в шаблонах или уведомлениях. Основная цель в данном случае – отобразить значение чекбокса "Client Already" в email, который отправляется после завершения заказа.

Для решения этой задачи необходимо:

  1. Добавить и отображать пользовательское поле на странице оформления заказа.
  2. Сохранить введенные данные в мета-поля заказа.
  3. Извлечь и отобразить эти данные в email-уведомлениях.

Пример

У вас уже реализовано добавление чекбокса на странице оформления заказа через функцию client_already_field:

add_action('woocommerce_after_order_notes', 'client_already_field');

function client_already_field( $checkout ) {
    echo '<div id="client-already-field"><h3>' . __('CLIENT ALREADY? ') . '</h3>';
    woocommerce_form_field( 'client_already_checkbox_yes', array(
        'type' => 'checkbox',
        'class' => array('input-checkbox-yes'),
        'label' => __('YES!'),
        'required' => false,
    ), $checkout->get_value( 'client_already_checkbox_yes' ));
    echo '</div>';
}

Также вы осуществляете сохранение данных в мета-поля заказа. Возможно, вы используете лишнюю функцию, но правильная функция должна выглядеть примерно так:

add_action('woocommerce_checkout_update_order_meta', 'client_already_order_meta_yes');

function client_already_order_meta_yes( $order_id ) {
    if (!empty($_POST['client_already_checkbox_yes'])) {
        update_post_meta($order_id, 'Client Already:YES', 1);
    }
}

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

Применение

Теперь самое простое и эффективное решение — это использование фильтра woocommerce_email_order_meta_keys, который автоматически вставит мета-поля в email.

add_filter('woocommerce_email_order_meta_keys', 'client_already_email_yes');

function client_already_email_yes( $keys ) {
     $keys[] = 'Client Already:YES'; 
     return $keys;
}

Этот код добавляет ваше пользовательское поле в список мета-данных, которые будут отправлены в email-уведомлении. Как правильно заметили, это решение просто и эффективно: оно интегрирует мета-данные в email без лишних сложностей с кастомизацией шаблонов или написанием дополнительных функций.

Однако следует учитывать важный нюанс: мета-поля с результатом в email будут отображаться в виде "Client Already:YES: 1". Это подход, который минимально воздействует на существующую структуру WooCommerce и предлагает простое текстовое добавление.

Подведение итогов

Таким образом, добавление пользовательских полей и их отображение в email-уведомлениях является стандартной процедурой в WooCommerce, но требует внимания к деталям реализации:

  1. Соответствие имен мета-полей.
  2. Использование правильных хуков для сохранения данных.
  3. Применение стандартных фильтров для вывода полей.

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

Оцените материал
Добавить комментарий

Капча загружается...