데브포일 홈
WordPress 자동화
Guest
STAGE 14 · Lv.66

주문 상태 변경 자동 알림

WooCommerce의 woocommerce_order_status_changed 훅을 활용하여 주문 상태 변경 시 커스텀 이메일 알림, Telegram/Slack 알림, SMS 연동까지 자동화합니다.

WooCommerce 주문 상태 시스템 완전 이해
주문 상태의 종류와 전체 흐름
WooCommerce에서 주문(Order)은 생성부터 완료까지 여러 상태를 거칩니다. 각 상태 전환 시점에 WordPress 액션 훅이 발동하며, 이 훅을 활용하면 자동 알림, 재고 관리, 외부 시스템 연동, CRM 데이터 동기화 등 다양한 자동화를 구현할 수 있습니다.

WooCommerce의 기본 주문 상태는 7가지입니다. pending(결제 대기)는 주문은 생성되었지만 결제가 아직 완료되지 않은 상태입니다. processing(처리 중)은 결제가 완료되어 주문 처리를 시작할 수 있는 상태입니다. on-hold(보류)는 결제 확인이 필요한 상태로, 무통장입금이나 가상계좌 결제 시 자주 사용됩니다. completed(완료)는 주문 처리와 배송이 완료된 상태입니다. cancelled(취소)는 주문이 취소된 상태이며, refunded(환불)는 결제 금액이 환불된 상태입니다. failed(실패)는 결제가 실패한 상태입니다.

가장 일반적인 흐름은 pending -> processing -> completed입니다. 하지만 실무에서는 중간에 on-hold로 전환되거나, cancelled/refunded로 분기하는 등 다양한 시나리오가 발생합니다. 디지털 상품의 경우 pending에서 바로 completed로 전환되기도 합니다. 이 모든 전환을 정확히 감지하고 적절한 알림을 보내는 것이 이 레슨의 핵심입니다.
🕐
pending
결제 대기
processing
처리 중
📦
shipped
배송 중 (커스텀)
completed
완료
📋
7가지
WooCommerce 기본 주문 상태
🔔
실시간
상태 변경 즉시 감지
📧
다채널
이메일 + 메신저 + SMS
완전 자동화
무인 운영 가능
주문 상태별 기본 동작과 훅 체계
WooCommerce는 주문 상태가 변경될 때마다 여러 층위의 액션 훅을 발동합니다. 이 훅들을 이해하면 정확한 시점에 원하는 동작을 실행할 수 있습니다.

범용 훅(모든 상태 변경): woocommerce_order_status_changed - 어떤 상태에서 어떤 상태로든 변경될 때 발동합니다. 이전 상태, 새 상태, 주문 객체를 파라미터로 받습니다.

특정 상태 전환 훅: woocommerce_order_status_{from}_to_{to} 형식으로, 예를 들어 woocommerce_order_status_pending_to_processing은 결제 대기에서 처리 중으로 변경될 때만 발동합니다.

새 상태 도달 훅: woocommerce_order_status_{status} 형식으로, 예를 들어 woocommerce_order_status_completed는 어떤 상태에서든 완료 상태로 전환될 때 발동합니다.

새 주문 훅: woocommerce_new_order는 주문이 최초 생성될 때 발동합니다. woocommerce_checkout_order_processed는 체크아웃 완료 시 발동합니다.

이 훅들의 발동 순서를 정확히 이해하는 것이 중요합니다. 동일한 상태 변경에 대해 여러 훅이 순차적으로 발동하므로, 중복 알림이 발생하지 않도록 하나의 훅만 선택하여 사용해야 합니다.
훅 이름 발동 시점 파라미터 주요 용도
woocommerce_order_status_changed 모든 상태 변경 시 $order_id, $old_status, $new_status, $order 통합 로깅, 다채널 알림
woocommerce_order_status_pending_to_processing 결제 완료 시 $order_id, $order 결제 완료 알림, 재고 차감
woocommerce_order_status_completed 주문 완료 시 $order_id, $order 배송 완료 알림, 리뷰 요청
woocommerce_order_status_cancelled 주문 취소 시 $order_id, $order 취소 알림, 재고 복원
woocommerce_order_status_refunded 환불 처리 시 $order_id, $order 환불 확인 알림
woocommerce_new_order 주문 최초 생성 시 $order_id, $order 관리자 즉시 알림
woocommerce_order_status_on-hold 보류 상태 전환 시 $order_id, $order 입금 안내 메시지 발송
커스텀 주문 상태 추가하기
비즈니스에 맞는 커스텀 상태 구현
WooCommerce의 기본 7가지 상태만으로는 복잡한 비즈니스 프로세스를 표현하기 어려울 수 있습니다. 예를 들어 "배송 중(shipped)", "검수 중(inspecting)", "교환 진행(exchanging)", "부분 배송(partially-shipped)" 등의 상태가 필요할 수 있습니다. WordPress의 register_post_status()와 WooCommerce의 wc_order_statuses 필터를 활용하면 원하는 만큼 커스텀 상태를 추가할 수 있습니다.

