Hook action và filter

Danh sách filter của plugin Đồng bộ KiotViet, đọc trực tiếp từ mã nguồn bản 1.3.4, chia theo việc bạn muốn làm: sửa dữ liệu đơn gửi lên KiotViet, đổi tên địa chỉ, chọn trạng thái coi là đã thanh toán. Không phải sửa file plugin.

Nâng cao Dành cho lập trình viên Cập nhật 12.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.

Riêng filter kiotviet_sync_option được đọc ngay lúc plugin nạp, trước khi theme nạp. Muốn nó có tác dụng thì đặt trong một file ở wp-content/mu-plugins/.

Phần trang thanh toán Việt Nam ở tab Cài đặt chung là module dùng chung với các plugin DevVN khác, có hook riêng và không liệt kê ở bài này.

Action

Bản 1.3.4 không có action riêng nào chạy trước hay sau khi đồng bộ sản phẩm hoặc đăng đơn. Cần biết một bản ghi đã liên kết KiotViet chưa thì đọc meta plugin lưu:

Đối tượngMetaÝ nghĩa
Sản phẩm, biến thể_kiotvietIDID hàng hoá trên KiotViet. Có meta này mới đồng bộ và đăng đơn được.
Sản phẩm cha có biến thể_kiotvietMasterProductIdID hàng hoá cha trên KiotViet.
Sản phẩm, biến thể_kiotviet_skip_syncGiá trị yes khi bật Không đồng bộ từ KiotViet.
Sản phẩm, biến thể_kiotviet_tax_id, _kiotviet_tax_name, _kiotviet_tax_valueThông tin VAT lấy từ KiotViet, gửi kèm khi bật Gửi VAT khi đăng đơn.
Đơn hàng_kiotviet_order_id, _kiotviet_order_code, _kiotviet_order_statusID, mã phiếu Đặt hàng trên KiotViet và trạng thái đăng.
Người dùng_kiotviet_customer_id, _kiotviet_customer_codeID và mã khách trên KiotViet.
Danh mục sản phẩm_kiot_idID nhóm hàng trên KiotViet.

Đơn hàng đọc meta bằng $order->get_meta( '_kiotviet_order_code' ), chạy được cả khi bật HPOS.

Filter: dữ liệu đơn gửi lên KiotViet

Tham số $context là 'create' khi đăng đơn mới, 'update' khi cập nhật. Tham số $shipping_data là dữ liệu từ hộp thoại đăng đơn hoặc từ luồng tự động; $shipping_data['auto_sync'] bằng true khi đơn được tự động đăng.

HookGiá trị lọc, tham sốDùng để
devvn_kiotviet_sync_order_payload$kiotviet_order, $order, $shipping_data, $contextSửa toàn bộ phiếu ngay trước khi gửi: branchId, code, orderDetails, customer, orderDelivery, discount, total, totalPayment, method, status, description, saleChannelId, surchages. Chạy sau cùng.
devvn_kiotviet_sync_order_line_item$line_item, $item, $product, $order, $contextSửa từng dòng sản phẩm (productId, productCode, productName, quantity, price, OrderDetailTaxs).
devvn_kiotviet_sync_order_details$order_details, $order, $contextSửa cả mảng dòng sản phẩm, ví dụ thêm hay bớt dòng.
devvn_kiotviet_sync_order_customer$customer_data, $order, $contextSửa khối khách (name, contactNumber, address, locationName, wardName, email, id, code). Chỉ chạy khi Xử lý khách hàng là Tạo khách mới.
devvn_kiotviet_sync_order_delivery$order_delivery, $order, $shipping_data, $contextSửa khối giao hàng: receiver, type (0 giao thường, 1 giao nhanh, 2 giao trong ngày), contactNumber, address, locationName, wardName, weight (gram), length, width, height (cm).
devvn_kiotviet_sync_order_description (1.3.4)$description, $order, $shipping_data, $contextSửa ghi chú phiếu. Mặc định là nội dung ô Ghi chú gửi KiotViet trong hộp thoại; khi tự động đăng là ghi chú của khách cộng nội dung ô Ghi chú khi tự động đăng.
devvn_kiotviet_sync_order_surcharges$surcharges (mảng id, code, price), $order, $shipping_data, $contextSửa danh sách thu khác. Chạy cả khi ô Đồng bộ phụ thu đang tắt, nên tự dựng phụ thu bằng code được.
devvn_kiotviet_sync_order_has_paid_statusesarray( 'completed' )Trạng thái WooCommerce coi là khách đã trả tiền với đơn không thu tiền khi nhận hàng. Dùng cho số tiền điền sẵn trong hộp thoại và khi tự động đăng.
devvn_kiotviet_sync_order_statuses1 Phiếu tạm, 2 Đang giao hàng, 3 Hoàn thành, 4 Đã hủy, 5 Đã xác nhậnDanh sách trạng thái phiếu Đặt hàng hiện trong Bảng ánh xạ trạng thái, cũng dùng để kiểm mã trạng thái trước khi gửi.

Filter: địa chỉ gửi lên KiotViet

HookGiá trị lọc, tham sốDùng để
devvn_kiotviet_sync_location_name_map (1.3.3)array(), $addressBảng đổi tên khu vực, phường/xã dạng tên trên web sang tên trên KiotViet. Áp cho đơn hàng, khách trong đơn và hồ sơ khách.
devvn_kiotviet_sync_location (1.3.3)$location (locationName, wardName, address), $addressSửa khu vực, phường/xã, dòng địa chỉ sau khi plugin đã chuẩn hoá.
devvn_kiotviet_sync_normalize_province_name$name, $originalTên tỉnh/thành sau khi chuẩn hoá.
devvn_kiotviet_sync_matched_location_name$matched_name, $customer_addressTên Location KiotViet đã khớp với địa chỉ 3 cấp, sau khi bạn tải danh sách Location.

