Hook action và filter
Danh sách hook của plugin, đọc trực tiếp từ mã nguồn plugin chính 2.6.2 và addon đăng đơn tự động 1.0.2. Đủ để đổi phí ship, sửa dữ liệu trước khi tạo vận đơn, đổi cách tính khối lượng quy đổi và móc vào luồng webhook — mà không phải sửa file plugin.
Cần hiểu luồng API phía sau (token, tính cước, tạo đơn, huỷ đơn)? Xem bài tích hợp API Viettel Post 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.
Action
| Hook | Tham số | Chạy khi nào |
|---|---|---|
devvn_after_vtp_create_order | $order | Ngay sau khi tạo vận đơn ViettelPost 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 — mã vận đơn đọc bằng $order->get_meta('vtpost_order_number'). |
vn_shipping_tabs_nav | $current_tab | Giữa thanh tab, để thêm tab của riêng bạn. |
vn_shipping_tabs_content_<tab> | $current_tab | Nội dung của tab tự thêm. Chính addon đăng đơn tự động dùng cặp hook này. |
before_vn_shipping_tabs_nav · after_vn_shipping_tabs_nav | $current_tab | Trước và sau toàn bộ thanh tab. |
vn_checkout_setting_general | không có | Nội dung tab General — module trang thanh toán dùng chung móc vào đây. |
Filter — phí vận chuyển
| Hook | Mặc định / tham số | Dùng để |
|---|---|---|
viettelpost_money_total | $rate['MONEY_TOTAL'], $rate | Đổi số tiền phí ship hiện cho khách. Hook gọn để cộng phụ phí hay giảm giá ship. |
devvn_vtp_rate | mảng id, label, cost, calc_tax, meta_data; $rate_id, $shipping_fee, $package | Sửa nguyên gói phương thức vận chuyển trước khi WooCommerce nhận. Mạnh hơn nhưng dễ làm hỏng hơn. Giữ nguyên meta_data HubID, ServiceID — hộp thoại tạo vận đơn và addon đọc kho, dịch vụ từ đây. |
prefix_name_shipping_vtp | $service_name | Đổi tên phương thức hiện ở trang thanh toán. |
devvn_viettelpost_service_name | $name, $service | Đổi tên theo từng mã dịch vụ ($name đã gồm tiền tố). |
devvn_title_shipping_fee_failed | 'Phí vận chuyển sẽ báo sau.' | Chữ hiện khi ViettelPost không trả được giá. |
devvn_ghtk_shipping_cod | ['SCOD'] | Danh sách mã dịch vụ chính chỉ dành cho đơn thu hộ (COD). Khách chọn hình thức thanh toán khác cod thì các dịch vụ này bị ẩn ở trang thanh toán; trong hộp thoại tạo vận đơn, chọn loại vận đơn 1 (không thu tiền) cũng ẩn chúng. |
vtpost_getprice_args | $data, $package, $hubid, $payment_methob | Sửa dữ liệu gửi đi khi hỏi giá cho giỏ hàng. |
vtpost_getprice_args_order | $data, $order_id, $hubid, $args | Như trên nhưng khi hộp thoại tạo vận đơn hỏi giá cho một đơn cụ thể. |
vtpost_getpriceall_args | $data | Sửa dữ liệu khi hỏi giá tất cả dịch vụ cùng lúc. |
data_out_find_available_shipping | $data, $package, $hubid, $payment_methob | Sửa dữ liệu khi dò danh sách dịch vụ khả dụng. |
Filter — khối lượng và kho
| Hook | Mặc định | Dùng để |
|---|---|---|
vtp_so_quydoi | 6000 (dịch vụ VTK, VBE, ECOD, LCOD: 5000) | Số chia khi tính khối lượng quy đổi theo kích thước: (dài × rộng × cao) / số này. Plugin lấy giá trị lớn hơn giữa cân nặng thật và khối lượng quy đổi, cả lúc báo phí lẫn lúc tạo vận đơn. |
skip_weight_conversion | false | Trả true để bỏ quy đổi theo kích thước khi tính phí ở trang thanh toán, chỉ dùng cân nặng thật. |
vtp_store_default | $HubID_Order, $order | Kho chọn sẵn trong hộp thoại tạo vận đơn (mặc định là kho đã tính phí lúc khách đặt). Không áp cho trang thanh toán và cho addon. |
vtpost_auto_detect_provinces | [1, 2] | Mã tỉnh (theo ViettelPost) của các điểm nhận mẫu mà nút Lấy dịch vụ tự động dùng để dò dịch vụ khả dụng. Mặc định 1 là Hà Nội, 2 là TP.HCM. |
Filter — tạo vận đơn bằng tay
| Hook | Mặc định / tham số | Dùng để |
|---|---|---|
vtp_data_before_create_order | $data, $orderid | Sửa toàn bộ dữ liệu gửi lên ViettelPost ngay trước khi tạo vận đơn từ hộp thoại. Không chạy cho đơn addon đăng tự động/hàng loạt — đơn đó dùng vtpauto_pre_data_before_create_order. |
vtp_order_product_data | mảng order_total, prod_weight, prod_length, prod_width, prod_height, order_amout, order_amout_ship; $order, $HubID_Order | Chỉ điền sẵn giá trị hàng, cân nặng (gram), kích thước (cm), tiền thu hộ trong hộp thoại tạo vận đơn. Người dùng vẫn sửa được trước khi bấm tạo. |
order_payment_default | 3 | Loại vận đơn chọn sẵn cho đơn COD: 1 Không thu tiền · 2 Thu hộ tiền cước và tiền hàng · 3 Thu hộ tiền hàng · 4 Thu hộ tiền cước. Đơn trả trước tự về 1. Áp cho cả hộp thoại lẫn addon. |
order_payment_modify | $order_payment, $order | Đổi loại vận đơn theo từng đơn, chạy sau cùng (cả đơn trả trước). Áp cho cả hộp thoại lẫn addon. |
vtp_default_partner_order_number | $order->get_id(), $order | Mã đơn đối tác (ORDER_NUMBER) dùng khi ô Mã đơn đối tác trong hộp thoại để trống. Mặc định là ID đơn. Addon luôn gửi ID đơn, không qua hook này. |
vtp_after_create_order_json_data | $json_data, $orderid, $order | Sửa JSON plugin trả về trình duyệt admin sau khi tạo vận đơn thành công: đoạn HTML thay ô ViettelPost, mã vận đơn, câu thông báo. Không đổi được dữ liệu đã gửi ViettelPost. |
vtp_after_timeout_create_order_json_data | $timeout_json_data, $orderid, $order | Như trên, cho trường hợp ViettelPost trả lời quá chậm (vận đơn có thể đã được tạo bên ViettelPost). |
Filter — 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 để |
|---|---|---|
vtpauto_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ụ weight (100 g), autostatus (wc-dadanglenvtp). |
vtpauto_pre_data_before_create_order | $data, $order | Sửa dữ liệu gửi lên ViettelPost ngay trước khi addon tạo vận đơn. Tham số thứ hai là đối tượng đơn, không phải ID. |
vtp_auto_status | giá trị ô Trạng thái đơn sau khi đăng tự động (mặc định wc-dadanglenvtp) | 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. |
vtpauto_send_mail | $send_mail (theo ô Kích hoạt email của plugin chính), $order_id | Bật/tắt riêng email báo mã vận đơn cho đơn do addon đăng. |
vtp_auto_bulk_actions | $bulk_actions | Mảng hành động hàng loạt addon thêm vào danh sách đơn: uptovtp (Đăng đơn lên ViettelPost), mark_dadanglenvtp (Chuyển sang trạng thái đã đăng lên ViettelPost). |
vtp_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. Áp cho cả đăng tự động lẫn hàng loạt; đăng nhiều đơn một lúc thì nên giữ chạy nền. |
Filter — trạng thái, email và gỡ lỗi
| Hook | Mặc định / tham số | Dùng để |
|---|---|---|
devvn_vtp_to_order_status_<ma> | 'processing' | Ép trạng thái WooCommerce cho một mã trạng thái ViettelPost cụ thể. Có hook cho mã nào thì bảng ánh xạ bị bỏ qua với mã đó, và giá trị nhận vào luôn là 'processing' (không phải giá trị trong bảng) — hãy trả về trạng thái bạn muốn. |
devvn_vtp_status | mảng mã → tên (36 mã) | Sửa danh sách trạng thái ViettelPost hiện trong bảng ánh xạ và trong ô ViettelPost của đơn. |
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. |
load_vtp_style | false | Trả true để nạp CSS và JS của trang tra cứu ở mọi trang — dùng khi shortcode [viettel_tracking] nằm trong page builder hoặc widget mà plugin không nhận ra. |
vtp_debug | false | Trả true để ghi nhật ký chi tiết ra file trong thư mục plugin. Chỉ bật khi đang gỡ lỗi. |
Ví dụ hay dùng
Cộng thêm phụ phí đóng gói vào phí ship
add_filter( 'viettelpost_money_total', function ( $cost, $rate ) {
return $cost + 5000;
}, 10, 2 );
Miễn phí ship cho một hạng khách hàng
add_filter( 'viettelpost_money_total', function ( $cost, $rate ) {
$user = wp_get_current_user();
if ( in_array( 'vip_customer', (array) $user->roles, true ) ) {
return 0;
}
return $cost;
}, 10, 2 );
Bỏ quy đổi khối lượng theo kích thước ở trang thanh toán
Dùng khi muốn phí báo cho khách chỉ tính theo cân nặng thật. Quy đổi chỉ làm phí tăng khi khối lượng quy đổi lớn hơn cân nặng thật (hàng nhẹ mà cồng kềnh); cước ViettelPost thu thực tế vẫn theo cách họ cân đo khi nhận hàng.
add_filter( 'skip_weight_conversion', '__return_true' );
Thêm lời nhắn cố định cho bưu tá trên mọi vận đơn
Ghép thêm một câu vào ghi chú vận đơn (ORDER_NOTE), giữ nguyên ghi chú đã có. Hai hook vì đơn tạo tay và đơn addon đăng tự động đi hai đường khác nhau.
function my_vtp_add_note( $data ) {
$data['ORDER_NOTE'] = trim( $data['ORDER_NOTE'] . ' Cho xem hang, khong cho thu' );
return $data;
}
add_filter( 'vtp_data_before_create_order', 'my_vtp_add_note' ); // tạo tay
add_filter( 'vtpauto_pre_data_before_create_order', 'my_vtp_add_note' ); // addon tự động/hàng loạt
Tên khoá trong $data theo đúng tài liệu API của ViettelPost. Bật vtp_debug rồi tạo thử một vận đơn để xem cấu trúc thật trước khi sửa.
Chọn sẵn một kho gửi cho đơn của vài tỉnh
Mã tỉnh là mã của plugin, viết hoa không dấu như HANOI, HOCHIMINH, DANANG. Hook này chỉ đổi kho chọn sẵn trong hộp thoại tạo vận đơn.
add_filter( 'vtp_store_default', function ( $hub_id, $order ) {
if ( in_array( $order->get_shipping_state(), array( 'DANANG', 'QUANGNGAI' ), true ) ) {
return '10000002';
}
return $hub_id;
}, 10, 2 );
Ghi lại mã vận đơn sang hệ thống khác
add_action( 'devvn_after_vtp_create_order', function ( $order ) {
$tracking = $order->get_meta( 'vtpost_order_number' );
if ( $tracking ) {
error_log( 'Don ' . $order->get_id() . ' co ma van don ' . $tracking );
}
} );
Thêm mã thay thế của riêng bạn vào email
add_filter( 'mail_string_filter', function ( $string, $order ) {
return str_replace( '{hotline}', '0965 419 096', $string );
}, 10, 2 );
Hai hook viettelpost_money_total và vtp_data_before_create_order tác động thẳng lên số tiền khách trả và lên vận đơn thật. Plugin chưa có chế độ chạy thử: luôn gọi hệ thống thật (Production) của ViettelPost, kể cả trên bản sao website. Hãy thử trên bản sao để khỏi ảnh hưởng khách thật, và huỷ ngay vận đơn thử. ViettelPost có môi trường Development riêng (partnerdev.viettelpost.vn) dành cho ai tự viết code gọi API; plugin không dùng môi trường này.
Còn vướng chỗ nào thì xem Giải đáp thắc mắc.