커스텀 상태를 추가하면 WooCommerce의 기존 훅 시스템이 자동으로 동작합니다. 예를 들어 "배송 중(wc-shipped)" 상태를 추가하면, woocommerce_order_status_shipped 훅과 woocommerce_order_status_processing_to_shipped 같은 전환 훅이 자동으로 사용 가능해집니다.
// 커스텀 주문 상태 등록: 배송중, 검수중, 교환진행 add_action('init', function() { // 배송중 상태 register_post_status('wc-shipped', [ 'label' => _x('배송중', 'Order status', 'my-plugin'), 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( '배송중 <span class="count">(%s)</span>', '배송중 <span class="count">(%s)</span>', 'my-plugin' ), ]); // 검수중 상태 register_post_status('wc-inspecting', [ 'label' => _x('검수중', 'Order status', 'my-plugin'), 'public' => true, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( '검수중 <span class="count">(%s)</span>', '검수중 <span class="count">(%s)</span>', 'my-plugin' ), ]); // 교환진행 상태 register_post_status('wc-exchanging', [ 'label' => _x('교환진행', 'Order status', 'my-plugin'), 'public' => true, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( '교환진행 <span class="count">(%s)</span>', '교환진행 <span class="count">(%s)</span>', 'my-plugin' ), ]); }); // WooCommerce 주문 상태 목록에 추가 add_filter('wc_order_statuses', function($statuses) { $new_statuses = []; foreach ($statuses as $key => $label) { $new_statuses[$key] = $label; // 처리중(processing) 다음에 배송중, 검수중 삽입 if ($key === 'wc-processing') { $new_statuses['wc-shipped'] = _x('배송중', 'Order status', 'my-plugin'); $new_statuses['wc-inspecting'] = _x('검수중', 'Order status', 'my-plugin'); } // 환불(refunded) 다음에 교환진행 삽입 if ($key === 'wc-refunded') { $new_statuses['wc-exchanging'] = _x('교환진행', 'Order status', 'my-plugin'); } } return $new_statuses; }); // 관리자 주문 목록에서 커스텀 상태 벌크 액션 추가 add_filter('bulk_actions-edit-shop_order', function($actions) { $actions['mark_shipped'] = __('상태 변경: 배송중', 'my-plugin'); $actions['mark_inspecting'] = __('상태 변경: 검수중', 'my-plugin'); return $actions; }); // 커스텀 상태별 색상 지정 (관리자 CSS) add_action('admin_head', function() { echo '<style> .order-status.status-shipped { background: #c8e6ff; color: #0055aa; } .order-status.status-inspecting { background: #fff3cd; color: #856404; } .order-status.status-exchanging { background: #f8d7da; color: #721c24; } </style>'; });
💡 커스텀 상태 설계 원칙
1. 상태는 최소한으로 유지하세요: 너무 많은 상태는 운영 복잡성을 높입니다. 실제로 구분이 필요한 것만 상태로 만들고, 부가 정보는 주문 메모(order note)로 기록하세요.
2. 상태 전환 규칙을 명확히 하세요: 어떤 상태에서 어떤 상태로 전환 가능한지 규칙을 정의하고, 허용되지 않는 전환은 코드로 차단하세요.
3. wc- 접두사를 반드시 사용하세요: WooCommerce는 주문 상태에 wc- 접두사를 사용합니다. register_post_status()에서는 wc-shipped로 등록하지만, 훅이나 API에서는 shipped(접두사 없이)로 참조합니다.
4. 이메일 알림을 연결하세요: 커스텀 상태 전환 시에도 고객에게 적절한 알림을 보내야 합니다. "배송중"으로 변경 시 운송장 번호와 함께 배송 추적 URL을 포함한 이메일을 자동 발송하는 것이 좋습니다.
🔒
여기까지는 미리보기입니다
주문 상태 변경 자동 알림
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)