Вопрос или проблема
У меня есть конкретное требование обновить дату заметки заказа WooCommerce, пожалуйста, посмотрите на изображение ниже, чтобы увидеть, что я хотел бы изменить.
Проблема, с которой я сталкиваюсь, заключается в том, что приведённый ниже код вызывает сбой на моем сервере, вызывая внутреннюю ошибку на локальной тестовой среде. Заметка сохраняется, но дата неверная. WooCommerce сохраняет заметки о заказах как комментарии, и дата фактически находится в таблице базы данных комментариев. Я не могу заставить нижеуказанный код работать, я надеюсь, что профессионал сможет указать, где я ошибаюсь, и как я могу получить функциональный код для реализации в плагине.
Заранее спасибо, я уже от отчаяния рву на себе волосы и нуждаюсь в руководстве.
add_action( 'woocommerce_process_shop_order_meta', 'woocommerce_process_shop_order', 10, 2 );
function woocommerce_process_shop_order ( $order_id ) {
//Получите этот идентификатор заказа динамически
$order = wc_get_order( $order_id );
// Текст для заметки
$note = __("Пользовательская заметка о заказе здесь");
$note_date = date('d.m.Y',strtotime("-1 days"));
// Добавьте заметку
$order->add_order_note( $note );
$order->wp_insert_comment($note_date);
// Сохраните данные
$order->save();
}
С помощью метода add_order_note вы можете добавить заметку о заказе к вашему заказу. Если заглянуть в код этого метода, вы увидите, что этот метод является лишь оберткой вокруг функции wp_insert_comment из WordPress.
Поэтому ваша проблема в том, что вы хотите изменить дату заметки о заказе. Но это невозможно с помощью метода add_order_note. Если вы вернётесь к коду этого метода, вы увидите, что у этого метода есть только аргументы “$note”, “$is_customer_note” и “$added_by_user”. Так что даты нет.
Самый простой способ был бы сохранить заметку о заказе не с помощью “add_order_note”, а с помощью функции “wp_insert_comment”.
$test_date="2005-08-05 10:41:13";
$note = __("Пользовательская заметка о заказе здесь");
$user = get_user_by( 'id', get_current_user_id() );
$data = array(
'comment_post_ID' => $order_id,
'comment_author' => $user->display_name,
'comment_author_email' => $user->user_email,
'comment_author_url' => '',
'comment_content' => $note,
'comment_agent' => 'WooCommerce',
'comment_type' => 'order_note',
'comment_parent' => 0,
'comment_approved' => 1,
'comment_date' => $test_date,
);
wp_insert_comment($data);
Ответ или решение
Чтобы обновить дату заметок заказа в WooCommerce, необходимо понимать, что метод add_order_note
, предоставляемый классом WC_Order
, не позволяет установить индивидуальную дату для заметки. Этот метод просто оборачивает функцию wp_insert_comment
, которая фактически сохраняет заметки как комментарии в базе данных. Поэтому, чтобы реализовать вашу задачу, нужно использовать функцию wp_insert_comment
напрямую, учитывая необходиимые параметры.
Вот шаги, которые вам следует предпринять, чтобы добавить заметку с определенной датой:
- Используйте хук, чтобы выполнить свой код в нужный момент. В вашем случае это может быть
woocommerce_process_shop_order_meta
. - Получите ID заказа, который будет использоваться для добавления заметки.
- Создайте массив данных для комментария, включая нужную дату и информацию о пользователе, который добавляет заметку.
- Вызовите функцию
wp_insert_comment
, передав массив данных.
Пример кода
add_action('woocommerce_process_shop_order_meta', 'woocommerce_process_shop_order_with_custom_note_date', 10, 2);
function woocommerce_process_shop_order_with_custom_note_date($order_id) {
// Получаем объект заказа
$order = wc_get_order($order_id);
// Текст заметки
$note = __("Custom Order Note Here");
// Установим желаемую дату для заметки
$custom_date = "2005-08-05 10:41:13"; // Замените на нужную вам дату в формате Y-m-d H:i:s
// Получаем информацию о текущем пользователе
$user = get_user_by('id', get_current_user_id());
// Данные для вставки в комментарий
$data = array(
'comment_post_ID' => $order_id,
'comment_author' => $user->display_name,
'comment_author_email' => $user->user_email,
'comment_author_url' => '',
'comment_content' => $note,
'comment_agent' => 'WooCommerce',
'comment_type' => 'order_note',
'comment_parent' => 0,
'comment_approved' => 1,
'comment_date' => $custom_date,
'comment_date_gmt' => get_gmt_from_date($custom_date),
);
// Вставка комментария
wp_insert_comment($data);
}
Пояснение
$custom_date
: Замените значение на желаемую дату в форматеY-m-d H:i:s
. В приведённом примере установлена дата "2005-08-05 10:41:13".get_gmt_from_date($custom_date)
: Эта функция используется для преобразования локальной даты в формат GMT, который также потребуется для корректного сохранения в базе данных.- Убедитесь, что хук вызывается в нужный момент и не создает циклические вызовы, которые могут привести к сбоям сервера.
Заключение
Использование wp_insert_comment
позволяет вам контролировать такие параметры, как дата заметки, что именно вы и хотите реализовать. Следуя вышеуказанным шагам, вы сможете успешно добавлять заметки к заказам в WooCommerce с индивидуально установленной датой. Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться за консультацией.