Запланированное событие, основанное на проблеме изменения статуса заказа WooCommerce.Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Запланированное событие, основанное на проблеме изменения статуса заказа WooCommerce.

Сообщение Anonymous »

Я пытаюсь заставить эту функцию работать стабильно, но столкнулся с проблемами. У меня есть сайт WooCommerce, который позволяет пользователям заказывать товары без немедленной оплаты. Вместо этого у них есть 8 часов, чтобы заплатить наличными любому партнеру в магазине, который затем отметит заказ как выполненный (изменяя статус заказа с «Приостановлено» на «Выполнено»). Если они не произведут оплату в течение 8 часов, их заказ должен быть автоматически отменен (изменение статуса заказа с «ожидается» на «отменен»).
Проблема в том, что эта функция работает с перебоями. Я добавил эту функцию с помощью плагина Code Snippets. Кроме того, я использую Memcached и Redis, размещенные в облачных хранилищах; о которых я упоминаю на случай, если они вызывают проблему. Я новичок в этом деле.

Код: Выделить всё

// Hook into WooCommerce order status change to on-hold
add_action('woocommerce_order_status_on-hold', 'schedule_cancel_on_hold_order_event');

function schedule_cancel_on_hold_order_event($order_id) {
// Schedule the event to run 2 minutes later (for testing purposes)
if ( ! wp_next_scheduled( 'cancel_on_hold_order_event', array( 'order_id' => $order_id ) ) ) {
wp_schedule_single_event(time() + 2 * MINUTE_IN_SECONDS, 'cancel_on_hold_order_event', array('order_id' => $order_id));
error_log("Scheduled cancel_on_hold_order_event for order ID: $order_id");
}
}

// Hook into our custom event
add_action('cancel_on_hold_order_event', 'cancel_on_hold_order');

function cancel_on_hold_order($order_id) {
// Get the order
$order = wc_get_order($order_id);

// Check if the order is still on-hold
if ($order && $order->get_status() == 'on-hold') {
// Cancel the order
$order->update_status('cancelled', __('Order cancelled automatically after 2 minutes on-hold', 'your-text-domain'));
error_log("Order ID $order_id cancelled automatically.");
} else {
error_log("Order ID $order_id was not on-hold or does not exist.");
}
}

// Clear scheduled event on order status change to something other than on-hold
add_action('woocommerce_order_status_changed', 'clear_cancel_on_hold_order_event', 10, 4);

function clear_cancel_on_hold_order_event($order_id, $old_status, $new_status, $order) {
if ($old_status === 'on-hold' && $new_status !== 'on-hold') {
wp_clear_scheduled_hook('cancel_on_hold_order_event', array('order_id' => $order_id));
error_log("Cleared scheduled event for order ID: $order_id");
}
}

Я перенес CRON на сервер, отключив WordPress CRON и добавив серверную часть CRON

Код: Выделить всё

define('DISABLE_WP_CRON', true);

Код: Выделить всё

*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Я ожидаю, что все заказы, статус которых не изменен на выполненный, будут автоматически отменены через 2 минуты (в целях тестирования). Иногда заказы отменяются, как и ожидалось, иногда нет.

Подробнее здесь: https://stackoverflow.com/questions/786 ... ange-issue
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»