Как отправлять электронные письма со счетами клиентов с помощью шлюза «Оплата позже» (статус ожидания)

Я создал новый плагин платежного шлюза, который позволяет клиентам платить позже. Я буду использовать его с 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;
}

Я подозреваю либо:

  1. Код для перевода ордера в состояние ожидания, а затем срабатывания, а затем обратно в состояние ожидания, настроен неправильно.
  2. Хук woocommerce_order_status_pending не вызывает электронные письма

У меня есть небольшая работа, чтобы вызвать хук «woocommerce_thankyou» в functions.php, но я считаю, что это должно быть сделано в шлюзе (плюс я не хочу полагаться на woocommerce_thankyou — это электронное письмо должно быть основано на создании заказа) .

Заранее спасибо!!!!!!


person Jeffrey Fong    schedule 13.01.2018    source источник
comment
Вы можете инициировать уведомление по электронной почте при любом изменении статуса заказа в Woocommerce, программно ориентируясь на определенный платежный шлюз…   -  person LoicTheAztec    schedule 14.01.2018
comment
@LoicTheAztec, можешь объяснить, как я это делаю?   -  person Jeffrey Fong    schedule 15.01.2018
comment
Спасибо за ваш ответ - безуспешно. Order_status_changed не инициировал электронное письмо. Жду, пока разработчик плагина увидит, есть ли пользовательский хук, который я могу использовать.   -  person Jeffrey Fong    schedule 23.01.2018