В плагине интернет-магазина Woocommerce есть система отправки писем. Письма отправляются администратору и клиенту при различных ситуациях:
Наименование письма | Суть письма | Шаблоны WC |
Заказ в обработке | Клиент сделал заказ на сайте. По-умолчанию письмо уходит и клиенту и администратору | customer-on-hold-order.php, admin-new-order.php |
Шаблоны писем бывают 2-х типов: html (основной, по умолчанию) и текстовый (plain), он выбирается в настройках письма.
Редактируем шаблоны писем
Убрать блок Адрес оплаты. Необходимо вручную закомментировать billing_address в шаблоне email-addresses.php
<td style="width: 20px;">
<?php echo '<a class="minus" onClick="updateQty(\''.$cart_item_key.'\','.($cart_item['quantity']-1).')">–</a>'; ?>
</td>
<td class="product-quantity">
<?php echo apply_filters( 'woocommerce_checkout_cart_item_quantity', ' <strong class="product-quantity">' . sprintf( '× %s', $cart_item['quantity'] ) . '</strong>', $cart_item, $cart_item_key ); ?>
</td>
<td style="width: 20px;">
<a rel="nofollow" href="/?wc-ajax=add_to_cart&add-to-cart=<?php echo $cart_item['product_id'];?>" data-quantity="1" data-product_id="<?php echo $cart_item['product_id'];?>" data-product_sku="" class="product_type_simple add_to_cart_button ajax_add_to_cart plus">+</a>
</td>
Отправка письма при статусе В ожидании оплаты
Стандартно woocommerce не отправляет уведомления при статусе заказа В ОЖИДАНИИ ОПЛАТЫ. Данный статус создается в момент создания заказа с формой оплаты электронными средствами, и сохраняется до момента получения средств и превращения в В ОБРАБОТКЕ, либо отменяется при непоступлении средств в течение некоторого времени (ОТМЕНЕН).
Задача: отправлять письмо администратору при появлении заказа со статусом В ОЖИДАНИИ ОПЛАТЫ.
Платный плагин Woocommerce Follow UP Emails решает данную задачу. Принцип работы — создание пользовательских шаблонов уведомлений. Настройка отправки уведомления:
1. Создаем шаблон пользовательского письма. Выбираем тип письма:
- Storewide Email (Уведомления ассортимента)
- Signup Email (Уведомления регистрации)
- Manual Email (Ручные уведомления)
- Customer Email (Клиентские уведомления)
- Twitter Message
2. После выбора типа письма снизу загрузятся настройки для этого типа. В списке Trigger необходимо выбрать событие после которого должно отправляться письмо. В полях Sending Delay настраиваем время задержки отправки письма (по-умолчанию 1 минута).
Варианты событий для группы Клиентские уведомления
after last purchase (после последней покупки)
after order total is above (после завершения заказа № ____ (прописать № заказа))
after order total is below (после того, как сумма заказа ниже ____)
after customer purchased more than one time (после покупки клиента более одного раза)
after total orders by customer (после суммы одного заказа ____)
after total purchase amount by customer (после общей суммы всех покупок клиентом ____)
3. Само тело письма заполняем как необходимо. Можно добавить переменные, список возможных переменных при данном типе уведомления выводиться в блоке Variables (справа). Типовой шаблон уведомления:
Новый заказ!
Ожидается оплата заказа №{order_number} от {order_datetime}
Форм оплаты: {order_pay_method}
Заказ состоит из следующих позиций:
{item_prices_categories}
Сумма заказа <strong>{order_subtotal}</strong>
Данные о покупателе:
{customer_first_name}
{customer_email}
{order_billing_phone}
{order_shipping_address}
4. Изменить статус уведомления на активный.
После этого, при наступлении события выбранного в шаге 2 будет отправлено письмо-уведомление. По-умолчанию письма отправляются на e-mail администратора сайта, если необходимо добавить дополнительные e-mail, это можно сделать во вкладке From/Reply-to (нижняя часть настроек уведомления).
Альтернативный способ (функцией)
Отправка стандартного письма о новом заказе
// Отправка письма админу о новом заказе при статусе «В ожидании оплаты»
add_action( 'woocommerce_checkout_order_processed', 'pending_new_order_notification', 20, 1 );
function pending_new_order_notification( $order_id ) {
// Get an instance of the WC_Order object
$order = wc_get_order( $order_id );
// Only for "pending" order status
if( ! $order->has_status( 'pending' ) ) return;
// Send "New Email" notification (to admin)
WC()->mailer()->get_emails()['WC_Email_New_Order']->trigger( $order_id );
}
Отправка специального письма о таком заказе
// New order notification only for "Pending" Order status
add_action( 'woocommerce_checkout_order_processed', 'pending_new_order_notification', 20, 1 );
function pending_new_order_notification( $order_id ) {
// Get an instance of the WC_Order object
$order = wc_get_order( $order_id );
// Only for "pending" order status
if( ! $order->has_status( 'pending' ) ) return;
// Get an instance of the WC_Email_New_Order object
$wc_email = WC()->mailer()->get_emails()['WC_Email_New_Order'];
## -- Customizing Heading, subject (and optionally add recipients) -- ##
// Change Subject
$wc_email->settings['subject'] = __('{site_title} - New customer Pending order ({order_number}) - {order_date}');
// Change Heading
$wc_email->settings['heading'] = __('New customer Pending Order');
// $wc_email->settings['recipient'] .= ',name@email.com'; // Add email recipients (coma separated)
// Send "New Email" notification (to admin)
$wc_email->trigger( $order_id );
}
Добавить в шаблоны писем миниатюру и SKU
// Edit order items table template defaults
function sww_add_wc_order_email_images( $table, $order ) {
ob_start();
$template = $plain_text ? 'emails/plain/email-order-items.php' : 'emails/email-order-items.php';
wc_get_template( $template, array(
'order' => $order,
'items' => $order->get_items(),
'show_download_links' => $show_download_links,
'show_sku' => $show_sku,
'show_purchase_note' => $show_purchase_note,
'show_image' => true,
'image_size' => $image_size
) );
return ob_get_clean();
}
add_filter( 'woocommerce_email_order_items_table', 'sww_add_wc_order_email_images', 10, 2 );
Также можно настроить необходимый размер миниатюры
'image_size' => array( 32, 32 )
Либо это можно сделать более аккуратно, добавлением новой колонки «Изображение», но для этого нужно редактировать шаблоны /emails/email-order-details.php и /emails/email-order-items.php
В /emails/email-order-items.php добавить колонку с выводом изображения, включив вывод изображения ($show_image = 1;), и если надо sku ($show_sku = 1;). Размер изображения можно указать так:
$product->get_image( array( 120, 120 ) );
Корректируем у нижней ячейки colspan.
В /emails/email-order-details.php добавляем еще одну ячейку <th> с подписью Изображение и корректируем в нижних строках у колонок colspan.
Изменение дизайна письма
Базовые изменения вносят в самой панели WC. Если нужно изменить более детально необходимо править локальную версию файла woocommerce/emails/email-styles.php
либо прописывать хук:
add_filter( 'woocommerce_email_styles', 'patricks_woocommerce_email_styles' );
function patricks_woocommerce_email_styles( $css ) {
$css .= "#template_header { background-color: #231f20; }";
return $css;
}
Добавить что-либо только в письмо администратору
add_action( 'woocommerce_email_after_order_table', 'wc_add_payment_type_to_admin_emails', 15, 2 );
function wc_add_payment_type_to_admin_emails( $order, $is_admin_email ) {
if ( $is_admin_email ) {
echo '<p><strong>Способ оплаты:</strong> ' . $order->payment_method_title . '</p>';
}
}
Если нужно добавить в строке с товаров (под наименованием), например описание товара (только для администратора)
// Setting the "sent_to_admin" as a global variable
add_action('woocommerce_email_before_order_table', 'email_order_id_as_a_global', 1, 4);
function email_order_id_as_a_global($order, $sent_to_admin, $plain_text, $email){
$GLOBALS['email_data'] = array(
'sent_to_admin' => $sent_to_admin, // <== HERE we set "$sent_to_admin" value
'email_id' => $email->id, // The email ID (to target specific email notification)
);
}
// Conditionally customizing footer email text
add_action( 'woocommerce_order_item_meta_end', 'custom_email_order_item_meta_end', 10, 3 );
function custom_email_order_item_meta_end( $item_id, $item, $order ){
// Getting the custom 'email_data' global variable
$refNameGlobalsVar = $GLOBALS;
$email_data = $refNameGlobalsVar['email_data'];
// Only for admin email notifications
if( ! ( is_array( $email_data ) && $email_data['sent_to_admin'] ) ) return;
$description = get_post($item->get_product_id())->post_content;
echo '<br><br>'.$description;
}
Письмо администратору о новом пользователе
// Письмо администратору о новом пользователе
add_action( 'woocommerce_created_customer', 'woocommerce_created_customer_admin_notification' );
function woocommerce_created_customer_admin_notification( $customer_id ) {
wp_send_new_user_notifications( $customer_id, 'admin' );
}
Где переводится payment method для текста письма на удержании?
По идее все переводы WC хранятся в файлах woocommerce-ru_RU.mo и woocommerce-ru_RU.po, они находятся в папке wp-content/languages/plugins/ (если только переводы не локализованы в тему).