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.

Nâng cao Dành cho lập trình viên Cập nhật 10.10.2026
Tích hợp API Viettel Post vào website: 6 bước cho dev PHP
Muốn hiểu luồng API Viettel Post phía sau plugin (token, cước, tạo đơn, hủy đơn, webhook)? Video 2 phút 14 giây theo tài liệu API chính thức.

Đặ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

HookTham sốChạy khi nào
devvn_after_vtp_create_order$orderNgay 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_tabGiữa thanh tab, để thêm tab của riêng bạn.
vn_shipping_tabs_content_<tab>$current_tabNộ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_tabTrước và sau toàn bộ thanh tab.
vn_checkout_setting_generalkhô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

HookMặ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_ratemảng id, label, cost, calc_tax, meta_data; $rate_id, $shipping_fee, $packageSử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_methobSửa dữ liệu gửi đi khi hỏi giá cho giỏ hàng.
vtpost_getprice_args_order$data, $order_id, $hubid, $argsNhư 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$dataSử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_methobSửa dữ liệu khi dò danh sách dịch vụ khả dụng.

Filter — khối lượng và kho

HookMặc địnhDùng để
vtp_so_quydoi6000 (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_conversionfalseTrả 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, $orderKho 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

HookMặc định / tham sốDùng để
vtp_data_before_create_order$data, $orderidSử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_datamảng order_total, prod_weight, prod_length, prod_width, prod_height, order_amout, order_amout_ship; $order, $HubID_OrderChỉ đ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_default3Loạ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(), $orderMã đơ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, $orderSử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, $orderNhư 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.

HookMặc định / tham sốDùng để
vtpauto_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ụ weight (100 g), autostatus (wc-dadanglenvtp).
vtpauto_pre_data_before_create_order$data, $orderSử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_statusgiá 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_idBật/tắt riêng email báo mã vận đơn cho đơn do addon đăng.
vtp_auto_bulk_actions$bulk_actionsMả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_processtrueTrả 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

HookMặ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_statusmả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, $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.
load_vtp_stylefalseTrả 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_debugfalseTrả 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

PHP
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

PHP
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.

PHP
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.

PHP
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.

PHP
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

PHP
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

PHP
add_filter( 'mail_string_filter', function ( $string, $order ) {
    return str_replace( '{hotline}', '0965 419 096', $string );
}, 10, 2 );
Thử trên bản sao website trước

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.

Hỗ trợ Zalo