@amorphine

Добраться до класса WC_Email_Cancelled_Order из functions.php, или как еще можно отправить письмо об отмене заказа?

Есть задача отправлять письма при отмене заказов со статусом Pending.
В коде Woocommerce разобраться довольно сложно, да и за изучения плагинов никто не платит. Тем не менее.
Было установлено, что сначала необходимо добавить action в существующий список возможных событий для отправки писем при смене статуса заказа. Это возможно через фильтр

function add_cancel_order_email_action($attrs) {
	$attrs[] = 'woocommerce_order_status_pending_to_cancelled';
	return $attrs;
}

add_filter('woocommerce_email_actions', 'add_cancel_order_email_action');


Добавление этого action в список генерирует хук 'woocommerce_order_status_pending_to_cancelled_notification', который можно с легкостью вставить в тело конструктора WC_Email_Cancelled_Order таким образом:

// Triggers for this email
add_action( 'woocommerce_order_status_pending_to_cancelled_notification', array( $this, 'trigger' ), 10, 2 );
add_action( 'woocommerce_order_status_processing_to_cancelled_notification', array( $this, 'trigger' ), 10, 2 );
add_action( 'woocommerce_order_status_on-hold_to_cancelled_notification', array( $this, 'trigger' ), 10, 2 );


Но править плагины - дурной тон и при обновлении все поломается.
Казалось бы, решение вопроса можно реализовать в functions.php:

add_action( 'woocommerce_order_status_pending_to_cancelled_notification', array( 'WC_Email_Cancelled_Order', 'trigger' ), 10, 2 );


Но, увы, этот класс не виден.
  • Вопрос задан
  • 275 просмотров
Решения вопроса 1
@amorphine Автор вопроса
/*------------------------------------*\
    CAT:Woocommerce hacks
\*------------------------------------*/

//Send email notification about cancelled order
//init new email action
function add_cancel_order_email_action($attrs) {
	$attrs[] = 'woocommerce_order_status_pending_to_cancelled';
	return $attrs;
}
add_filter('woocommerce_email_actions', 'add_cancel_order_email_action');

//trigger sending
function trigger_pending_to_cancelled_mail_send($order_id){
	$mailer = WC()->mailer();
	$mails = $mailer->get_emails();
	if ( ! empty( $mails ) ) {
		foreach ( $mails as $mail ) {
			if ( $mail->id == 'cancelled_order' ) {
				$mail->trigger( $order_id );
			}
		}
	}
}
add_action( 'woocommerce_order_status_pending_to_cancelled_notification', 'trigger_pending_to_cancelled_mail_send', 10, 2 );
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы