VPS

Dọn code AI sinh trong WordPress cho gọn lại

Thanh Nguyễn Đăng 9 phút đọc 5 khối lệnh

Dọn code AI sinh trong WordPress cho gọn lại
Mục lục bài viết
  1. Vì sao code AI sinh hay phình
  2. Kiểu một: hàm trùng chức năng
  3. Kiểu hai: truy vấn lặp trong vòng lặp
  4. Kiểu ba và bốn: tùy chọn rời rạc và tài nguyên nạp thừa
  5. Quy trình dọn an toàn
  6. Bốn kiểu phình hay gặp và cách nhận ra
  7. Đo trước khi dọn
  8. Sao lưu và dọn trên bản thử trước
  9. Vì sao mã do công cụ tự động sinh hay phình
  10. Câu hỏi thường gặp
  11. Bài viết liên quan

Trả lời nhanh: Code do agent sinh cho một WordPress plugin chạy được nhưng thường phình theo thời gian, vì mỗi lần bạn yêu cầu thêm chức năng nó lại viết một khối mới thay vì dùng lại khối đã có. Năm kiểu rác hay gặp: hàm trùng chức năng, truy vấn lặp lại trong vòng lặp, tùy chọn lưu rời rạc, tài nguyên nạp ở mọi trang, và đoạn kiểm tra thừa. Dọn theo thứ tự đó, và sau mỗi bước phải thử lại luồng chính chứ đừng dọn một mạch.

Plugin viết cùng agent thường qua ba giai đoạn: tuần đầu chạy tốt và ai cũng vui, tháng thứ hai bắt đầu có chỗ trùng nhau, tháng thứ tư thì không ai dám sửa vì không biết đụng vào đâu sẽ hỏng chỗ nào. Bài này nói về việc dọn ở giai đoạn hai, lúc còn dễ.

Vì sao code AI sinh hay phình

Không phải vì mô hình viết code dở, mà vì cách bạn làm việc với nó. Mỗi yêu cầu thường là một phiên riêng, và trong phiên đó agent chỉ thấy phần ngữ cảnh bạn đưa. Nó không nhớ rằng tháng trước đã viết một hàm gần y hệt ở file khác.

Hệ quả là plugin có ba hàm cùng lấy danh sách sản phẩm với ba cách khác nhau, hai hàm cùng làm sạch cùng một loại dữ liệu, và vài đoạn kiểm tra quyền được chép qua lại.

Có hai cách phòng, nên làm cả hai. Thứ nhất, ghi vào file quy ước rằng phải tìm hàm sẵn có trước khi viết hàm mới, theo bài CLAUDE.md. Thứ hai, định kỳ chạy một phiên riêng chỉ để rà trùng lặp, theo cách tách việc ở bài về subagent.

Kiểu một: hàm trùng chức năng

Dấu hiệu: nhiều hàm có tên khác nhau nhưng thân giống tới tám mươi phần trăm.

CodeKiểu một: hàm trùng chức năngjavascript
// Ba ham cung lam mot viecfunction lay_san_pham_moi() { ... }function get_products_recent() { ... }function danh_sach_sp_moi_nhat() { ... }

Cách dọn an toàn: giữ lại hàm được gọi nhiều nhất, thêm tham số cho các trường hợp riêng, rồi chuyển từng chỗ gọi một, thử lại sau mỗi lần chuyển. Đừng xóa hai hàm kia ngay, hãy để chúng gọi vào hàm chính một thời gian rồi mới bỏ hẳn ở lần dọn sau.

Cách này chậm hơn nhưng tránh được tình huống kinh điển: xóa một hàm tưởng là không ai dùng, rồi phát hiện nó được gọi từ một mẫu giao diện mà tìm kiếm thông thường không thấy.

Kiểu hai: truy vấn lặp trong vòng lặp

Đây là kiểu gây chậm rõ nhất và cũng dễ nhận nhất khi bạn biết cần tìm gì:

