WooCommerce Hook을 사용하여 사용자 정의 카트 기능과 고급 주문 관리를 구현하는 방법

3분 읽기
2026-03-17
2026-06-03
2,499
아래 링크를 통해 쇼핑하면 추가 비용 없이 수수료를 받을 수 있습니다.

WooCommerce Hook 시스템의 기초를 이해하기

WooCommerce는 WordPress를 기반으로 구축되었으며, WordPress의 강력한 플러그인 아키텍처를 그대로 계승하고 있습니다. WooCommerce의 핵심 확장 메커니즘은 바로 “후크(hook)”입니다. 후크를 사용하면 개발자가 WooCommerce의 실행 과정에서 특정 지점에 사용자 정의 코드를 추가할 수 있어, 핵심 파일을 수정하지 않고도 기능을 자유롭게 커스터마이징할 수 있습니다. 이러한 설계는 ‘개방-폐쇄 원칙(Open-Closed Principle)’을 따르며, WooCommerce 자체의 안정성을 유지하면서도 모든 개별화된 요구사항을 후크를 통해 충족시킬 수 있게 해줍니다.

WooCommerce는 주로 두 가지 유형의 훅을 제공합니다: 액션 훅(Action Hooks)과 필터 훅(Filter Hooks)입니다. 액션 훅은… do_action() 함수가 실행되면 “실행 지점”이 제공되어 개발자가 주문 생성 후 사용자 정의 이메일을 보내는 등의 기능을 추가할 수 있습니다. 이 함수는 어떠한 값을 반환하지 않으며, 단지 추가적인 작업을 수행하는 데만 사용됩니다. 필터 훅(filter hook)은… apply_filters() 함수가 실행되면, 개발자가 특정 변수의 값을 변경할 수 있는 “변경 지점”이 제공됩니다. 예를 들어, 상품 가격을 표시하기 전에 복잡한 할인 계산을 적용할 수 있습니다. 필터는 반드시 값을 반환해야 합니다.

이 두 가지 “후크’의 차이점을 이해하는 것이 그것들을 효과적으로 활용하는 데 핵심입니다. 간단히 말해, ”액션(Action)“은 ”무언가를 하는 것”을 의미하며, ‘필터(Filter)’는 “무언가를 변경하는 것”을 의미합니다. 개발자들은 이러한 차이를 바탕으로 적절 add_action() 그리고 add_filter() 이 함수는 자신의 콜백 함수를 해당 ‘후크(hook)’에 등록함으로써 WooCommerce의 표준 작업 흐름에 개입합니다.

추천 읽기 WooCommerce 고급 데이터 분석: 상품 속성 및 재고 관리 필드를 어떻게 사용자 정의할 수 있는가?

액션 훅을 사용하여 쇼핑카트 기능을 사용자 정의하기

쇼핑카트는 전자상거래 경험의 핵심 요소입니다. WooCommerce는 개발자들이 쇼핑카트 내에서 사용자가 수행하는 모든 작업을 모니터링하고 이에 반응할 수 있도록 다양한 액션 훅(Action Hooks)을 제공합니다.

UltaHost의 WordPress 호스팅 서비스
30일 환불 보장, 무제한 대역폭 및 데이터베이스 이용, 무료 DDoS 보호 서비스 제공. 3년 구매 시 50% 용량이 할인됩니다.

기본적이면서도 중요한 훅(hook)은 다음과 같습니다: woocommerce_add_to_cart상품이 쇼핑카트에 성공적으로 추가되면 이 훅(hook)이 실행됩니다. 개발자는 이를 활용하여 사용자의 행동을 추적하거나, 재고 경고를 업데이트하거나, 제3자 시스템과 데이터를 동기화할 수 있습니다. 예를 들어, 사용자가 자주 추가했다가 다시 제거하는 상품들을 기록하여 향후의 개인화된 추천 시스템 분석에 활용할 수 있습니다.

add_action('woocommerce_add_to_cart', 'track_product_addition', 10, 6);
function track_product_addition($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
    $user_id = get_current_user_id();
    if ($user_id) {
        $viewed_products = get_user_meta($user_id, '_tracked_cart_additions', true) ?: array();
        array_unshift($viewed_products, $product_id);
        $viewed_products = array_slice(array_unique($viewed_products), 0, 20); // 保留最近20条
        update_user_meta($user_id, '_tracked_cart_additions', $viewed_products);
    }
}

