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