TerminalKiểu hai: truy vấn lặp trong vòng lặpbash
// Sai: moi vong lap mot lan hoi databaseforeach ($ids as $id) {    $gia = get_post_meta($id, '_gia', true);} // Dung: nap truoc mot lanupdate_meta_cache('post', $ids);foreach ($ids as $id) {    $gia = get_post_meta($id, '_gia', true);  // lay tu bo nho dem}

Trên trang có hai chục sản phẩm, kiểu sai gây ra hàng chục truy vấn thừa cho mỗi lần tải trang. Cách phát hiện nhanh là bật công cụ đếm truy vấn rồi so số truy vấn giữa trang có ít và nhiều sản phẩm: con số tăng theo số phần tử là dấu hiệu chắc chắn.

Khi trang chậm mà bạn chưa rõ nghẽn ở đâu, hãy đi theo thứ tự chẩn đoán trong bài WordPress chậm thay vì đoán.

Kiểu ba và bốn: tùy chọn rời rạc và tài nguyên nạp thừa

Tùy chọn rời rạc. Agent hay lưu mỗi thiết lập thành một bản ghi riêng, nghĩa là mỗi lần tải trang phải đọc nhiều bản ghi thay vì một.

TerminalKiểu ba và bốn: tùy chọn rời rạc và tài nguyên nạp thừabash
// Truoc: nhieu tuy chon roiget_option('plugin_toi_mau_nen');get_option('plugin_toi_so_cot'); // Sau: gom thanh mot$cai_dat = get_option('plugin_toi_cai_dat', []);

Khi gộp, nhớ viết đoạn chuyển dữ liệu cũ sang cấu trúc mới và chạy một lần khi plugin cập nhật, nếu không người dùng cũ mất hết thiết lập.

Tài nguyên nạp ở mọi trang. File CSS và JavaScript của plugin thường được nạp toàn site dù chỉ cần ở một trang quản trị. Kiểm tra ngữ cảnh trước khi nạp:

TerminalKiểu ba và bốn: tùy chọn rời rạc và tài nguyên nạp thừabash
add_action('admin_enqueue_scripts', function ($trang) {    if ($trang !== 'toplevel_page_plugin-toi') return;    wp_enqueue_script('plugin-toi', ...);});

Việc này không chỉ nhanh hơn mà còn tránh xung đột với plugin khác, nguyên nhân của rất nhiều lỗi giao diện khó hiểu trong trang quản trị.

Quy trình dọn an toàn

Thứ tự làm, và đừng đảo:

  1. Sao lưu trước. Cả mã nguồn lẫn database.
  2. Dựng bản nháp theo bài dựng WordPress staging, dọn ở đó chứ không dọn trên trang thật.
  3. Ghi danh sách luồng phải chạy được trước khi bắt đầu: xem trang, tìm kiếm, thêm giỏ hàng, thanh toán, các trang quản trị của plugin.
  4. Dọn từng kiểu một, sau mỗi kiểu chạy lại toàn bộ danh sách ở bước ba.
  5. Ghi lại từng thay đổi để khi có lỗi bạn biết quay lui tới đâu.

Có thể giao phần tìm kiếm cho agent, nhưng hãy giao dưới dạng chỉ đọc: bảo nó liệt kê các hàm nghi trùng kèm đường dẫn và số dòng, rồi bạn tự quyết định gộp cái nào. Để nó vừa tìm vừa sửa hàng loạt là cách nhanh nhất tạo ra một plugin hỏng theo kiểu khó lần ra.

Bốn kiểu phình hay gặp và cách nhận ra

KiểuDấu hiệuHậu quả
Hàm trùng chức năngHai ba hàm làm cùng một việc, tên khác nhauSửa một chỗ, hai chỗ kia vẫn sai
Truy vấn trong vòng lặpVòng lặp gọi hàm lấy dữ liệu ở mỗi vòngMột trang sinh hàng trăm truy vấn
Tùy chọn rời rạcMỗi thiết lập lưu thành một mục riêngMỗi lượt tải trang đọc thêm hàng chục mục
Tài nguyên nạp trên mọi trangTệp kiểu dáng và mã nạp cả ở nơi không dùngTrang nặng thêm không cần thiết

