Hook action và filter

Danh sách hook của plugin, đọc trực tiếp từ mã nguồn plugin chính 3.5.0 và addon đăng đơn tự động 1.0.1. Đủ để đổi tên hay giấu bớt gói cước, sửa dữ liệu trước khi tạo vận đơn, đổi cách tính khối lượng và nối mã vận đơn sang hệ thống khác — mà không phải sửa file plugin.

Nâng cao Dành cho lập trình viên Cập nhật 11.10.2026

Đặt code ở đâu

Đặt trong functions.php của child theme, hoặc tốt hơn là một plugin nhỏ riêng để đổi giao diện không mất code. Đừng sửa file trong thư mục plugin — mọi thay đổi sẽ mất khi cập nhật.

Hai filter ghn_tracking_order_priority và ghnauto_option được đọc ngay lúc plugin khởi động, trước khi theme nạp — muốn chúng có tác dụng thì đặt trong một file ở wp-content/mu-plugins/.

Action

HookTham sốChạy khi nào
devvn_after_ghn_create_order$order_idNgay sau khi tạo vận đơn GHN thành công — cả khi tạo tay lẫn khi addon đăng tự động/hàng loạt. Hook chính để nối sang hệ thống khác; email báo mã vận đơn cũng gắn vào đây. Mã vận đơn đọc bằng wc_get_order( $order_id )->get_meta( '_ghn_ordercode' ).
after_ghn_order_action_html$orderCuối ô GHN trong trang sửa đơn hàng. Dùng để thêm nút của riêng bạn vào đó.
ghn_setting_menu$current_tabTrên thanh tab cấu hình, ngay trước tab License — để thêm tab mới.
ghn_setting_menu_<tab>không cóNội dung của tab tự thêm. Chính addon đăng đơn tự động dùng cặp hook này.
vn_checkout_setting_generalkhông cóNội dung tab Cài đặt chung — module trang thanh toán dùng chung móc vào đây.

Filter — phí vận chuyển và gói cước

HookMặc định / tham sốDùng để
ghn_exclude_service[]Mảng service_type_id không hiện cho khách ở trang thanh toán: 2 là Hàng nhẹ, 5 là Hàng nặng. Không phải mã dịch vụ (ServiceID). Không áp cho hộp thoại tạo vận đơn.
ghn_service_name$name, $idĐổi tên gói hiện cho khách (mặc định là tên GHN trả về, như "Hàng nhẹ"). Được gọi hai lần cho mỗi gói: lần đầu $id là service_type_id, lần sau là service_id — nên so theo $name cho chắc.
devvn_ghn_ratemảng id, label, cost, meta_data; $rate_id; 0Chỉ áp cho dòng dự phòng "Phí vận chuyển sẽ báo sau." khi GHN không trả được giá. Không đổi được giá của các gói GHN thật — muốn đổi giá thật thì dùng woocommerce_package_rates của WooCommerce (xem ví dụ bên dưới).
devvn_title_shipping_fee_failed'Phí vận chuyển sẽ báo sau.'Chữ hiện ở dòng dự phòng khi GHN không trả được giá.
ghn_available_services_args$args, $packageSửa dữ liệu gửi đi khi hỏi GHN có những gói nào. Trong hộp thoại tạo vận đơn chỉ có $args.
ghn_get_fee_args$args, $packageSửa dữ liệu gửi đi khi hỏi giá từng gói. Trong hộp thoại tạo vận đơn chỉ có $args.

Filter — khối lượng và kích thước

HookTham sốDùng để
wc_devvn_cart_contents_weight$weight (gram)Đổi tổng khối lượng giỏ hàng khi tính phí ở trang thanh toán. Dùng để cộng thêm khối lượng bao bì.
wc_devvn_cart_contents_dimension$dimension, $dimension_text, $packageĐổi kích thước gói hàng của cả giỏ.
get_product_dimension$dimension, $product, $qty, $dimension_textĐổi kích thước, khối lượng tính cho từng sản phẩm.

Filter — tạo vận đơn