Filter: khách hàng, sản phẩm, cài đặt

HookGiá trị lọc, tham sốDùng để
devvn_kiotviet_sync_customer_branch_id$branch_id, $options (có order_id khi khách sinh ra từ đơn)Chi nhánh gửi kèm khi tạo khách mới trên KiotViet. Trả về đúng một ID.
devvn_kiotviet_variation_gallery_meta_key$meta_key, $variation_idMeta lưu ảnh phụ của biến thể, mặc định theo ô Tên meta key. Trả chuỗi rỗng để không lưu.
devvn_kiotviet_sync_setup_steps$steps, $main_instanceThêm, bớt bước trong tab Bắt đầu. Mỗi bước có id, title, required, status, message.
kiotviet_sync_optionmảng khai báo option (args, group, default)Đổi giá trị mặc định của các ô cài đặt. Đặt trong mu-plugins.

Ví dụ hay dùng

Mỗi đoạn dưới đây chép nguyên vào child theme hoặc plugin riêng là chạy, chỉ thay các giá trị đánh dấu.

Đơn nhận tại cửa hàng vào chi nhánh khác

Mọi đơn vào Chi nhánh mặc định. Đoạn này đưa đơn chọn nhận tại cửa hàng sang chi nhánh khác. ID chi nhánh xem bằng cách bấm chuột phải vào ô Chi nhánh mặc định, chọn Kiểm tra (Inspect) rồi đọc thuộc tính value của từng lựa chọn.

PHP
add_filter( 'devvn_kiotviet_sync_order_payload', function ( $payload, $order, $shipping_data, $context ) {
    if ( $order->has_shipping_method( 'local_pickup' ) || $order->has_shipping_method( 'pickup_location' ) ) {
        $payload['branchId'] = 123456; // ID chi nhánh trên KiotViet
    }
    return $payload;
}, 10, 4 );

Thêm hình thức thanh toán vào ghi chú khi tự động đăng

PHP
add_filter( 'devvn_kiotviet_sync_order_description', function ( $description, $order, $shipping_data, $context ) {
    if ( empty( $shipping_data['auto_sync'] ) ) {
        return $description;
    }
    return trim( $description . "\n" . 'Thanh toán: ' . $order->get_payment_method_title() );
}, 10, 4 );

Đơn đăng bằng hộp thoại giữ nguyên ghi chú bạn gõ, vì điều kiện auto_sync chỉ đúng khi đơn được tự động đăng.

Coi đơn Đang xử lý là đã thanh toán

Mặc định chỉ đơn Hoàn thành được gửi lên với số tiền khách đã trả bằng tổng đơn. Cổng thanh toán online thường để đơn ở Đang xử lý sau khi nhận tiền:

PHP
add_filter( 'devvn_kiotviet_sync_order_has_paid_statuses', function ( $statuses ) {
    $statuses[] = 'processing';
    return $statuses;
} );

Filter áp cho mọi đơn không thu tiền khi nhận hàng. Website có đơn chuyển khoản tay được chuyển sang Đang xử lý trước khi nhận tiền thì đừng dùng đoạn này.

Gửi tổng khối lượng cả đơn khi tự động đăng

Đoạn này cộng khối lượng mọi dòng sản phẩm nhân số lượng, đổi sang gram theo đơn vị cân nặng của cửa hàng:

PHP
add_filter( 'devvn_kiotviet_sync_order_delivery', function ( $delivery, $order, $shipping_data, $context ) {
    if ( empty( $shipping_data['auto_sync'] ) ) {
        return $delivery;
    }
    $weight = 0;
    foreach ( $order->get_items() as $item ) {
        $product = $item->get_product();
        if ( $product && $product->get_weight() ) {
            $weight += (float) $product->get_weight() * $item->get_quantity();
        }
    }
    if ( $weight > 0 ) {
        $delivery['weight'] = (float) wc_get_weight( $weight, 'g' );
    }
    return $delivery;
}, 10, 4 );

Đổi tên phường/xã mà KiotViet không nhận

Khoá là tên đang có trên web (hoặc tên sau khi plugin chuẩn hoá), giá trị là tên đúng như danh mục khu vực, phường/xã trên KiotViet:

PHP
add_filter( 'devvn_kiotviet_sync_location_name_map', function ( $map, $address ) {
    $map['Phường Tên Trên Web'] = 'Phường Tên Trên KiotViet';
    return $map;
}, 10, 2 );

Bỏ bước Đồng bộ khách hàng khỏi tab Bắt đầu

Cửa hàng không dùng đồng bộ khách hàng thì bước 9 luôn báo Chưa làm và bộ đếm không bao giờ đủ. Đoạn này bỏ bước đó khỏi danh sách:

PHP
add_filter( 'devvn_kiotviet_sync_setup_steps', function ( $steps ) {
    return array_values( array_filter( $steps, function ( $step ) {
        return 'customer-sync' !== $step['id'];
    } ) );
} );
Thử trên bản sao website trước

Các filter đơn hàng tác động lên phiếu thật trên KiotViet, kể cả số tiền khách đã trả ghi trên phiếu. Thử trên bản sao website với một đơn giá trị nhỏ, đối chiếu trên KiotViet, xong thì xoá phiếu thử.

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

Hỗ trợ Zalo