Đo trước khi dọn

TerminalĐo trước khi dọnbash
# 1. Dem so truy van moi luot tai trang#    Bat che do go loi va dung mot plugin do truy van#    Trang binh thuong: duoi 100 truy van. Tren 200 la co van de. # 2. Tim tuy chon tu tai moi luot tai trangmysql -e "SELECT ROUND(SUM(LENGTH(option_value))/1024/1024,2) mb_autoload  FROM wp_options WHERE autoload='yes';"mysql -e "SELECT option_name, LENGTH(option_value) len FROM wp_options  WHERE autoload='yes' ORDER BY len DESC LIMIT 20;" # 3. Tim ham trung chuc nang trong plugin cua bangrep -rn "^function \|public function " wp-content/plugins/plugin-cua-ban/ | wc -l # 4. Xem tai nguyen nao dang nap tren moi trang#    Mo cong cu nha phat trien cua trinh duyet, the Network

Sao lưu và dọn trên bản thử trước

  1. Sao lưu cơ sở dữ liệu và mã nguồn, và kiểm tệp sao lưu mở được.
  2. Dọn trên môi trường thử trước, không dọn thẳng trên trang thật.
  3. Dọn từng kiểu một, kiểm sau mỗi bước. Dọn cả bốn kiểu cùng lúc rồi trang vỡ thì không biết do đâu.
  4. Đo lại sau mỗi bước: số truy vấn, thời gian tải, dung lượng tùy chọn tự tải.
  5. Chạy trọn luồng nghiệp vụ sau khi dọn, nhất là luồng đặt hàng và thanh toán.

Vì sao mã do công cụ tự động sinh hay phình

Công cụ tự động viết theo từng yêu cầu riêng lẻ và không nhớ hết những gì đã viết trước đó, nên khi bạn nhờ thêm một chức năng gần giống, nó viết hàm mới thay vì dùng lại hàm cũ. Sau vài chục lần yêu cầu, plugin có nhiều hàm làm cùng một việc.

Cách phòng hiệu quả nhất: viết vào tệp luật của dự án rằng phải đọc mã hiện có trước khi tạo hàm mới, và không được tạo tệp mới khi sửa được tệp sẵn có. Xem bài về viết tệp luật.

Câu hỏi thường gặp

Có nên để agent tự dọn code không?

Nên để nó tìm và đề xuất, không nên để nó tự sửa hàng loạt. Việc tìm hàm trùng và truy vấn lặp nó làm rất nhanh, nhưng quyết định gộp cái nào cần hiểu nghiệp vụ mà nó không có.

Dọn code có làm trang nhanh lên rõ không?

Rõ nhất là khi bạn bỏ được truy vấn lặp trong vòng lặp và cắt tài nguyên nạp thừa. Hai việc đó thường đủ để thấy khác biệt. Gộp hàm trùng chủ yếu giúp dễ bảo trì hơn là nhanh hơn.

Bao lâu nên dọn một lần?

Mỗi khi bạn thêm chức năng lớn, hoặc mỗi quý một lần với plugin đang phát triển đều. Dọn sớm thì mỗi lần chỉ mất một buổi; để tích tụ nửa năm thì việc dọn trở thành viết lại.

Làm sao biết một hàm còn được dùng không?

Tìm trong toàn bộ mã nguồn gồm cả mẫu giao diện và các file trong thư mục con, và nhớ rằng WordPress còn gọi hàm gián tiếp qua hook nên hãy tìm cả tên hàm trong chuỗi. An toàn nhất là để hàm cũ gọi vào hàm mới một thời gian rồi mới xóa.

Chia sẻ:Facebook

Thanh Nguyễn

TND

Tư vấn bản quyền, VPS và máy chủ kèm hóa đơn VAT, hợp đồng đầy đủ cho doanh nghiệp.