1. Chặn spam view bằng REST nonce — tuỳ chọn, không ép buộc
Một trong những vấn đề dai dẳng với plugin đếm view là spam request: bot hoặc script gửi POST trực tiếp đến /wp-json/initvico/v1/count mà không cần mở trang, bypass hoàn toàn cơ chế scroll + delay 15 giây. Từ 1.21, admin có thể bật tuỳ chọn “Require REST nonce verification?” trong Settings → Init View Count để yêu cầu mọi request đến endpoint /count phải kèm header X-WP-Nonce hợp lệ.
Điểm quan trọng: tuỳ chọn này mặc định TẮT. Lý do rất thực tế: nonce của WordPress hết hạn sau khoảng 12–24 giờ. Nếu site bạn dùng full-page caching (LiteSpeed, WP Rocket, Cloudflare APO…) với TTL dài, trang cache cũ sẽ mang theo nonce đã hết hạn. Khi đó, request đếm view từ ngườ dùng thật cũng bị từ chối 403 cho đến khi cache refresh. Plugin chỉ in nonce ra wp_localize_script() khi admin bật tuỳ chọn — khi tắt, không có overhead nào về mặt code hay request.
Endpoint GET /top được loại trừ cố ý khỏi cơ chế này vì nó chỉ đọc dữ liệu công khai (danh sách bài viết xem nhiều), không có nguy cơ spam ghi.
2. Tối ưu hiệu năng: từ read-then-write sang atomic SQL
Trước 1.20, mỗi lượt view được xử lý theo chuỗi: get_post_meta() đọc giá trị → update_post_meta() ghi giá trị + 1. Trong điều kiện traffic cao, hai request cùng đọc giá trị 100, cùng ghi 101 — kết quả chỉ tăng 1 thay vì 2. Đây là race condition cổ điển.
Từ 1.20, plugin chuyển sang dùng câu lệnh SQL thuần:
UPDATE wp_postmeta SET meta_value = meta_value + 1 WHERE post_id = ? AND meta_key = ?
Câu lệnh này atomic ở tầng database — MySQL đảm bảo không có hai transaction nào đọc cùng một giá trị cũ rồi ghi đè lên nhau. Kết quả: chính xác 100% ngay cả khi 100 request đồng thời trúng cùng một post.
Bên cạnh đó, plugin còn tối ưu ba điểm nữa:
- Giá trị trả về client được tính cục bộ (
cached value + 1) thay vì query lại database sau khi ghi, tiết kiệm 1 SELECT mỗi key. - Object cache invalidate chỉ chạy 1 lần/post/request sau khi tất cả key (total, day, week, month) đã cập nhật xong, thay vì 4 lần.
- Traffic Shape Learner (module học phân phối traffic theo giờ/ngày) giờ buffer số lượt view trong suốt request rồi flush đúng 1 lần trên hook
shutdown, thay vìget_option()/update_option()cho mỗi post trong batch.
Với site dùng batch tracking (gộp 5–10 view trước khi gửi), số lần ghi option giảm đáng kể — đặc biệt hữu ích cho site có lượng traffic lớn.
3. i18n hoàn chỉnh: POT + PO/MO tiếng Việt
Phiên bản 1.21 bổ sung các chuỗi tiếng Anh nguồn còn thiếu vào file languages/init-view-count.pot, bao gồm hai chuỗi quan trọng trong REST API: "Invalid post ID." và "Not enabled for view counting.". Đồng thời, bản dịch tiếng Việt (init-view-count-vi.po / .mo) đã được chuẩn bị sẵn, giúp site Việt Nam hiển thị thông báo lỗi và giao diện admin hoàn toàn bằng tiếng mẹ đẻ.
4. Củng cố code path REST API
Toàn bộ code path REST API đã được rà soát lại với chuẩn WPCS (WordPress Coding Standards). Các truy vấn SQL trực tiếp đều có ghi chú phpcs:ignore kèm lý do chi tiết, giúp team review code và các công cụ CI/CD hiểu rõ tại sao cần bypass quy tắc. Không có thay đổi hành vi đối với các filter/action hiện có — toàn bộ hook cũ vẫn hoạt động bình thường.
Có nên cập nhật ngay?
Có. 1.21 là bản hotfix + tối ưu, không phá vỡ tương thích ngược. Các site đang dùng 1.19 có thể update trực tiếp qua WordPress Dashboard hoặc upload thủ công. Lưu ý duy nhất: nếu bạn bật “Require REST nonce verification?”, hãy đảm bảo full-page cache của site có TTL dưới 12 giờ, hoặc cấu hình purge cache định kỳ.
Init View Count 1.21 hiện đã có sẵn trên kho plugin WordPress và repository GitHub chính thức. Changelog đầy đủ và hướng dẫn nâng cấp chi tiết có trong trang Settings của plugin.
Bình luận