HookMặc định / tham sốDùng để
ghn_pre_data_before_create_order$data, $order (đối tượng đơn)Sửa toàn bộ dữ liệu gửi lên GHN ngay trước khi tạo vận đơn. Chạy cả khi tạo tay lẫn khi addon đăng.
ghn_items_create_order_argsmảng một món hàng (name, quantity, length, width, height, weight), $itemĐổi từng dòng trong danh sách hàng gửi kèm vận đơn (khi bật Danh sách sp trong đơn hàng, hoặc gói Hàng nặng). Chạy cả khi tạo tay lẫn khi addon đăng.
devvn_ghn_product_args$products, $this, $orderĐổi danh sách sản phẩm plugin dùng để hiện trong hộp thoại và tính khối lượng, kích thước của đơn. Không đổi danh sách hàng gửi lên GHN — dùng hook ở dòng trên.
ghn_shift_date_args$argsSửa dữ liệu khi hỏi các ca lấy hàng.
ghn_order_detail_args$argsSửa dữ liệu khi hỏi chi tiết một vận đơn (bảng hành trình).

Filter — email, tra cứu, gỡ lỗi

HookMặc định / tham sốDùng để
ghn_mail_string_filter$string, $orderThêm mã thay thế của riêng bạn vào tiêu đề và nội dung email báo mã vận đơn.
ghn_tracking_order_priority10Độ ưu tiên khi chèn bảng hành trình vào trang Tài khoản → Xem đơn hàng. Đặt trong mu-plugin.
woocommerce_shortcode_order_tracking_order_id$order_idFilter của WooCommerce, trang [ghn_tracking] cũng chạy qua: đổi ID đơn khách nhập vào form tra cứu (ví dụ khi bạn dùng mã đơn tuỳ chỉnh).
enable_debug_webhookfalseTrả true để ghi dữ liệu webhook GHN gửi về vào ghn_log.txt. File này mở được công khai và chứa khoá bí mật webhook — chỉ bật khi gỡ lỗi, xem bài webhook.

Filter — module trang thanh toán

HookMặc định / tham sốDùng để
devvn_split_order_exclude_metamảng khoá meta không chépDanh sách khoá meta không chép sang đơn mới khi dùng Tách đơn hàng. Mặc định không có khoá của GHN, nên đơn tách ra mang theo mã vận đơn của đơn gốc — xem ví dụ bên dưới.

Hook của addon đăng đơn tự động/hàng loạt

Chỉ có khi đã cài addon đăng đơn tự động/hàng loạt.

HookMặc định / tham sốDùng để
ghnauto_optionmảng khai báo cài đặt: khoá → args, group, defaultĐổi giá trị mặc định của các ô cài đặt addon khi chưa lưu, ví dụ when (wc-completed), ServiceID (53321), ServiceTypeID (2), weight (10), autostatus (wc-dadanglenghn). Đặt trong mu-plugin.
ghnauto_pre_data_before_create_order$data, $order (đối tượng đơn)Sửa dữ liệu gửi lên GHN, chỉ cho đơn addon đăng. Chạy trước ghn_pre_data_before_create_order.
ghn_auto_statusgiá trị ô Trạng thái đơn sau khi đăng tự động (mặc định wc-dadanglenghn)Trạng thái đơn chuyển sang sau khi addon đăng thành công. Trả chuỗi rỗng để không đổi trạng thái.
ghn_auto_bulk_actions$bulk_actionsMảng thao tác hàng loạt addon thêm vào danh sách đơn: uptoghn (Đăng đơn lên GHN), mark_dangdonghang, mark_dadanglenghn.
ghn_auto_enable_background_processtrueTrả false để addon đăng ngay trong lượt xử lý đó thay vì xếp hàng chạy nền. Đăng nhiều đơn một lúc thì nên giữ chạy nền.
ghn_auto_debugfalseTrả true để ghi dữ liệu mỗi lần addon đăng vào ghn_auto_log.txt trong thư mục addon. File chứa họ tên, số điện thoại, địa chỉ khách — chỉ bật khi gỡ lỗi, xong thì gỡ và xoá file.

Có trong mã nguồn nhưng không chạy

Bạn có thể thấy các tên dưới đây khi đọc mã nguồn, nhưng ở bản 3.5.0 chúng không bao giờ được gọi — móc vào sẽ không có tác dụng gì:

  • ghn_custom_field — thuộc hàm trường thanh toán cũ, không còn gắn vào đâu.
  • devvn_notecode_default — chỉ nằm trong đoạn cập nhật vận đơn kiểu cũ không còn dùng. Ghi chú bắt buộc mặc định chỉnh ở tab Cài đặt GHN.
  • ghn_template_path, ghn_get_template, ghn_locate_template, ghn_before_template_part, ghn_after_template_part — hàm nạp template của plugin không được gọi ở đâu, nên không ghi đè template bằng theme được.

