WooCommerce — мощное решение для интернет-магазинов на WordPress, но чтобы полностью раскрыть потенциал управления заказами, часто требуется автоматизация рутинных операций. В этой статье мы подробно разберём, как с помощью хуков (actions) и фильтров (filters) можно изменить поведение заказов, автоматизировать их обработку и интегрировать дополнительные функции без изменения исходного кода плагина.
Что такое хуки и фильтры в WooCommerce и зачем они нужны
WooCommerce, как и WordPress, построен на системе хуков — точек в коде, куда можно «подцепить» свои функции. Хуки бывают двух типов: actions — действия, которые выполняют код в определённый момент, и filters — позволяют изменить данные перед выводом или сохранением.
Использование хуков позволяет расширять функционал без редактирования ядра WooCommerce, что гарантирует сохранность ваших изменений при обновлениях. Это особенно важно для автоматизации заказов, где могут быть специфические бизнес-процессы.
Например, можно автоматически менять статус заказа, отправлять уведомления или добавлять мета-данные при создании или обновлении заказа.
Автоматическое изменение статуса заказа при оплате — пример кода
Одной из частых задач является автоматическое обновление статуса заказа после подтверждения оплаты или других событий. Рассмотрим простой пример, который меняет статус заказа на «обработка» сразу после успешной оплаты.
add_action('wporders_woocommerce_payment_complete', 'wporders_update_order_status_to_processing');
function wporders_update_order_status_to_processing( $order_id ) {
if ( ! $order_id ) return;
$order = wc_get_order( $order_id );
if ( $order->get_status() === 'pending' ) {
$order->update_status( 'processing', 'Статус изменён автоматически после оплаты.' );
}
}Здесь мы используем action woocommerce_payment_complete, который срабатывает при завершении оплаты. Функция проверяет текущий статус и меняет его, если он «pending». Это простой и эффективный способ автоматизировать смену статуса.
Фильтрация данных заказов: добавление дополнительного поля в админке
Допустим, необходимо добавить пользовательское поле к заказам, например, внутренний комментарий менеджера, и вывести его в списке заказов. Это можно сделать с помощью фильтров и дополнительных хуков.
Сначала добавим поле в метабокс редактирования заказа:
add_action('wporders_woocommerce_admin_order_data_after_order_details', 'wporders_add_custom_order_field');
function wporders_add_custom_order_field( $order ) {
woocommerce_wp_text_input( array(
'id' => '_wporders_manager_note',
'label' => 'Комментарий менеджера',
'wrapper_class' => 'form-field-wide',
'value' => get_post_meta( $order->get_id(), '_wporders_manager_note', true )
) );
}
add_action('wporders_woocommerce_process_shop_order_meta', 'wporders_save_custom_order_field');
function wporders_save_custom_order_field( $order_id ) {
if ( isset( $_POST['_wporders_manager_note'] ) ) {
update_post_meta( $order_id, '_wporders_manager_note', sanitize_text_field( $_POST['_wporders_manager_note'] ) );
}
}Далее добавим колонку в список заказов в админке и выведем туда содержимое поля:
add_filter('manage_edit-shop_order_columns', 'wporders_add_manager_note_column');
function wporders_add_manager_note_column( $columns ) {
$new_columns = array();
foreach ( $columns as $key => $column ) {
$new_columns[$key] = $column;
if ( $key === 'order_status' ) {
$new_columns['wporders_manager_note'] = 'Комментарий менеджера';
}
}
return $new_columns;
}
add_action('manage_shop_order_posts_custom_column', 'wporders_manager_note_column_content');
function wporders_manager_note_column_content( $column ) {
global $post;
if ( $column === 'wporders_manager_note' ) {
$note = get_post_meta( $post->ID, '_wporders_manager_note', true );
echo esc_html( $note ? $note : '—' );
}
}Автоматическая отправка уведомлений при смене статуса заказа
Ещё одна полезная автоматизация — отправка кастомных уведомлений при изменении статуса заказа. WooCommerce уже отправляет стандартные письма, но иногда нужен дополнительный контроль или отправка сообщений в сторонние сервисы.
Рассмотрим пример, когда при переходе заказа в статус «завершён» отправляется дополнительное письмо менеджеру.
add_action('wporders_woocommerce_order_status_completed', 'wporders_notify_manager_on_completed');
function wporders_notify_manager_on_completed( $order_id ) {
$order = wc_get_order( $order_id );
$to = 'manager@example.com';
$subject = 'Заказ #' . $order_id . ' завершён';
$message = 'Заказ #' . $order_id . ' был успешно завершён. Проверьте детали в админке.';
wp_mail( $to, $subject, $message );
}Этот код использует action woocommerce_order_status_completed, который вызывается при смене статуса на «completed». Функция отправляет простое письмо стандартной функцией WordPress wp_mail. Можно доработать письмо, добавив HTML или данные заказа.
Лучшие плагины для расширения автоматизации заказов в WooCommerce
Для тех, кто предпочитает готовые решения, существуют плагины, значительно упрощающие автоматизацию:
- WooCommerce Order Status Manager — позволяет создавать новые статусы заказов и настраивать переходы между ними.
- AutomateWoo — мощный инструмент автоматизации маркетинга и обработки заказов с триггерами и условиями.
- WP All Import + WooCommerce Add-On — для массового импорта и обновления заказов с использованием CSV/XML.
Эти плагины можно использовать совместно с кастомными хуками для максимальной гибкости.
Практические советы по отладке и поддержке автоматизации заказов
При работе с хуками важно тестировать все изменения в тестовом окружении. Для отладки удобно использовать функцию error_log() или плагины типа Query Monitor, чтобы отслеживать вызовы хуков и ошибки.
Также рекомендую придерживаться единого префикса для функций и метаданных, например, wporders_, чтобы избежать конфликтов с другими плагинами.
Не забывайте создавать резервные копии сайта перед внесением изменений и документировать все кастомные доработки для будущих обновлений и команды поддержки.