Lưu giá trị trường tùy chỉnh thanh toán và hiển thị nó trong đơn đặt hàng quản trị WooCommerce

Jan 07 2021

Tôi có một số trường bổ sung trong thanh toán của mình để đặt câu hỏi từ khách hàng về những điều nhất định liên quan đến đơn đặt hàng của họ. Hầu hết đây là các trường nhập văn bản nhưng có một menu Chọn hỏi họ cách họ nghe về trang web khách hàng của tôi. Tôi không thể tìm ra cách hiển thị giá trị trong vùng meta của thứ tự cho tùy chọn đã chọn. Đây là cách tôi tạo trình đơn thả xuống lựa chọn đó trong tệp functions.php từ chủ đề của tôi.

woocommerce_form_field( 'aba_hear', array(
    'type'     => 'select',
    'required' => 'true',
    'class'    => array('hear-class form-row-wide'),
    'label'    => __('How did You Hear About Us?'),
    'options'  => array( // options for <select> or <input type="radio" />
        ''          => 'Please select', // empty values means that field is not selected
        'Instagram' => 'Instagram',
        'Facebook'  => 'Facebook',
        'Yelp'  => 'Yelp',
        'Other' => 'Other',
    )

), $checkout->get_value( 'aba_hear' ) );

Bây giờ tôi đi thêm một hàm để cập nhật các giá trị meta đơn hàng:

add_action( 'woocommerce_checkout_update_order_meta', 'aba_checkout_field_update_order_meta' );

function aba_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['aba_hear'] ) ) { update_post_meta( $order_id, 'How did You Hear About Us&#63;', sanitize_text_field( $_POST['aba_hear'] ) );
    }
}

Và cuối cùng là hiển thị giá trị trên trang đặt hàng:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'aba_checkout_field_display_admin_order_meta', 10, 1 );
function aba_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('How did You Hear About Us&#63;').':</strong> ' . get_post_meta( $order->id, 'Is this a Gift&#63;', true ) . '</p>';
}

Cuối cùng, đây là cách mã của menu chọn xuất hiện khi thanh toán:

<p class="form-row hear-class form-row-wide validate-required" id="aba_hear_field" data-priority="">
    <label for="aba_hear" class="">How did You Hear About Us&#063;&nbsp;<abbr class="required" title="required">*</abbr></label>
    <span class="woocommerce-input-wrapper">
        <select name="aba_hear" id="aba_hear" class="select " data-allow_clear="true" data-placeholder="Please select">
            <option value=""  selected='selected'>Please select</option>
            <option value="Instagram" >Instagram</option>
            <option value="Facebook" >Facebook</option>
            <option value="Yelp" >Yelp</option>
            <option value="Other" >Other</option>
        </select>
    </span>
</p>

Bây giờ, điều này hoạt động tốt cho các trường nhập văn bản nhưng không phải các menu chọn. Làm cách nào tôi có thể thay đổi điều này để làm cho nó hoạt động để tôi có thể hiển thị dữ liệu kết quả?

Trả lời

1 LoicTheAztec Jan 07 2021 at 15:07

Có một số lỗi trong một số chức năng của bạn… Bạn cần sử dụng cùng một khóa trường thanh toán làm khóa meta trong các chức năng sau:

Trong chức năng thứ 2, bạn cũng sử dụng một hook khác và lưu trường tùy chỉnh dưới dạng dữ liệu meta người dùng:

add_action( 'woocommerce_checkout_create_order', 'aba_checkout_field_update_order_meta' );

function aba_checkout_field_update_order_meta( $order ) { if ( isset($_POST['aba_hear']) && ! empty($_POST['aba_hear']) ) { $order->update_meta_data( '_aba_hear', sanitize_text_field( $_POST['aba_hear'] ) ); // Update user data if( $order->get_user_id() > 0 ) {
            update_user_meta( $order->get_user_id(), 'aba_hear', true );
        }
    }
}

Trong chức năng thứ 3, sử dụng cái này:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'aba_checkout_field_display_admin_order_meta', 10, 1 );
function aba_checkout_field_display_admin_order_meta( $order ){
    $value = $order->get_meta( '_aba_hear' );

    if ( ! empty($value) ) { echo '<p><strong>'.__('How did You Hear About Us&#63;').':</strong> ' . $value . '</p>';
    }
}

Nó sẽ hoạt động tốt hơn bây giờ.


Ghi chú:

Tại sao lại lưu trường thanh toán này dưới dạng dữ liệu meta người dùng tùy chỉnh?

Bởi vì trong chức năng đầu tiên của bạn, bạn có chức năng $checkout->get_value( 'aba_hear' )đó sẽ hiển thị giá trị đã chọn từ đơn đặt hàng cuối cùng của khách hàng trong trường thanh toán tùy chỉnh này. Giá trị được đọc từ meta người dùng 'aba_hear'.