WooCommerce: получить дату отмены заказа

Я пытаюсь получить дату, когда заказ был помечен как Статус: «Отменен».

Мой текущий подход предполагает получение всех примечаний к заказу с помощью wc_get_order_notes().

Есть ли лучший способ получить эту информацию?

function get_cancellation_date_with_timezone($order_id) {
    $order = wc_get_order($order_id);

    if (!$order) {
        return false; // Order not found
    }

    // Retrieve all order notes
    $notes = wc_get_order_notes(array('order_id' => $order_id));

    foreach ($notes as $note) {
        // Check if the note indicates a status change to 'Cancelled'
        if (strpos($note->content, 'Order status changed from') !== false && strpos($note->content, 'to Cancelled') !== false) {
            // Get the date created and timezone
            $date_created = $note->date_created;
            $timezone = new DateTimeZone($date_created->getTimezone()->getName());

            // Create a DateTime object with timezone
            $date = new DateTime($date_created->date('Y-m-d H:i:s'), $timezone);

            // Format the date with timezone
            return $date;
        }
    }

    return false; // Cancellation note not found
}

$cancellation_date = get_cancellation_date_with_timezone($order_id = 1234);
echo $cancellation_date->format('Y-m-d\TH:i:sP');

🤔 А знаете ли вы, что...
PHP имеет множество фреймворков, упрощающих разработку веб-приложений, таких как Laravel и Symfony.


2
50
1

Ответ:

Решено

Вы можете использовать специальный хук woocommerce_order_status_cancelled, чтобы добавить дату отмены в качестве пользовательских метаданных WC_Order, когда заказ отменяется, например (совместимо с HPOS):

add_action( 'woocommerce_order_status_cancelled', 'add_order_cancellation_date', 10, 2 );
function add_order_cancellation_date( $order_id, $order ) {
    $created_date   = $order->get_date_created(); // Get date (WC_DateTime object)
    $date_timezone  = $created_date->getTimezone(); // Get time zone (DateTimeZone Object)
    $date_cancelled = new WC_DateTime(); // Get current date (WC_DateTime object)
    $date_cancelled->setTimezone($date_timezone); // Set time zone

    // Add cancelled date as custom metadata and save
    $order->update_meta_data('date_cancelled', $date_cancelled->format( DateTime::ATOM )); 
    $order->save();
}

Код находится в файле function.php вашей дочерней темы (или в плагине).

Затем вы можете получить дату отмены заказа из объекта WC_Order, используя:

$date_cancelled = $order->get_meta('date_cancelled');

Теперь для предыдущих отмененных заказов вы можете взять дату изменения заказа, которая отражает дату последнего редактирования заказа, используя метод get_date_modified(), например:

$date_cancelled = $order->get_date_modified(); // WC_DateTime object

Вы можете использовать следующую функцию добавления, которая будет обрабатывать все случаи, чтобы получить дату отмены заказа (возвратите false, если заказ не отменен):

function wc_get_order_cancelled_date( $order ) {
    if ( ! $order->has_status('cancelled') ) {
        return false;
    }

    if ( $date_cancelled = $order->get_meta('date_cancelled') ) {
        return $date_cancelled;
    } else {
        return $order->get_date_modified()->format( DateTime::ATOM );
    }
}

Код находится в файле function.php вашей дочерней темы (или в плагине).

Затем вы можете получить дату отмены заказа из объекта WC_Order, используя:

$date_cancelled = wc_get_order_cancelled_date( $order ); // Formatted date string or false