Я проделал огромный объем поиска, и хотя я нашел пользователей, которые задали вопрос о том, как добиться следующих результатов, нет примеров рабочих решений, насколько мне известно.
Вопрос касается очень популярного плагина WordPress «Woocommerce». Плагин поставляется с электронной почтой, чтобы облегчить жизнь владельцу сайта и клиенту. Одна из проблем заключается в том, что нет электронного письма, которое отправляется, когда администратор магазина изменяет статус заказа на «Возврат». Кто-то сказал, что это потому, что это ручной процесс. Это правда, что это процесс, который владелец магазина будет делать через счет продавца или учетную запись PayPal. Но как только это будет сделано, и владелец магазина затем войдет в свою панель администратора WordPress и изменит статус заказа на возврат, было бы полезно, чтобы электронное письмо было создано и отправлено клиенту.
Это то, что я видел.
Поэтому я решил изменить учебник по адресу http://www.skyverge.com/blog/how-to-add-a-custom-woocommerce-email/#comment-553147
Я пытаюсь отправить электронное письмо, когда статус заказа заказывается до «Возврат».
Вот код исходного файла плагина
<?php /** * Plugin Name: WooCommerce Custom Expedited Order Email * Plugin URI: http://www.skyverge.com/blog/how-to-add-a-custom-woocommerce-email/ * Description: Demo plugin for adding a custom WooCommerce email that sends admins an email when an order is received with expedited shipping * Author: SkyVerge * Author URI: http://www.skyverge.com * Version: 0.1 * * License: GNU General Public License v3.0 * License URI: http://www.gnu.org/licenses/gpl-3.0.html * */ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly /** * Add a custom email to the list of emails WooCommerce should load * * @since 0.1 * @param array $email_classes available email classes * @return array filtered available email classes */ function add_expedited_order_woocommerce_email( $email_classes ) { // include our custom email class require( 'includes/class-wc-expedited-order-email.php' ); // add the email class to the list of email classes that WooCommerce loads $email_classes['WC_Expedited_Order_Email'] = new WC_Expedited_Order_Email(); return $email_classes; } add_filter( 'woocommerce_email_classes', 'add_expedited_order_woocommerce_email' );
И вот ссылка на код моего класса
<?php if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly /** * A custom Expedited Order WooCommerce Email class * * @since 0.1 * @extends \WC_Email */ class WC_Expedited_Order_Email extends WC_Email { /** * Set email defaults * * @since 0.1 */ public function __construct() { // set ID, this simply needs to be a unique name $this->id = 'wc_expedited_order'; // this is the title in WooCommerce Email settings $this->title = 'Refunded Order Email'; // this is the description in WooCommerce email settings $this->description = 'Refunded Emails are sent when an order status has been changed to Refunded'; // these are the default heading and subject lines that can be overridden using the settings $this->heading = 'Refunded Order'; $this->subject = 'Refunded Order'; // these define the locations of the templates that this email should use, we'll just use the new order template since this email is similar $this->template_html = 'emails/admin-new-order.php'; $this->template_plain = 'emails/plain/admin-new-order.php'; // Trigger on new paid orders add_action( 'woocommerce_order_status_pending_to_processing_notification', array( $this, 'trigger' ) ); add_action( 'woocommerce_order_status_failed_to_processing_notification', array( $this, 'trigger' ) ); // Call parent constructor to load any other defaults not explicity defined here parent::__construct(); // this sets the recipient to the settings defined below in init_form_fields() $this->recipient = $this->get_option( 'recipient' ); // if none was entered, just use the WP admin email as a fallback if ( ! $this->recipient ) $this->recipient = get_option( 'admin_email' ); } /** * Determine if the email should actually be sent and setup email merge variables * * @since 0.1 * @param int $order_id */ public function trigger( $order_id ) { // bail if no order ID is present if ( ! $order_id ) return; $order = new WC_Order( $order_id ); //bail if not a refunded order if ( 'refunded' !== $order->status ) { return; } // setup order object $this->object = new WC_Order( $order_id ); // bail if shipping method is not expedited //if ( ! in_array( $this->object->get_shipping_method(), array( 'Three Day Shipping', 'Next Day Shipping' ) ) ) //return; // replace variables in the subject/headings $this->find[] = '{order_date}'; $this->replace[] = date_i18n( woocommerce_date_format(), strtotime( $this->object->order_date ) ); $this->find[] = '{order_number}'; $this->replace[] = $this->object->get_order_number(); if ( ! $this->is_enabled() || ! $this->get_recipient() ) return; // woohoo, send the email! $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() ); } /** * get_content_html function. * * @since 0.1 * @return string */ public function get_content_html() { ob_start(); woocommerce_get_template( $this->template_html, array( 'order' => $this->object, 'email_heading' => $this->get_heading() ) ); return ob_get_clean(); } /** * get_content_plain function. * * @since 0.1 * @return string */ public function get_content_plain() { ob_start(); woocommerce_get_template( $this->template_plain, array( 'order' => $this->object, 'email_heading' => $this->get_heading() ) ); return ob_get_clean(); } /** * Initialize Settings Form Fields * * @since 0.1 */ public function init_form_fields() { $this->form_fields = array( 'enabled' => array( 'title' => 'Enable/Disable', 'type' => 'checkbox', 'label' => 'Enable this email notification', 'default' => 'yes' ), 'recipient' => array( 'title' => 'Recipient(s)', 'type' => 'text', 'description' => sprintf( 'Enter recipients (comma separated) for this email. Defaults to <code>%s</code>.', esc_attr( get_option( 'admin_email' ) ) ), 'placeholder' => '', 'default' => '' ), 'subject' => array( 'title' => 'Subject', 'type' => 'text', 'description' => sprintf( 'This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', $this->subject ), 'placeholder' => '', 'default' => '' ), 'heading' => array( 'title' => 'Email Heading', 'type' => 'text', 'description' => sprintf( __( 'This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.' ), $this->heading ), 'placeholder' => '', 'default' => '' ), 'email_type' => array( 'title' => 'Email type', 'type' => 'select', 'description' => 'Choose which format of email to send.', 'default' => 'html', 'class' => 'email_type', 'options' => array( 'plain' => 'Plain text', 'html' => 'HTML', 'woocommerce', 'multipart' => 'Multipart', 'woocommerce', ) ) ); } } // end \WC_Expedited_Order_Email class
Это только 2 файла в моем плагине. Я активировал его, и он отображается как электронная почта в списке писем электронной почты на вкладке электронной почты woo. К сожалению, при обновлении статуса заказа не отправляется электронное письмо.
Может ли кто-нибудь сообщить, почему это не работает?
У меня была некоторая обратная связь от человека, который сказал следующее
«действия, которые вы добавляете в триггер, относятся к ожидающим / не удалось изменить статус заказа заказа – http://cld.wthms.co/cZzw. Вы хотите, чтобы это были действия, связанные с возвращенными заказами, например : add_action ('woocommerce_order_status_refunded', array ($ this, 'trigger')); (для точного просмотра классов электронной почты woocommerce) "
Я использую Woocommerce 2.1.12
Основная проблема заключается в том, что woocommerce_order_status_refunded
hook не зарегистрирован по умолчанию с send_transactional_email
вызовом send_transactional_email
, поэтому вы не можете использовать вышеуказанный метод для автоматической отправки писем, когда статус заказа изменен на Refunded .
Вы можете изменить это следующим образом:
/** * Register the "woocommerce_order_status_refunded" hook which is necessary to * allow automatic email notifications when the order is changed to refunded. * * @see http://stackoverflow.com/a/26413223/2078474 */ add_action( 'woocommerce_init', function() { add_action( 'woocommerce_order_status_refunded', array( WC(), 'send_transactional_email' ), 10, 10 ); });
Также убедитесь, что вы включили его в соответствующем разделе на вкладке Woo Settings -> Emails :
По умолчанию для автоматического уведомления по электронной почте регистрируются следующие действия:
woocommerce_low_stock woocommerce_no_stock woocommerce_product_on_backorder woocommerce_order_status_pending_to_processing woocommerce_order_status_pending_to_completed woocommerce_order_status_pending_to_on-hold woocommerce_order_status_failed_to_processing woocommerce_order_status_failed_to_completed woocommerce_order_status_completed woocommerce_new_customer_note woocommerce_created_customer
Хорошие новости, @helgatheviking только что получил запрос WooCommerce pull, объединенный (см. Комментарии ниже).
Это означает, что мы должны иметь возможность использовать новый фильтр woocommerce_email_actions
:
add_filter( 'woocommerce_email_actions', function( $email_actions ) { $email_actions[] = 'woocommerce_order_status_refunded'; return $email_actions; });
в WooCommerce 2.3+.
Подобный должен работать для других действий по умолчанию, отличных от по умолчанию, таких как woocommerce_order_status_cancelled
.
Я думаю, проблема в том, что вы звоните
add_action( 'woocommerce_order_status_pending_to_processing_notification', array( $this, 'trigger' ) );
Попробуйте позвонить:
add_action( 'woocommerce_order_status_refunded', array( $this, 'trigger' ) );