Как я могу отправить письмо один раз?


Я работаю над плагином marketplace. Если поставщики не примут заказ в пределах установленного мной диапазона дат, заказ будет отменен. Для этого я определил период времени с датой заказа +3 дня. Пока все идет хорошо.

Например,
крайний срок ($last_time): 1623593126
Сегодня: $сейчас// (unix сегодня)
Код заказа: $порядковый номер

В соответствии с описанным выше сценарием я отправляю электронное письмо на адрес электронной почты с помощью wp_mail, чтобы заказ был не принято. Проблема начинается здесь. Почта Wordpress работает не так, как я хочу. Если сценарий реализован, то есть если поставщик не принимает заказ, отправляется электронное письмо. Однако каждый раз, когда страница обновляется, это письмо приходит снова и снова. Как я могу предотвратить это? Поэтому почта должна приходить только один раз. Я был бы рад, если бы вы помогли. Я искал около 3 дней, но не смог найти решение. Мой код приведен ниже:

foreach ( $user_orders as $order ) {

//...codes...

if($now>$last_time) {
    $order_number = $order->get_order_number(); 
    $to = '[email protected]';
    $subject = 'Failed order ';
    $body = '#'.$order_number. ' order number failed;
    $headers = array('Content-Type: text/html; charset=UTF-8');
    wp_mail( $to, $subject, $body, $headers );

}

//...codes...
Author: ddisdevelpgelis, 2021-06-08

1 answers

Вы можете использовать meta для создания одноразового действия

Что-то вроде этого

$order_id = $order->get_id();

if (get_post_meta($order_id, 'is_mail_sent', true)) return;

update_post_meta($order_id, 'is_mail_sent', true);

Добавьте это сразу после открытия блока if

Этот код сначала проверит, является ли мета-значение порядка is_mail_sent истинным, если оно истинно, оно вернется (выйдет) из функции.

Если это было неверно, в первый раз, то это будет продолжаться до остальной части кода, а также установите is_mail_sent в значение true, чтобы предотвратить отправку почты в будущем

Вы также можете сделать это

$order_id = $order->get_id();

if($now>$last_time && !get_post_meta($order_id, 'is_mail_sent', true)) {
    update_post_meta($order_id, 'is_mail_sent', true);

    $order_number = $order->get_order_number(); 
    $to = '[email protected]';
    $subject = 'Failed order ';
    $body = '#'.$order_number. ' order number failed;
    $headers = array('Content-Type: text/html; charset=UTF-8');
    wp_mail( $to, $subject, $body, $headers );
}

Это будет выполнять та же проверка, но только обернет почтовую часть кода

  0
Author: Buttered_Toast, 2021-06-08 14:42:55