Ví dụ hay dùng

Cộng thêm phí đóng gói vào phí ship GHN

devvn_ghn_rate không chạm được giá thật, nên dùng filter của WooCommerce. Phương thức GHN có mã ghn_shipping_method; điều kiện get_cost() > 0 để bỏ qua dòng "báo sau".

PHP
add_filter( 'woocommerce_package_rates', function ( $rates ) {
    foreach ( $rates as $rate ) {
        if ( 'ghn_shipping_method' === $rate->get_method_id() && $rate->get_cost() > 0 ) {
            $rate->set_cost( $rate->get_cost() + 5000 );
        }
    }
    return $rates;
} );

Miễn phí ship GHN cho một hạng khách hàng

PHP
add_filter( 'woocommerce_package_rates', function ( $rates ) {
    $user = wp_get_current_user();
    if ( ! in_array( 'vip_customer', (array) $user->roles, true ) ) {
        return $rates;
    }
    foreach ( $rates as $rate ) {
        if ( 'ghn_shipping_method' === $rate->get_method_id() ) {
            $rate->set_cost( 0 );
        }
    }
    return $rates;
} );

WooCommerce lưu tạm kết quả phí ship trong phiên của khách. Thêm hoặc sửa đoạn code xong, hãy đổi địa chỉ hay số lượng trong giỏ để phí được tính lại khi kiểm tra.

Không cho khách chọn gói Hàng nặng

PHP
add_filter( 'ghn_exclude_service', function ( $types ) {
    $types[] = 5; // service_type_id: 2 = Hàng nhẹ, 5 = Hàng nặng
    return $types;
} );

Đổi tên gói hiện ở trang thanh toán

PHP
add_filter( 'ghn_service_name', function ( $name ) {
    if ( 'Hàng nhẹ' === $name ) {
        return 'Giao Hàng Nhanh (GHN)';
    }
    return $name;
} );

Cộng thêm khối lượng bao bì khi tính phí

PHP
add_filter( 'wc_devvn_cart_contents_weight', function ( $weight ) {
    return $weight + 100; // gram
} );

Thêm lời nhắn cố định vào ghi chú vận đơn

Ghép thêm một câu vào ghi chú vận đơn (note), giữ nguyên ghi chú đã có. Một hook là đủ cho cả đơn tạo tay lẫn đơn addon đăng.

PHP
add_filter( 'ghn_pre_data_before_create_order', function ( $data, $order ) {
    $data['note'] = trim( $data['note'] . ' Goi truoc khi giao 15 phut' );
    return $data;
}, 10, 2 );

Tên khoá trong $data theo tài liệu API tạo đơn của GHN tại developer.ghn.vn.

Ghi lại mã vận đơn sang hệ thống khác

Đọc meta qua đối tượng đơn để chạy đúng cả khi bật HPOS (bảng đơn hàng mới) lẫn kho đơn cũ.

PHP
add_action( 'devvn_after_ghn_create_order', function ( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( ! $order ) {
        return;
    }
    $tracking = $order->get_meta( '_ghn_ordercode' );
    if ( $tracking ) {
        error_log( 'Don ' . $order_id . ' co ma van don ' . $tracking );
    }
} );

Thêm mã thay thế của riêng bạn vào email

PHP
add_filter( 'ghn_mail_string_filter', function ( $string, $order ) {
    return str_replace( '{hotline}', '0965 419 096', $string );
}, 10, 2 );

Không chép mã vận đơn GHN khi tách đơn

PHP
add_filter( 'devvn_split_order_exclude_meta', function ( $keys ) {
    return array_merge( $keys, array(
        '_ghn_ordercode',
        '_ghn_order_fullinfor',
        '_ghn_order_submited',
        '_ghn_order_status',
        'ghn_auto_status',
        'ghn_auto_info',
    ) );
} );
Thử ở môi trường Test trước

woocommerce_package_rates tác động thẳng lên số tiền khách trả, còn ghn_pre_data_before_create_order tác động lên vận đơn. Thử trên bản sao website, và chuyển sang môi trường Test ở tab Cài đặt GHN khi thử tạo vận đơn — theo tài liệu GHN, môi trường này không phát sinh đơn thật.

Còn vướng chỗ nào thì xem Giải đáp thắc mắc.

Hỗ trợ Zalo