Я пытаюсь получить дату, когда заказ был помечен как Статус: «Отменен».
Мой текущий подход предполагает получение всех примечаний к заказу с помощью 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.
Вы можете использовать специальный хук 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