Nhập liệu website với AI?
Hôm nay mình muốn kể cho mọi người nghe một câu chuyện về cách mình giải quyết một vấn đề khá đau đầu trong công việc gần đây. Không phải kiểu dự án hoành tráng hay công nghệ gì cao siêu, mà là câu chuyện về việc phải xoay xở khi mọi con đường "chính thống" đều bị chặn.
Bối cảnh: Khi mọi thứ đều không như ý
Khách hàng của mình có một website bán hàng đã hoạt động được vài năm. Nội dung khá nhiều sản phẩm với đầy đủ mô tả, hình ảnh, phân loại theo danh mục. Đã vậy website này dùng CPT và ACF nhiều, nên data rất da dạng. Giờ họ cần chuyển toàn bộ nội dung này sang một website mới.
Nghe qua thì đơn giản. Ai làm WordPress cũng biết có hàng tá plugin để làm việc này - All-in-One Migration, WP Import/Export, hay đơn giản là dùng chính tính năng xuất nhập có sẵn của WordPress. Cài plugin, bấm vài nút, đợi một lúc là xong.
Nhưng thực tế lại không dễ như vậy.
Vấn đề thứ nhất: Website cũ bị nhiễm mã độc. Không biết từ bao giờ, nhưng khi kiểm tra thì thấy có những đoạn mã lạ được chèn vào nhiều file. Nếu xuất dữ liệu từ website này, rất có thể mã độc sẽ theo sang website mới.
Vấn đề thứ hai: Website mới do bộ phận kỹ thuật của tập đoàn thiết lập và quản lý. Họ áp dụng chính sách bảo mật khá chặt - tài khoản của mình chỉ được phân quyền biên tập viên, không thể cài đặt plugin hay truy cập vào các thiết lập hệ thống.
Tóm lại: nguồn dữ liệu thì chưa chuẩn, đích đến thì bị khóa quyền. Hai vấn đề cùng lúc. Và sau khi cân nhắc một hồi lâu giữa việc:
Tốn 2 ngày để ngồi copy-paste dữ liệu bằng tay, hay tốn 3 ngày để viết chương trình rồi mới nhập liệu trong 3 tiếng?
Mình ngồi suy nghĩ về những gì mình CÓ THỂ làm được:
- Truy cập vào trang quản trị WordPress với quyền biên tập viên
- Tạo bài viết mới, điền thông tin vào các trường
- Tải ảnh lên thư viện media
- Chọn danh mục, thẻ cho bài viết
Tất cả những việc này đều làm được thủ công. Vấn đề là số lượng - hàng trăm sản phẩm, mỗi sản phẩm có cả chục trường thông tin và nhiều ảnh. Làm tay thì... cũng được, nhưng sẽ mất rất nhiều thời gian và dễ sai sót.
Và mình xử lý tuần tự như sau
Bước 1: Làm sạch dữ liệu nguồn
Trước khi nghĩ đến chuyện chuyển dữ liệu, mình cần có bộ dữ liệu sạch đã. Mình quyết định dọn dẹp website cũ trước.
Trước đây mình có kinh nghiệm xử lý, nhưng phải làm tay cấc bước xử lý malware, nhưng giờ đây có AI ròi thì mình xài thôi. Mình dùng nó để quét qua toàn bộ mã nguồn của website, so sánh với phiên bản gốc của WordPress và các plugin để tìm ra những file bị chỉnh sửa hoặc những file lạ được thêm vào.
Công việc này nếu làm thủ công sẽ mất rất nhiều thời gian - phải tải mã nguồn gốc của từng plugin, tải bản core WordPress về rồi replace. Nhưng với Claude Code, mình mô tả mong muốn của mình, nó bắt đầu scan và làm các phần việc đó tự động.
Nhu cầu là chỉ làm sạch những thứ có thể xác minh được. Cụ thể là core WordPress và các plugin miễn phí - những thứ có mã nguồn công khai để đối chiếu. Còn những plugin trả phí hoặc được viết riêng cho khách hàng thì mình không đụng vào, vì không có cơ sở để biết đâu là mã gốc, đâu là mã độc, và dĩ nhiên là không có nguồn để tải lại.
Sau khi dọn dẹp xong, mình cài đặt lại website trên local để kiểm tra. Mọi thứ hoạt động bình thường. Bước tiếp theo là vào admin xuất dữ liệu ra file XML - định dạng chuẩn mà WordPress hỗ trợ.
Bước 2: Tìm cách đưa dữ liệu vào website mới
Giờ mình đã có file dữ liệu sạch. Nhưng làm sao để đưa vào website mới khi không thể cài plugin?
Rồi mình nghĩ đến: nếu không thể cài gì vào phía máy chủ, thì cài ở phía trình duyệt thì sao?
Tiện ích mở rộng của trình duyệt (browser extension) hoạt động hoàn toàn ở phía người dùng. Nó có thể đọc và tương tác với giao diện web, điền thông tin vào các ô nhập liệu, bấm nút - y như một người dùng thật đang thao tác. Và quan trọng là: không cần bất kỳ quyền gì đặc biệt trên máy chủ.
Bước 3: Viết tiện ích mở rộng với sự hỗ trợ của Claude Code
Mình bắt đầu mô tả yêu cầu cho Claude. Không phải kiểu "viết cho tôi một extension" rồi ngồi chờ, mà là một quá trình trao đổi qua lại.
Đầu tiên, mình cần chuyển đổi file XML thành định dạng dễ xử lý hơn. Claude Code viết một đoạn mã để phân tích file XML, trích xuất thông tin của từng sản phẩm và lưu thành file JSON. Đồng thời, nó cũng tạo ra cấu trúc thư mục cho hình ảnh - mỗi sản phẩm một thư mục riêng, đặt tên theo tên sản phẩm.
Cấu trúc thư mục này rất quan trọng. Vì việc tải ảnh lên mình quyết định làm thủ công (giải thích sau), nên cần một cách tổ chức để dễ tìm. Khi cần ảnh của sản phẩm nào, chỉ cần mở thư mục có tên tương ứng là thấy ngay.
Tiếp theo là viết bản thân tiện ích mở rộng. Giao diện khá đơn giản:
- Một nút để tải file JSON chứa danh sách sản phẩm
- Danh sách các sản phẩm với trạng thái (đã nhập hay chưa)
- Ô tìm kiếm để lọc nhanh
- Nút để bắt đầu điền thông tin cho từng sản phẩm
Phần phức tạp hơn là làm sao để tiện ích biết điền thông tin vào đâu trên giao diện trang quản trị. Mỗi website có cấu trúc khác nhau - trường này nằm ở vị trí này, trường kia có tên khác. Mình không thể viết cứng vào mã nguồn được.
Giải pháp là tạo một chế độ "cấu hình". Khi bật chế độ này, mình có thể di chuột qua các trường trên giao diện - chúng sẽ được tô sáng. Bấm vào trường nào thì tiện ích sẽ ghi nhớ vị trí của trường đó và liên kết với dữ liệu tương ứng. Quá trình này chỉ cần làm một lần cho mỗi website.
Có một chi tiết kỹ thuật khiến mình mất khá nhiều thời gian: một số trường trên WordPress dùng trình soạn thảo văn bản giàu tính năng (TinyMCE). Những trường này không phải ô nhập liệu thông thường, mà là một khung nội dung được nhúng vào trang. Việc điền dữ liệu vào đây đòi hỏi cách xử lý riêng.
Khi mình gặp vấn đề với TinyMCE, mình mô tả lại vấn đề - điền vào không hiển thị, hoặc hiển thị nhưng không lưu được. Claude phân tích và đề xuất cách xử lý: phải vừa điền vào ô textarea ẩn phía sau, vừa cập nhật nội dung trong trình soạn thảo. Sau vài lần thử và chỉnh sửa, cuối cùng cũng hoạt động được.
Về việc tải ảnh thủ công
Có người sẽ hỏi: sao không tự động hóa luôn việc tải ảnh?
Mình đã cân nhắc. Về mặt kỹ thuật, hoàn toàn có thể làm được. Tiện ích mở rộng có thể mô phỏng việc kéo thả file vào thư viện media của WordPress?
Nhưng có vài lý do mình chọn làm thủ công:
Thứ nhất, độ phức tạp tăng lên đáng kể. Phải xử lý nhiều trường hợp - ảnh tải lên thành công, ảnh bị lỗi, ảnh trùng tên, chờ ảnh tải xong mới được làm tiếp... Thời gian để xử lý hết các trường hợp này có khi còn nhiều hơn thời gian tải thủ công.
Thứ hai, với cấu trúc thư mục đã sắp xếp sẵn, việc tải thủ công thực ra rất nhanh. Mở thư mục theo tên sản phẩm, kéo thả tất cả ảnh vào, xong. Mỗi sản phẩm mất khoảng một phút.
Thứ ba, tải thủ công cho phép mình kiểm tra ảnh trong quá trình làm. Có những ảnh bị lỗi, bị mờ, hoặc không còn phù hợp - mình có thể phát hiện và xử lý ngay thay vì để hệ thống tự động tải lên hết rồi sau này mới phát hiện.
Đây là bài học mình rút ra được: không phải lúc nào tự động hóa 100% cũng là lựa chọn tốt nhất. Đôi khi, tự động hóa 80% và để 20% còn lại làm thủ công lại hiệu quả hơn về tổng thể.
Tản mạn chút về ứng dụng AI
Qua dự án này và bài viết, mình muốn truyền đạt thông điệp: Claude Code (hay các công cụ AI tương tự) không phải là thứ để "thay thế" công việc của mình. Nó giống như một đồng nghiệp có khả năng code rất nhanh, nhưng cần mình định hướng và kiểm tra.
Quy trình làm việc của mình với AI thường như sau:
Mình mô tả vấn đề đang gặp phải, không chỉ là "làm cái này" mà còn giải thích tại sao cần làm, bối cảnh xung quanh là gì. AI sẽ đề xuất hướng giải quyết. Mình xem xét, đặt câu hỏi nếu có chỗ chưa hiểu hoặc chưa đồng ý. Sau khi thống nhất hướng đi, nó viết code, mình chạy thử. Gặp lỗi hoặc cần điều chỉnh thì phản hồi lại, nó sửa. Cứ như vậy cho đến khi hoàn thành.
Điều quan trọng là ngữ cảnh. Claude cần nhớ những gì đã trao đổi trước đó trong cùng một phiên làm việc. Nên khi gặp vấn đề mới liên quan đến những gì đã làm, mình không cần giải thích lại từ đầu. Nó hiểu cấu trúc mã nguồn đang làm việc, hiểu những quyết định đã đưa ra trước đó.
Cái tiện ích mở rộng mình làm trong dự án này đã trải qua nhiều lần chỉnh sửa. Từ phiên bản đầu chỉ điền được văn bản thuần túy, đến phiên bản xử lý được trình soạn thảo TinyMCE, rồi thêm chế độ cấu hình, thêm tính năng tạm dừng khi đang chọn trường... Mỗi lần gặp vấn đề thực tế khi sử dụng là một lần quay lại chỉnh sửa.
Kết lại
Câu chuyện này không có gì cao siêu về mặt công nghệ. Không có trí tuệ nhân tạo phân tích dữ liệu, không có thuật toán phức tạp. Chỉ là một tiện ích mở rộng đọc file JSON và điền thông tin vào biểu mẫu trên web.
Nhưng nó giải quyết được một vấn đề thực tế mà các giải pháp "chuẩn" không làm được. Khi không thể cài plugin lên máy chủ, mình chuyển sang làm ở phía trình duyệt. Khi tự động hóa hoàn toàn quá phức tạp, mình chọn tự động hóa một phần và làm thủ công phần còn lại.
Và đó là cách mình nghĩ về việc ứng dụng công cụ AI vào công việc hàng ngày: không phải để thay thế tư duy hay sự sáng tạo, mà để mở rộng khả năng thực hiện những giải pháp mà mình nghĩ ra. Mình vẫn là người định hướng, ra quyết định, kiểm tra kết quả. Công cụ AI giúp mình làm nhanh hơn những việc mình đã biết cách làm, và đôi khi, gợi ý những hướng đi mình chưa nghĩ tới.
Nếu bạn có câu hỏi hoặc muốn trao đổi thêm về chủ đề này, hãy để lại bình luận hoặc liên hệ trực tiếp với mình nhé