Cú Đêm: Bài viết, thủ thuật, hướng dẫn về cấu hình máy chủ, website và kiến thức nâng cao.

Code tạo custom field trong đơn hàng woocommerce

Mục nội dung

Code này nhằm mục đích tạo một custom field để điền thông tin, ở đây mình sẽ điền trạng thái “check-in” trong đơn hàng. Mà điền trạng thái này sẽ được điền bằng cách bấm vào nút.

Mục đích sử dụng: Tạo một ô tuỳ chọn cho trạng thái của đơn hàng. Có giá trị hoặc không giá trị.

  • Nếu trạng thái đơn hàng đã được điền (nghĩa là có nút check-in) thì nền của ô input chuyển sang màu xanh
  • Nếu trạng thái đơn hàng chưa có gì (đang trống) thì ô input ở màu xám.
  • Đồng thời có nút cập nhật sẽ tự động điền “check-in” hoặc xoá “check-in” khi người dùng bấm nút.

Đoạn mã 1: Tạo Metabox trong order details (chi tiết order) của woocommerce.

// Adding Meta container admin shop_order pages - Thêm hộp meta vào trang shop_order.
add_action( 'add_meta_boxes', 'prefix_add_meta_boxes' );
function prefix_add_meta_boxes() {
add_meta_box( 'prefix_other_fields', __('Trạng thái Checkin','woocommerce'), 'prefix_add_other_fields_for_packaging', 'shop_order', 'side', 'core' );
}

Đoạn mã 2: Đăng ký field và hiển thị trường input cho field đó.

function prefix_add_other_fields_for_packaging() {
global $post;
$meta_field_data = get_post_meta( $post->ID, '_checkin_field_slug', true );
if ($meta_field_data === 'checked-in') {
$meta_field_data = 'Đã Check-in';
$background_color = '#79c302'; // set green background color
} else {
$meta_field_data = ''; // reset meta field data to empty string
$background_color = '#ebebeb'; // set gray background color
}
$button_text = empty( $meta_field_data ) ? __( 'Vào Check-in', 'woocommerce' ) : __( 'Hủy Check-in', 'woocommerce' );
echo '<input type="hidden" name="prefix_other_meta_field_nonce" value="' . wp_create_nonce( 'prefix_other_meta_field_nonce' ) . '">
<p class="prefix-field">
<label for="prefix-checkin-field">' . __('', 'woocommerce' ) . '</label>
<input type="text" id="prefix-checkin-field" placeholder="Chưa Checkin" name="checkin_field_name" value="' . esc_attr( $meta_field_data ) . '" readonly style="text-align: center; background-color: ' . $background_color . ';">
<button type="button" class="prefix-checkin-button">' . $button_text . '</button>
</p>';
}

Đoạn mã 3: Lưu thông tin và custom lại css, kèm file js

// Save the data of the Meta field
add_action( 'save_post', 'prefix_save_wc_order_other_fields', 10, 1 );
function prefix_save_wc_order_other_fields( $post_id ) {
    // We need to verify this with the proper authorization (security stuff).
    // Check if our nonce is set.
    if ( ! isset( $_POST['prefix_other_meta_field_nonce'] ) ) {
        return $post_id;
    }

    $nonce = $_POST['prefix_other_meta_field_nonce'];

    //Verify that the nonce is valid.
    if ( ! wp_verify_nonce( $nonce, 'prefix_other_meta_field_nonce' ) ) {
        return $post_id;
    }

    // If this is an autosave, our form has not been submitted, so we don't want to do anything.
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return $post_id;
    }

    // Check the user's permissions.
    if ( 'page' == $_POST['post_type'] ) {
        if ( ! current_user_can( 'edit_page', $post_id ) ) {
            return $post_id;
        }
    } else {
        if ( ! current_user_can( 'edit_post', $post_id ) ) {
            return $post_id;
        }
    }
	
	// Sanitize user input and update the meta field in the database.
	$meta_field_data = isset( $_POST[ 'checkin_field_name' ] ) ? sanitize_text_field( $_POST[ 'checkin_field_name' ] ) : '';

	// Update the meta field in the database
	update_post_meta( $post_id, '_checkin_field_slug', $meta_field_data );
}

