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.
Cần hiểu luồng API phía sau (token, tính phí, tạo đơn, in, huỷ)? Xem bài tích hợp API GHN bằng PHP.
Đặ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
| Hook | Tham số | Chạy khi nào |
|---|---|---|
devvn_after_ghn_create_order | $order_id | Ngay 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 | $order | Cuố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_tab | Trê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_general | khô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
| Hook | Mặ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_rate | mảng id, label, cost, meta_data; $rate_id; 0 | Chỉ á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, $package | Sử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, $package | Sử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
| Hook | Tham 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
| Hook | Mặ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_args | mả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 | $args | Sửa dữ liệu khi hỏi các ca lấy hàng. |
ghn_order_detail_args | $args | Sử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
| Hook | Mặc định / tham số | Dùng để |
|---|---|---|
ghn_mail_string_filter | $string, $order | Thê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_priority | 10 | Độ ư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_id | Filter 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_webhook | false | Trả 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
| Hook | Mặc định / tham số | Dùng để |
|---|---|---|
devvn_split_order_exclude_meta | mảng khoá meta không chép | Danh 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.
| Hook | Mặc định / tham số | Dùng để |
|---|---|---|
ghnauto_option | mả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_status | giá 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_actions | Mả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_process | true | Trả 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_debug | false | Trả 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".
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
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
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
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í
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.
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ũ.
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
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
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',
) );
} );
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.