또 다른 중요한 핵심 요소는… woocommerce_before_calculate_totals이 함수는 쇼핑카트 페이지, 결제 페이지, 그리고 소계금 및 총액이 계산되는 모든 순간에 호출됩니다. 이는 상품 가격을 동적으로 변경하거나 전체적인 할인/수수료를 적용하기에 가장 적합한 시점입니다. 예를 들어, 쇼핑카트에 있는 상품의 총 수량에 따라 단계별 할인을 적용할 수 있습니다.

add_action('woocommerce_before_calculate_totals', 'apply_volume_discount', 20);
function apply_volume_discount($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    if (did_action('woocommerce_before_calculate_totals') >= 2) return;

$total_quantity = 0;
    foreach ($cart->get_cart() as $cart_item) {
        $total_quantity += $cart_item['quantity'];
    }

// 如果总数量超过10件,所有商品打9折
    if ($total_quantity > 10) {
        foreach ($cart->get_cart() as $cart_item) {
            $original_price = $cart_item['data']->get_price();
            $cart_item['data']->set_price($original_price * 0.9);
        }
    }
}

필터 후크를 사용하여 상품 및 주문 데이터를 처리합니다.

필터 후크(filter hook)는 개발자에게 데이터를 세밀하게 제어할 수 있는 기능을 제공합니다. 쇼핑카트 항목부터 최종 주문 화면에 이르기까지 모든 요소를 원하는 대로 커스터마이징할 수 있습니다.

woocommerce_add_cart_item_data 필터는 상품이 장바구니에 추가될 때 실행되며, 개발자가 장바구니 항목에 사용자 정의 데이터를 추가할 수 있도록 해줍니다. 이 데이터는 장바구니 항목과 함께 세션에 저장되어 주문 항목으로 전달됩니다. 이는 상품의 개성화(예: 문구 새김, 색상 맞춤 설정 등)를 구현하는 데 매우 중요합니다.

추천 읽기 0부터 1까지: 고성능 WooCommerce 전자상거래 웹사이트를 구축하는 완전한 기술 가이드입니다.

add_filter('woocommerce_add_cart_item_data', 'add_engraving_text_to_cart_item', 10, 3);
function add_engraving_text_to_cart_item($cart_item_data, $product_id, $variation_id) {
    if (!empty($_POST['engraving_text'])) {
        $cart_item_data['engraving'] = sanitize_text_field($_POST['engraving_text']);
        // 为具有不同雕刻文本的相同产品生成唯一ID
        $cart_item_data['unique_key'] = md5($product_id . serialize($cart_item_data));
    }
    return $cart_item_data;
}

쇼핑카트와 주문 정보에 이러한 사용자 정의 데이터를 표시해야 할 경우에는 다음과 같은 방법을 사용할 수 있습니다: woocommerce_get_item_data 필터입니다. 이 필터는 쇼핑카트에 저장된 사용자 정의 데이터를 프론트엔드에서 표시할 수 있는 배열 형태로 변환합니다.

주문 관리 백엔드에서는 정보를 명확하게 표시하기 위해 주문 항목의 메타데이터를 포맷할 필요가 있을 수 있습니다.woocommerce_order_item_get_formatted_meta_data 필터를 사용하면 어떤 메타데이터를 표시할지, 그리고 어떻게 표시할지를 제어할 수 있습니다. 예를 들어, “_”로 시작하는 기술적인 메타데이터는 숨기고, 판매자에게는 비즈니스와 관련된 맞춤형 정보만 표시할 수 있습니다.

add_filter('woocommerce_order_item_get_formatted_meta_data', 'format_order_item_meta_for_display', 10, 2);
function format_order_item_meta_for_display($formatted_meta, $item) {
    $display_meta = array();
    foreach ($formatted_meta as $meta_id => $meta) {
        // 不显示以下划线开头的“隐藏”元数据
        if (!empty($meta->key) && substr($meta->key, 0, 1) !== '_') {
            $display_meta[$meta_id] = $meta;
        }
    }
    return $display_meta;
}

