Я создал новый плагин платежного шлюза, который позволяет клиентам платить позже. Я буду использовать его с POS-системой woocommerce.
Я не могу получить электронное письмо «счет-фактура клиента» для автоматической отправки - я полагаю, что это как-то связано с «ожидающим» статусом заказа (который он должен иметь, чтобы клиент мог оплатить позже). Я проанализировал много других ответов, но ни один из них не сработал для меня.
Я аккуратно изменил код по этой ссылке (только - изменил имена и настроил как плагин): https://github.com/creativelittledots/woocommerce-pay-later.
Он использует ряд функций для запуска электронной почты, которые я не совсем понимаю, но, похоже, они не работают: статус по умолчанию установлен на «на удержании», чтобы разрешить запуск электронных писем, тогда порядок установлен на «ожидание», чтобы позволить клиенту оплатить заказ.
Вот соответствующие фрагменты:
add_filter( 'woocommerce_default_order_status', array($this, 'default_order_status') );
add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
add_filter( 'woocommerce_email_format_string_find', array($this, 'order_status_format_string_find') );
add_filter( 'woocommerce_email_format_string_replace', array($this, 'order_status_format_string_replace'), 10, 2 );
add_action( 'woocommerce_order_status_pending', array($this, 'send_pending_order_emails') );
add_filter( 'woocommerce_valid_order_statuses_for_payment', array($this, 'valid_order_statuses_for_payment' ), 10, 2 );
add_action( 'wp', array($this, 'change_order_to_pending_on_order_received'), 8 );`
public function valid_order_statuses_for_payment($statuses, $order) {
if( $order->is_pay_later ) {
$statuses[] = 'on-hold';
}
return $statuses;
}
/**
* Change the default order status to on-hold so that pending order emails can be triggered
*/
public function default_order_status($default) {
if( ! is_admin() && WC()->session->set( 'chosen_payment_method') == $this->id ) {
$default = 'on-hold';
}
return $default;
}
/**
* Allow Order status to be accessible from emails
*/
public function order_status_format_string_find( $find ) {
$find['order-status'] = '{order_status}';
return $find;
}
/**
* Replace Order status in emails
*/
public function order_status_format_string_replace( $replace, $email ) {
if( $email->object ) {
$replace['order-status'] = wc_get_order_status_name( $email->object->get_status() );
}
return $replace;
}
/**
* Trigger pending order emails and invoice email
*/
public function send_pending_order_emails( $order_id ) {
$emails = new WC_Emails();
$order = wc_get_order( $order_id );
$emails->customer_invoice( $order_id );
$emails->emails['WC_Email_New_Order']->trigger( $order_id );
$order->set_payment_method( $this );
}
/**
* WC Shop As Customer support on Order Received, because the default status is on hold we need to change these orders to pending
*/
public function change_order_to_pending_on_order_received() {
if( class_exists('WC_Shop_As_Customer') && ! empty( $_GET['order_on_behalf'] ) && ! empty( $_GET['key'] ) && ! empty( $_GET['send_invoice'] ) ) {
global $wp;
if ( ! isset( $wp->query_vars['order-received'] ) )
return;
// Bail if we're not shopping-as - don't display the special interface.
if ( ! WC_Shop_As_Customer::get_original_user() )
return;
$order_id = $wp->query_vars['order-received'];
if ( ! empty( $order_id ) ) {
$order = new WC_Order( absint( $order_id) );
$order->update_status( 'pending' );
}
unset( $_GET['send_invoice'] );
}
}
Я также читал, что woocommerce_order_status_pending может не запускать электронные письма, поэтому я попытался добавить этот код (безуспешно):
add_filter( 'woocommerce_email_actions', 'filter_woocommerce_email_actions' );
function filter_woocommerce_email_actions( $actions ){
$actions[] = 'woocommerce_order_status_pending';
return $actions;
}
Я подозреваю либо:
- Код для перевода ордера в состояние ожидания, а затем срабатывания, а затем обратно в состояние ожидания, настроен неправильно.
- Хук woocommerce_order_status_pending не вызывает электронные письма
У меня есть небольшая работа, чтобы вызвать хук «woocommerce_thankyou» в functions.php, но я считаю, что это должно быть сделано в шлюзе (плюс я не хочу полагаться на woocommerce_thankyou — это электронное письмо должно быть основано на создании заказа) .
Заранее спасибо!!!!!!
woocommerce_order_status_changed
< /a>, где вы можете настроить таргетинг на исходный статус и/или измененный статус... Затем с помощьюWC()->mailer()->get_emails()
вы можете настроить таргетинг на уведомление по электронной почте, которое вы хотите отправить, например, в этот пример … Вы даже можете настроить таргетинг на свой конкретный платежный шлюз - person LoicTheAztec   schedule 15.01.2018