Chia sẻ code theo dõi đơn hàng bằng số điện thoại và Order ID trong Woo

Cập nhật lần cuối 29/03/2024 by trong WordPress vào 29/03/2024 có 1422 Views

Như các bạn cũng biết, mặc định Woo có sẵn shortcode [woocommerce_order_tracking] để khách có thể theo dõi thông tin đơn hàng của mình và mặc định Woo dùng Order ID và Email mới có thể theo dõi được

Vấn đề đặt ra là nếu form checkout của bạn không bắt buộc khách nhập Email hoặc bạn đã bỏ luôn trường email trong form thanh toán đi rồi thì làm sao khách có thể theo dõi được?

Để giải quyết vấn đề đó bạn chỉ cần chuyển trường Email sang Số điện thoại là được. Lúc đó khách sẽ dùng Order ID và Số điện thoại để theo dõi đơn hàng của mình

Để duy trì blog nên mình có làm aff cho 1 số bên hosting. Nhưng dù aff mình cũng chọn 1 số nhà cung cấp uy tín về chất lượng và support nên các bạn cứ yên tâm nhé.

Nếu có mua hosting mà có trong list dưới đây các bạn click vào link trước khi mua để ủng hộ mình nhé. Mình cảm ơn nhiều

Code theo dõi đơn hàng bằng số điện thoại và Order ID

Code dưới đây mình vẫn sử dụng tên shortcode như của woo nên nếu ai đang có sẵn trang tracking rồi thì không cần thay đổi lại shortcode mà chỉ cần chèn code là được

Còn nếu ai bây giờ mới sử dụng chức năng theo dõi đơn hàng này thì chỉ cần chèn code vào file wp-content/themes/{your-theme}/functions.php rồi dán shortcode [woocommerce_order_tracking] vào page cần hiển thị form theo dõi là được nhé

Code chèn vào functions.php như sau

/*
 * Code theo dõi đơn hàng bằng SĐT
 * Author levantoan.com
 * */
add_action('init', function (){
    remove_shortcode('woocommerce_order_tracking');
    add_shortcode('woocommerce_order_tracking', function ($atts){
        global $post;
        // Check cart class is loaded or abort.
        if ( is_null( WC()->cart ) ) {
            return;
        }

        ob_start();

        $atts        = shortcode_atts( array(), $atts, 'woocommerce_order_tracking' );
        $nonce_value = wc_get_var( $_REQUEST['woocommerce-order-tracking-nonce'], wc_get_var( $_REQUEST['_wpnonce'], '' ) ); // @codingStandardsIgnoreLine.

        if ( isset( $_REQUEST['orderid'] ) && wp_verify_nonce( $nonce_value, 'woocommerce-order_tracking' ) ) { // WPCS: input var ok.

            $order_id    = empty( $_REQUEST['orderid'] ) ? 0 : ltrim( wc_clean( wp_unslash( $_REQUEST['orderid'] ) ), '#' ); // WPCS: input var ok.
            $order_phone = empty( $_REQUEST['order_phone'] ) ? '' : sanitize_text_field( wp_unslash( $_REQUEST['order_phone'] ) ); // WPCS: input var ok.

            if ( ! $order_id ) {
                wc_print_notice( __( 'Vui lòng nhập ID đơn hàng', 'devvn' ), 'error' );
            } elseif ( ! $order_phone ) {
                wc_print_notice( __( 'Vui lòng nhập số điện thoại', 'devvn' ), 'error' );
            } else {
                $order = wc_get_order( apply_filters( 'woocommerce_shortcode_order_tracking_order_id', $order_id ) );

                if ( $order && $order->get_id() && is_a( $order, 'WC_Order' ) && strtolower( $order->get_billing_phone() ) === strtolower( $order_phone ) ) {
                    do_action( 'woocommerce_track_order', $order->get_id() );
                    wc_get_template(
                        'order/tracking.php',
                        array(
                            'order' => $order,
                        )
                    );
                    return ob_get_clean();
                } else {
                    wc_print_notice( __( 'Xin lỗi, Chúng tôi không tìm thấy thông tin đơn hàng của bạn. Vui lòng liên hệ với chúng tôi để biết thông tin chi tiết!', 'devvn' ), 'error' );
                }
            }
        }

        wc_print_notices();
        ?>
        <form action="<?php echo esc_url( get_permalink( $post->ID ) ); ?>" method="post" class="woocommerce-form woocommerce-form-track-order track_order">

            <?php
            do_action( 'woocommerce_order_tracking_form_start' );
            ?>

            <p><?php esc_html_e( 'Để theo dõi đơn hàng của bạn xin vui lòng nhập ID đơn hàng và số điện thoại của bạn vào ô dưới đây và nhấn nút "Theo dõi".', 'devvn' ); ?></p>

            <p class="form-row form-row-first"><label for="orderid"><?php esc_html_e( 'ID Đơn hàng', 'devvn' ); ?></label> <input class="input-text" type="text" name="orderid" id="orderid" value="<?php echo isset( $_REQUEST['orderid'] ) ? esc_attr( wp_unslash( $_REQUEST['orderid'] ) ) : ''; ?>" placeholder="<?php esc_attr_e( 'Nhập ID Đơn hàng của bạn', 'devvn' ); ?>" /></p><?php // @codingStandardsIgnoreLine ?>
            <p class="form-row form-row-last"><label for="order_phone"><?php esc_html_e( 'Số điện thoại', 'devvn' ); ?></label> <input class="input-text" type="text" name="order_phone" id="order_phone" value="<?php echo isset( $_REQUEST['order_phone'] ) ? esc_attr( wp_unslash( $_REQUEST['order_phone'] ) ) : ''; ?>" placeholder="<?php esc_attr_e( 'Nhập số điện thoại của bạn', 'devvn' ); ?>" /></p><?php // @codingStandardsIgnoreLine ?>
            <div class="clear"></div>

            <?php
            do_action( 'woocommerce_order_tracking_form' );
            ?>

            <p class="form-row"><button type="submit" class="button<?php echo esc_attr( wc_wp_theme_get_element_class_name( 'button' ) ? ' ' . wc_wp_theme_get_element_class_name( 'button' ) : '' ); ?>" name="track" value="<?php esc_attr_e( 'Theo dõi', 'devvn' ); ?>"><?php esc_html_e( 'Theo dõi', 'devvn' ); ?></button></p>
            <?php wp_nonce_field( 'woocommerce-order_tracking', 'woocommerce-order-tracking-nonce' ); ?>

            <?php
            do_action( 'woocommerce_order_tracking_form_end' );
            ?>

        </form>
        <?php
        return ob_get_clean();
    });
}, 20);

Okie vậy là xong rồi nhé. Kiểm tra thử thôi nào!

Vấn đề mở rộng

Nếu khách chưa đăng nhập thì lúc theo dõi đơn hàng chỉ hiện ra thông tin sản phẩm chứ không hiển thị đầy đủ thông tin như địa chỉ, số điện thoại… của khách. Như hình dưới

Và bạn muốn hiện chúng lên khi khách chưa login thì chỉ cần thêm code sau vào wp-content/themes/{your-theme}/functions.php là được nhé

add_action('woocommerce_after_order_details', function ($order){
    $show_customer_details = is_user_logged_in() && $order->get_user_id() === get_current_user_id();
    if ( !$show_customer_details ) {
        wc_get_template( 'order/order-details-customer.php', array( 'order' => $order ) );
    }
});

Ổn rồi. Chúc các bạn thành công và được như ý nha!

4/5 - (3 votes)
Từ khóa: ,
  • Bình luận
Sản phẩm nổi bật của Toản
x