고급 주문 관리 프로세스 생성

WooCommerce의 기본 주문 상태 흐름은 “검수 대기 중”, “배송 중”과 같은 일부 비즈니스 요구사항을 충족시키지 못할 수 있습니다. 훅(hook)을 사용하면 이러한 흐름을 확장할 수 있습니다.

호스팅닷컴 공유 호스팅
AMD EPYC CPU, NVMe SSD 스토리지 및 LiteSpeed를 통한 고성능, 연중무휴 24시간 전문가 사내 지원, SSL, 무차별 공격, 멀웨어 및 DDoS 보호를 포함한 고급 보안 조치, 최대 73%의 비용 절감.

먼저, 사용자 정의된 주문 상태를 등록해야 합니다. 이 작업은 보통… init 작업이 진행 중이며, 그 후에 완료될 예정입니다. wc_order_statuses 필터는 해당 항목을 상태 목록에 추가합니다.

add_action('init', 'register_custom_order_statuses');
function register_custom_order_statuses() {
    register_post_status('wc-quality-check', array(
        'label'                     => '质检中',
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               =&gt; _n_noop('质检中 <span class="count">\n(%s)</span>', '품질 검사 중입니다.' <span class="count">\n(%s)</span>')
    ));
}

add_filter('wc_order_statuses', 'add_custom_status_to_list');
function add_custom_status_to_list($order_statuses) {
    $order_statuses['wc-quality-check'] = '质检中';
    return $order_statuses;
}

다음으로, 상태 변화에 따른 동작을 정의해야 합니다.woocommerce_order_status_changed 액션 훅(Action Hook)은 주문 상태의 모든 변화를 감지할 수 있습니다. 이를 활용하여 주문이 “검수 중” 상태가 되었을 때 자동으로 검수 부서에 작업 알림을 보낼 수 있습니다.

add_action('woocommerce_order_status_changed', 'handle_custom_order_status_change', 10, 4);
function handle_custom_order_status_change($order_id, $old_status, $new_status, $order) {
    if ($new_status == 'quality-check') {
        // 获取订单信息
        $order_number = $order->get_order_number();
        $admin_email = get_option('admin_email');
        // 发送邮件通知(此处为示例,实际应用可能需要更复杂的逻辑)
        wp_mail($admin_email, '新订单待质检', "订单 #{$order_number} 已进入质检环节,请及时处理。");
    }
}

또한, 우리는 다음과 같은 방법들도 사용할 수 있습니다: woocommerce_admin_order_actions 필터 기능을 통해 백엔드 주문 목록 페이지에 “품질 검사 통과”와 같은 사용자 정의 상태에 대한 빠른 작업 버튼을 추가함으로써, 한 번의 클릭으로 상태를 다음 단계로 쉽게 전환할 수 있습니다. 이를 통해 관리 효율성이 크게 향상됩니다.

추천 읽기 WordPress 테마 개발 전략: 초보자부터 전문가까지의 핵심 기술과 실습 방법

요약

WooCommerce의 훅 시스템은 이를 최고의 전자상거래 솔루션으로 만드는 핵심 요소입니다. 이 시스템은 개발자들에게 강력한 확장 기능을 제공합니다. 액션 훅을 사용하여 쇼핑카트 이벤트를 감지하고 응답하는 것부터, 필터 훅을 활용하여 상품, 가격, 표시 데이터를 세밀하게 제어하는 것, 그리고 복잡한 비즈니스 로직에 맞는 맞춤형 주문 상태 흐름을 구축하는 것에 이르기까지, 훅은 일관된 표준화된 접근 방식을 제공합니다. 이러한 핵심 훅들의 사용 시나리오와 활용 방법을 숙지하면 개발자는 기본 기능의 한계를 넘어서서 고도로 맞춤화되고 자동화되며 효율적인 WooCommerce 상점을 만들 수 있으며, 소매부터 도매, 실물 상품부터 디지털 서비스에 이르기까지 다양한 전자상거래 시나리오에 완벽하게 적응할 수 있습니다.

자주 묻는 질문

저는 사용자 정의 훅 코드를 어디에 작성해야 할까요?

주제의 외관과 밀접하게 관련된 일회성 커스터마이징 사항은 서브테마(subtopic)에 기재할 수 있습니다. functions.php 파일 안에 있습니다. 이곳은 빠른 테스트나 간단한 수정을 위해 자주 사용되는 위치입니다.

InterServer 공유 호스팅
공유 호스팅 월 $2.50 USD, 첫 달 $0.1 USD 프로모션 코드 tryinterserver, 461개 클라우드 앱 스크립트, 원클릭 설치.

하지만 코드의 모듈화, 유지보수성, 그리고 독립성을 위해(테마를 바꾸더라도 기능이 손실되지 않도록 하기 위해) 가장 좋은 방법은 전용 기능 플러그인을 만드는 것입니다. 모든 WooCommerce 사용자 정의 코드(후크, 쇼트코드 등)를 이 플러그인에 집중시키면, 어떤 테마를 사용하든 귀하의 전자상거래 기능이 안정적으로 작동할 수 있습니다.

내 훅 코드가 제대로 실행되는지 어떻게 디버깅할 수 있나요?

먼저, WordPress의 디버깅 모드가 활성화되어 있는지 확인하세요(설정 방법은…). wp-config.php 중국어 설정 define('WP_DEBUG', true);이것은 문법 오류를 발견하는 데 도움이 됩니다.

후크(hook) 기반의 트리거 로직을 디버깅하려면, 콜백 함수의 시작 부분에 임시 로그 기록 코드를 추가하면 됩니다. error_log() 이 함수는 디버깅 정보를 서버 로그에 기록하거나, 다른 방식으로 사용합니다. wc_get_logger() WooCommerce 전용의 로그 파일에 데이터를 기록합니다. 로그 파일을 확인하여 예상되는 출력 내용이 있는지 확인함으로써, 훅(hook)이 제대로 실행되었는지와 함수가 정상적으로 작동했는지를 판단할 수 있습니다.

제가 설정한 사용자 정의 할인 코드가 특정 플러그인(예: 쿠폰)과 충돌하는 경우 어떻게 해야 하나요?

훅(Hook)의 실행 우선순위add_action 세 번째 매개변수는 충돌을 해결하는 데 핵심적인 역할을 합니다. 기본 우선순위는 10이며, 숫자가 작을수록 더 빨리 실행됩니다. 만약 할인 계산이 쇼핑카트의 최종 상태에 따라 달라진다면, 다른 플러그인(예: 쿠폰 플러그인, 우선순위가 10일 수 있음)이 가격을 수정한 후에 여러분의 로직이 실행되도록 더 높은 우선순위(예: 20)를 설정해야 합니다.

만약 충돌이 복잡하다면 조건 판단을 사용해야 할 수 있습니다. 함수 내에서 다른 할인이 이미 적용되었는지 확인하거나, 다른 방법을 사용해야 합니다. did_action()doing_action() 현재 실행 환경을 판단하는 함수를 사용하여 중복 계산이나 논리적 무한 루프를 방지합니다.

커스텀 주문 상태를 추가한 후에도, 왜 백엔드의 주문 목록 드롭다운 필터에서 해당 상태가 보이지 않나요?

단지… wc_order_statuses 필터 등록 상태만으로는 모든 관리 인터페이스의 드롭다운 목록에 필터가 표시되지 않을 수 있습니다. 이는 캐싱이나 목록 생성 메커니즘의 문제로 인해 발생할 수 있습니다.

확실히 코드가 올바르게 로드되었는지 확인해 주세요. 또한, 백엔드 페이지의 캐시를 갱신해 보실 수 있습니다(Shift+F5를 사용하거나 해당 기능을 제공하는 도구를 이용하세요). woocommerce_register_shop_order_post_statuses 필터에 대한 더 기본적인 등록 작업을 수행해 보세요. 문제가 여전히 해결되지 않는다면, 다른 플러그인이나 테마 코드가 해당 필터를 덮어쓰고 있는지 확인해 보세요. 다른 플러그인을 일시적으로 비활성화하여 문제의 원인을 찾아볼 수 있습니다.