// Add Button.
function prefix_add_custom_js() {
    wp_enqueue_script( 'custom-js', get_stylesheet_directory_uri() . '/js/checkin-button.js', array('jquery'), '', true );
}
add_action( 'admin_enqueue_scripts', 'prefix_add_custom_js' );

function prefix_add_custom_styles() {
    wp_enqueue_style( 'custom-styles', get_stylesheet_directory_uri() . '/styles/order-page.css' );
}
add_action( 'admin_enqueue_scripts', 'prefix_add_custom_styles' );

Còn đây là đoạn mã css và js, được lưu theo đường dẫn lần lượt theo /js/checkin-button.js/styles/order-page.css

jQuery(document).ready(function($) {
    $('.prefix-checkin-button').click(function() {
        var $input = $(this).prev('input');
        var hasValue = $input.val() !== '';
        $input.val(hasValue ? '' : 'checked-in');
        $(this).text(hasValue ? 'Vào Check-in' : 'Hủy Check-in');

        // Trigger save function
        $('form#post').submit();
    });
});

Mã css: /styles/order-page.css

.prefix-field {
  display: flex;
  flex-direction: column;
  width: 100%;
  margin-bottom: 1rem;
}

.prefix-field label {
  font-weight: bold;
  margin-bottom: 0.5rem;
}

.prefix-field input[type="text"] {
  border: none;
  border-radius: 4px;
  background-color: #f5f5f5;
  color: white !important;
  padding: 0.5rem;
  font-size: 1rem;
  line-height: 1.5;
  margin-bottom: 0.5rem;
  width: 100%;
}

.prefix-checkin-button {
  background-color: #007cba;
  border: none;
  color: #fff;
  cursor: pointer;
  border-radius: 4px;
  font-size: 1rem;
  font-weight: bold;
  line-height: 1.5;
  padding: 0.5rem;
  text-align: center;
  text-decoration: none;
  transition: background-color 0.2s ease-in-out;
  width: 100%;
}

.prefix-checkin-button:hover {
  background-color: #005c8a;
}

.prefix-field input[type=text] {
    background-color: gray;
    color: #fff;
}

.prefix-field input[type=text][value="checked-in"] {
    background-color: green;
}

/* START CSS for order list style */
/* Button Style */
button.update-custom-field {
  background-color: #4CAF50; /* Green */
  border: none;
  color: white;
  padding: 8px 16px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 16px;
  margin: 4px 2px;
  cursor: pointer;
  border-radius: 4px;
}

/* Hover effect */
button.update-custom-field:hover {
  background-color: #3e8e41;
}

/* END CSS for order list style */

À, thêm đoạn mã này để update nữa.

// Handle the custom field update
add_action( 'wp_ajax_update_custom_field', 'update_custom_field' );
add_action( 'wp_ajax_nopriv_update_custom_field', 'update_custom_field' );
function update_custom_field() {
    if ( isset( $_POST['order_id'] ) && isset( $_POST['custom_field_value'] ) ) {
        $order_id = intval( $_POST['order_id'] );
        $custom_field_value = sanitize_text_field( $_POST['custom_field_value'] );
        update_post_meta( $order_id, '_checkin_field_slug', $custom_field_value );
		
        wp_die();
    }
}

Cơ bản như vậy, bài viết này dành cho những ai có kiến thức về phát triển sản phẩm. Nếu bạn chưa có kiến thức đó thì có thể liên hệ với Cú Đêm để được chúng tôi hỗ trợ.

Bài viết này hữu ích với bạn chứ?
Có hữu íchKhông, quá tệ :(

Thẻ bài viết

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest

0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận