Mô tả
Init Review System thêm hệ thống đánh giá 5 sao gọn gàng và có thể tùy chỉnh vào trang WordPress của bạn. Lượt bình chọn được lưu qua REST API, theo dõi bằng localStorage, và điểm trung bình được tự động tính toán, có thể hiển thị kèm mã schema.
Được xây dựng để nhẹ, thân thiện với lập trình viên, và dễ tích hợp vào bất kỳ theme hay giao diện tùy chỉnh nào. Giờ đây có thêm đánh giá đa tiêu chí, hệ thống cảm xúc emoji giúp tương tác người dùng phong phú hơn, hỗ trợ Block Editor gốc, và tích hợp Abilities API chỉ đọc cho WordPress 6.9+.
Plugin này là một phần của Init Plugin Suite — bộ sưu tập các công cụ WordPress tối giản, nhanh, và hướng tới lập trình viên.
Kho GitHub: https://github.com/brokensmile2103/init-review-system
Điểm nổi bật:
- MỚI: Hỗ trợ Block Editor (Gutenberg) — 4 block, mỗi block tương ứng một shortcode
- MỚI: Hỗ trợ Abilities API (WordPress 6.9+) — 3 ability chỉ đọc
- Bình chọn 5 sao qua frontend
- Hỗ trợ đánh giá đa tiêu chí
- Cảm xúc Emoji yêu cầu đăng nhập
- Hiển thị điểm trung bình
- Tùy chọn bắt buộc đăng nhập
- Tùy chọn kiểm tra IP nghiêm ngặt
- REST API để gửi lượt bình chọn
- Schema JSON-LD cho SEO
- Hoạt động với mọi loại bài viết
- Giao diện tối giản, tương thích tốt với theme
Tính năng
- Các block Block Editor (Gutenberg): Review Score, Review Widget, Review Criteria, Reactions Bar — mỗi block đều có bản xem trước trực tiếp phía server ngay trong trình soạn thảo
- Abilities API (WordPress 6.9+): điểm đánh giá, đánh giá theo tiêu chí, và tổng hợp cảm xúc được công khai dưới dạng ability có thể phát hiện và thực thi qua
wp_get_abilities()và REST namespacewp-abilities/v1 - Hệ thống đánh giá 5 sao
- Chấm điểm đánh giá đa tiêu chí (tối đa 5 tiêu chí tùy chỉnh)
- Thanh cảm xúc dựa trên emoji với số lượng cập nhật trực tiếp (yêu cầu đăng nhập)
- Endpoint REST API cho cảm xúc:
/wp-json/initrsys/v1/reactions/toggle - Cảm xúc được lưu trong cả post meta lẫn bảng ánh xạ người dùngbài viết riêng biệt
- Sẵn sàng cho khả năng truy cập với cập nhật
aria-pressed+aria-live - Tích hợp dựa trên shortcode
- Tự động chèn khối trước/sau nội dung hoặc bình luận
- Tùy chọn đăng nhập + kiểm tra IP để ngăn lạm dụng
- Endpoint REST API:
/wp-json/initrsys/v1/vote - Filter cho lập trình viên và kiến trúc có thể mở rộng
- Không dùng jQuery, chỉ tải tài nguyên tối thiểu khi cần
Block Editor (Gutenberg)
Bốn block động có sẵn trong danh mục Init Review System riêng trong trình chèn block — không cần dùng shortcode nếu bạn thích làm việc hoàn toàn trong trình soạn thảo:
- Review Score — tương đương với
[init_review_score] - Review Widget — tương đương với
[init_review_system] - Review Criteria — tương đương với
[init_review_criteria] - Reactions Bar — tương đương với
[init_reactions]
Mỗi block dùng chung chính xác mã hiển thị với shortcode tương ứng, nên việc chuyển đổi giữa Block Editor và shortcode không bao giờ làm thay đổi kết quả hiển thị. Các thiết lập của block ánh xạ trực tiếp tới thuộc tính shortcode, và bản xem trước trực tiếp (qua wp.serverSideRender) được hiển thị ngay trong trình soạn thảo khi bạn cấu hình.
Abilities API (WordPress 6.9+)
Trên WordPress 6.9 trở lên, Init Review System đăng ký ba ability chỉ đọc trong danh mục init-review-system:
init-review-system/get-review-score— điểm trung bình và số lượt bình chọn của một bài viếtinit-review-system/get-criteria-reviews— chi tiết theo tiêu chí và một trang đánh giá bằng văn bản của một bài viếtinit-review-system/get-reactions-summary— số lượng cảm xúc emoji của một bài viết
Các ability này có thể được phát hiện và thực thi qua PHP (wp_get_abilities()), và — với các site chọn công khai nó — qua REST namespace wp-abilities/v1. Các hành động ghi dữ liệu (bình chọn, gửi đánh giá, bật/tắt cảm xúc) chủ ý không được công khai dưới dạng ability, vì một ability có thể bị AI agent hoặc công cụ tự động phát hiện và gọi trực tiếp — việc bình chọn/đánh giá/thả cảm xúc thay mặt người truy cập không bao giờ nên xảy ra nếu không có hành động thực sự, trong ngữ cảnh của chính người đó. Tích hợp này hoàn toàn tùy chọn: trên các phiên bản WordPress cũ hơn 6.9, nó sẽ không làm gì cả và phần còn lại của plugin không bị ảnh hưởng.
Cách sử dụng
[init_review_system]
Hiển thị khối bình chọn 5 sao tương tác.
Thuộc tính:
– id: ID bài viết (mặc định: bài viết hiện tại)
– class: Lớp CSS tùy chỉnh
– schema: true|false – Xuất mã schema JSON-LD
[init_review_score]
Hiển thị điểm trung bình (chỉ đọc).
Thuộc tính:
– id: ID bài viết (mặc định: bài viết hiện tại)
– icon: true|false – Hiện biểu tượng sao (mặc định: false)
– sub: true|false – Hiện chữ phụ /5 (mặc định: true)
– show_count: true|false – Hiện số lượt bình chọn (mặc định: false)
– class: Lớp CSS tùy chỉnh (hỗ trợ nhiều lớp cách nhau bằng dấu cách)
– hide_if_empty: true|false – Ẩn nếu không có đánh giá (mặc định: false)
[init_review_criteria]
Hiển thị khối đánh giá đa tiêu chí.
Thuộc tính:
– id: ID bài viết (mặc định: bài viết hiện tại)
– class: Lớp CSS tùy chỉnh
– schema: true|false – Xuất mã schema (mặc định: false)
– per_page: Số đánh giá hiển thị (mặc định: 0 = tất cả)
– paged: Số trang đánh giá hiện tại (mặc định: 1)
[init_reactions]
Hiển thị thanh cảm xúc emoji bên dưới bài viết.
Thuộc tính:
– id: ID bài viết (mặc định: bài viết hiện tại)
– class: Lớp CSS tùy chỉnh
– require_login: Luôn là true (bắt buộc đăng nhập)
Filter dành cho lập trình viên
Plugin này cung cấp các filter và action để lập trình viên tùy chỉnh hành vi tự động chèn, kết quả xuất schema, quyền đánh giá, và logic REST API.
init_plugin_suite_review_system_auto_insert_enabled_score
Bật hoặc tắt việc tự động xuất điểm số (trước/sau nội dung).
Áp dụng cho: Bộ lọc frontend
Tham số: bool $enabled, string $position, string $post_type
init_plugin_suite_review_system_auto_insert_enabled_vote
Bật hoặc tắt việc tự động chèn khối bình chọn.
Áp dụng cho: Bộ lọc frontend
Tham số: bool $enabled, string $position, string $post_type
init_plugin_suite_review_system_default_score_shortcode
Thay đổi shortcode mặc định dùng để tự động chèn điểm số.
Áp dụng cho: Frontend
Tham số: string $shortcode
init_plugin_suite_review_system_default_vote_shortcode
Thay đổi shortcode mặc định dùng để tự động chèn khối bình chọn.
Áp dụng cho: Frontend
Tham số: string $shortcode
init_plugin_suite_review_system_require_login
Bắt buộc đăng nhập để gửi đánh giá, ngay cả khi tùy chọn này đã tắt trong cài đặt.
Áp dụng cho: REST /submit-criteria-review
Tham số: bool $require_login
init_plugin_suite_review_system_min_len_for_ws_check
Điều chỉnh ngưỡng độ dài tối thiểu để kích hoạt kiểm tra không có khoảng trắng.
Áp dụng cho: Backend + kiểm tra sơ bộ bằng JS
Tham số: int $threshold (mặc định 20)
init_plugin_suite_review_system_repetition_threshold
Điều chỉnh ngưỡng lặp từ để phát hiện tình trạng lặp từ quá mức.
Áp dụng cho: Backend + kiểm tra sơ bộ bằng JS
Tham số: int $threshold (mặc định 8)
init_plugin_suite_review_system_schema_type
Tùy chỉnh loại schema.org (ví dụ: Book, Product, Course).
Áp dụng cho: Kết quả xuất ra của shortcode
Tham số: string $type, string $post_type
init_plugin_suite_review_system_schema_data
Chỉnh sửa mảng dữ liệu xuất ra của schema JSON-LD.
Áp dụng cho: Kết quả xuất ra của shortcode
Tham số: array $data, int $post_id, string $schema_type
init_plugin_suite_review_system_after_vote
Chạy logic tùy chỉnh sau khi một lượt bình chọn sao đơn được gửi.
Áp dụng cho: REST /vote
Tham số: int $post_id, float $score, float $avg_score, int $total_votes
init_plugin_suite_review_system_after_criteria_review
Kích hoạt logic tùy chỉnh sau khi một đánh giá đa tiêu chí được gửi.
Áp dụng cho: REST /submit-criteria-review
Tham số: int $post_id, int $user_id, float $avg_score, string $review_content, array $scores
init_plugin_suite_review_system_get_reaction_types
Tùy chỉnh các loại cảm xúc có sẵn (nhãn + emoji).
Áp dụng cho: Hệ thống cảm xúc
Tham số: array $types
init_plugin_suite_review_system_reaction_meta_key
Tùy chỉnh meta key dùng để lưu số lượng cảm xúc.
Áp dụng cho: Lưu trữ số lượng cảm xúc
Tham số: string $meta_key, string $rx_key
init_plugin_suite_review_system_criteria
Ghi đè danh sách tiêu chí cho một bài viết cụ thể. Từ 2.0.1, áp dụng cho cả hiển thị [init_review_criteria] lẫn REST API.
Áp dụng cho: Hiển thị tiêu chí, REST API, abilities
Tham số: array|null $criteria, int $post_id
init_plugin_suite_review_system_can_view_post (từ 2.0.1)
Quyết định xem người truy cập hiện tại có được đọc/gửi dữ liệu đánh giá cho một bài viết hay không. Mặc định: các bài viết công khai, hoặc bài viết mà người dùng có quyền read_post.
Áp dụng cho: REST API, abilities
Tham số: bool $can_view, WP_Post $post
init_plugin_suite_review_system_client_ip (từ 2.0.1)
Ghi đè địa chỉ IP client được phát hiện, dùng cho kiểm tra IP nghiêm ngặt (ví dụ: chỉ tin tưởng header do reverse proxy của riêng bạn thiết lập).
Áp dụng cho: Kiểm tra IP nghiêm ngặt
Tham số: string $ip
init_plugin_suite_review_system_enqueue_style (từ 2.0.1)
Trả về false để ngăn stylesheet chính ở frontend được tải trên mọi trang (nếu bạn tự tải nó).
Áp dụng cho: Frontend
Tham số: bool $enqueue (mặc định true)
init_plugin_suite_review_system_after_admin_review_action (action, từ 2.0.1)
Kích hoạt sau khi quản trị viên duyệt, từ chối, hoặc xóa đánh giá (đơn lẻ hoặc hàng loạt).
Tham số: string $action, int[] $review_ids, int $affected_rows
Sự kiện JavaScript
Phát sự kiện init-review-system:criteria-loaded trên document sau khi chèn mã đánh giá qua AJAX (có thể phát nhiều lần một cách an toàn). Từ phiên bản 2.0.1, phát sự kiện init-review-system:reactions-loaded (hoặc gọi window.initReviewSystemReactions()) sau khi chèn thanh cảm xúc.
init_plugin_suite_review_system_ttl
Thiết lập TTL (tính bằng giây) cho object cache của các truy vấn đánh giá. Mặc định là 300 (5 phút) kể từ phiên bản 1.19. Trả về 0 để tắt hoàn toàn bộ nhớ đệm, hoặc giá trị khác để thay đổi thời lượng. Bộ nhớ đệm được lưu qua wp_cache_set với nhóm init_review_system và tự động bị vô hiệu hóa khi có đánh giá mới được gửi hoặc khi quản trị viên duyệt/từ chối/xóa.
Áp dụng cho: REST lấy đánh giá, lấy tổng số đánh giá
Tham số: int $ttl (mặc định 300, tức 5 * MINUTE_IN_SECONDS)
Giấy phép
Plugin này được cấp phép theo GPLv2 hoặc phiên bản mới hơn.
Bạn có toàn quyền sử dụng, chỉnh sửa, và phân phối lại theo cùng giấy phép.
Ảnh màn hình




Khối
Plugin này cung cấp 4 khối.
- Review Criteria Insert the multi-criteria review breakdown, written reviews list, and submission form.
- Review Widget Insert the interactive 5-star voting widget, with optional Schema.org markup.
- Review Score Insert the average review score (read-only) for a post.
- Reactions Bar Insert the emoji reactions bar for a post. Reacting requires login.
Cài đặt
- Tải plugin lên
/wp-content/plugins/ - Kích hoạt qua menu Plugin
- Vào Review System trong menu quản trị để cấu hình các tùy chọn
Hỏi đáp
-
Có bắt buộc đăng nhập để bình chọn không?
-
Không bắt buộc theo mặc định. Bạn có thể bật tính năng này trong phần cài đặt plugin.
-
Plugin có hỗ trợ bảo vệ bằng IP không?
-
Có. Bạn có thể bật kiểm tra IP nghiêm ngặt để ngăn bình chọn trùng lặp.
-
Tôi có thể dùng plugin này với các loại bài viết tùy chỉnh không?
-
Có, plugin hoạt động với bất kỳ loại bài viết nào sử dụng
the_content()hoặccomment_form(). -
Plugin có hỗ trợ đánh giá đa tiêu chí không?
-
Có. Bạn có thể định nghĩa tối đa 5 tiêu chí tùy chỉnh và hiển thị chúng bằng shortcode có sẵn.
-
Plugin có hỗ trợ đánh giá thang 10 sao không?
-
Không. Plugin hiện chỉ hỗ trợ thang điểm 5 sao.
Đánh giá
Không có đánh giá nào cho plugin này.
Người đóng góp & Lập trình viên
“Init Review System – Reactions, Multi-Criteria, Guest-Friendly” là mã nguồn mở. Những người sau đã đóng góp vào plugin này.
Những người đóng góp“Init Review System – Reactions, Multi-Criteria, Guest-Friendly” đã được dịch qua 1 ngôn ngữ. Cảm ơn những người tham gia dịch vì đóng góp của họ.
Dịch “Init Review System – Reactions, Multi-Criteria, Guest-Friendly” sang ngôn ngữ của bạn.
Muốn tham gia phát triển?
Duyệt code, check out SVN repository, hoặc theo dõi nhật ký phát triển qua RSS.
Nhật ký thay đổi
2.0.1 – 26 tháng 9, 2026
- Đã sửa: hook kích hoạt trước đây được đăng ký từ
includes/init.phpvới__FILE__sai, nên không bao giờ chạy — các bảng chỉ được tạo lần đầu tiên khi quản trị viên mở wp-admin, và các yêu cầu ở frontend trước đó có thể bị lỗi. Giờ các bảng được tạo ngay khi kích hoạt (kích hoạt toàn mạng sẽ tạo cho mọi site) - Đã sửa: các bản dịch đi kèm (ví dụ tiếng Việt) trước đây chưa bao giờ được tải cho các chuỗi PHP vì thiếu
load_plugin_textdomain(). Gói ngôn ngữ từ WordPress.org vẫn được ưu tiên hơn - Đã sửa: bản dịch JSON tiếng Việt cho Block Editor trước đây bị mã hóa UTF-8 hai lần (chữ bị lỗi font). Đã tạo lại bằng WP-CLI;
blocks-editor.jsgiờ dùng trực tiếp__()để các chuỗi được trích xuất tự động bằngwp i18n make-pot - Đã sửa: khi bật kiểm tra IP nghiêm ngặt, khách bị từ chối đánh giá do kiểm duyệt (từ cấm, lặp từ…) trước đây không thể sửa và gửi lại, vì IP đã được ghi nhận trước khi kiểm duyệt. Giờ IP chỉ được ghi nhận sau khi đánh giá được lưu
- Đã sửa: thông báo quản trị sau khi duyệt/từ chối/xóa một đánh giá đơn lẻ trước đây chưa bao giờ hiển thị (do chuyển hướng xảy ra trước). Các hành động hàng loạt giờ cũng chuyển hướng (không gửi lại khi tải lại trang) và giữ nguyên bộ lọc hiện tại
- Đã sửa: các trình xử lý quản lý đánh giá trước đây chạy trên mọi yêu cầu quản trị (kể cả admin-ajax) và có thể gây ra lỗi “Security check failed” cho các plugin khác dùng chung tham số
action/review_id. Giờ chúng chỉ chạy trên trang riêng của plugin - Đã sửa:
review-management.jstrước đây không được tải khi ngôn ngữ quản trị không phải tiếng Anh (tên hook trang phụ thuộc vào tiêu đề menu đã dịch) - Đã sửa: việc lưu bài viết trước đây tính lại
_init_review_totaltừ điểm trung bình đã làm tròn ngay cả khi không có gì thay đổi trong metabox Review Score, khiến tổng số dần bị lệch (ví dụ 13 12.99)._init_review_weightedgiờ cũng được tính lại khi điều chỉnh thủ công và bị xóa khi đặt lại - Đã sửa: nút “Xem thêm đánh giá” trước đây luôn bắt đầu từ trang 2 dù
paged> 1, và có thể hiển thị ngay cả ở trang cuối. Nhấp đúp giờ không còn tải cùng một trang hai lần - Đã sửa: URL ảnh đại diện mặc định chứa dấu gạch chéo kép (
assets//img) - Đã sửa: hộp thoại xác nhận xóa bị lỗi với các bản dịch có chứa dấu ngoặc kép; trạng thái đánh giá trong danh sách quản trị giờ đã được dịch
- Đã sửa: bản dịch của trình tạo shortcode chưa bao giờ được tải (sai tên biến toàn cục), nút Sao chép bị lỗi trên trang quản trị không dùng HTTPS,
[init_review_score]cung cấp tùy chọnschemakhông còn được hỗ trợ (đã thay bằngsub,show_count,hide_if_empty) và các tùy chọn mặc định bật nhưng bị bỏ chọn (ví dụcss) bị bỏ qua - Bảo mật: các endpoint REST và ability giờ không còn công khai hoặc chấp nhận bình chọn/đánh giá/cảm xúc cho các bài viết ở dạng nháp, riêng tư, hoặc lên lịch đối với người truy cập không có quyền đọc chúng (có thể tùy chỉnh qua
init_plugin_suite_review_system_can_view_post) - Cải thiện (hiệu năng): một lượt bình chọn giờ không còn xóa bộ nhớ đệm điểm trung bình toàn site, điều mà trước đây buộc phải chạy
AVG()trên toàn bộ bảng postmeta gần như mỗi lần bình chọn - Cải thiện (hiệu năng): tổng hợp điểm theo tiêu chí giờ chỉ dùng một truy vấn thay vì hai, và chỉ làm sạch mỗi nhãn một lần thay vì mỗi điểm; số liệu tổng hợp cho quản trị viên dùng một truy vấn thay vì ba; nội dung đánh giá được token hóa một lần thay vì hai
- Cải thiện (hiệu năng): đối tượng người dùng cho danh sách đánh giá ban đầu được nạp trước hàng loạt; truy vấn danh sách đánh giá được bỏ qua khi không có đánh giá nào
- Cải thiện: phiên bản bộ nhớ đệm đánh giá giờ dựa trên thời gian, nên object cache bền vững loại bỏ khóa phiên bản sẽ không bao giờ làm sống lại mục dữ liệu cũ; danh sách đánh giá toàn site cũng bị vô hiệu hóa
- Cải thiện: cảm xúc — không ghi DB hay đếm lại khi xóa một cảm xúc không tồn tại; lỗi DB được báo cáo thay vì trả về thành công; dữ liệu script cảm xúc được in một lần cho mỗi trang thay vì mỗi thanh
- Cải thiện (JS): script khởi tạo chính xác khi bị hoãn/trì hoãn bởi plugin tối ưu hóa; trình lắng nghe sự kiện sao trong modal đánh giá trước đây bị gắn hai lần; việc phát lại sự kiện
init-review-system:criteria-loadedgiờ không còn gắn trình xử lý hai lần (có thể khiến gửi đánh giá hai lần);localStoragebị chặn không còn làm hỏng script; nhiều thanh cảm xúc cho cùng một bài viết giờ dùng chung một yêu cầu tổng hợp - Cải thiện:
[init_review_criteria]giờ đây tuân theo filterinit_plugin_suite_review_system_criteria(trước đây chỉ REST API mới áp dụng); thuộc tínhclasschấp nhận nhiều lớp; các hook tự động chèn bình chọn và form bình luận giờ là hàm có tên (có thể gỡ bằngremove_action) - Thay đổi:
wpmu_new_blog(đã lỗi thời) được thay bằngwp_initialize_site; khi gỡ cài đặt cũng sẽ xóa tùy chọn phiên bản DB và transient điểm trung bình toàn site (dữ liệu đánh giá vẫn được giữ lại) - Dev: mã nguồn tuân theo WordPress Coding Standards (WPCS 3); các tệp mã nguồn JavaScript được cung cấp ở dạng chưa nén, dễ đọc
- Filter mới:
init_plugin_suite_review_system_can_view_post,init_plugin_suite_review_system_client_ip,init_plugin_suite_review_system_enqueue_style; action mới:init_plugin_suite_review_system_after_admin_review_action
2.0.0 – 4 tháng 8, 2026
- Mới: Hỗ trợ Abilities API (WordPress 6.9+): đăng ký ba ability chỉ đọc trong danh mục
init-review-system—init-review-system/get-review-score(điểm trung bình + số lượt bình chọn),init-review-system/get-criteria-reviews(chi tiết theo tiêu chí + một trang đánh giá bằng văn bản), vàinit-review-system/get-reactions-summary(số lượng cảm xúc emoji). Cả ba đều có thể được phát hiện và thực thi qua PHP,wp_get_abilities(), và — khi site chọn tham gia — qua REST namespacewp-abilities/v1. Các hành động ghi dữ liệu (bình chọn, gửi đánh giá, bật/tắt cảm xúc) chủ ý không được công khai dưới dạng ability. Hoàn toàn tùy chọn và tương thích ngược: trên các phiên bản WordPress cũ hơn 6.9, tích hợp này sẽ không làm gì cả - Mới: Hỗ trợ Block Editor (Gutenberg): bốn block động, được nhóm trong danh mục block Init Review System riêng (thay vì danh mục “Widgets” chung chung) — Review Score, Review Widget, Review Criteria, và Reactions Bar, tương ứng với
[init_review_score],[init_review_system],[init_review_criteria], và[init_reactions]. Mỗi block được đăng ký quablock.json(với tệp PHPrender.phpkết nối qua trường"render", WP 6.1+) gọi chính xác cùng hàm shortcode như shortcode tương ứng của nó — không lặp lại logic hiển thị, kết quả luôn khớp nhau. Tích hợp trình soạn thảo là một tệp JavaScript thuần, không cần bước build, sử dụngwp.serverSideRenderđể xem trước trực tiếp ngay trong trình soạn thảo - Thay đổi: bốn trình xử lý shortcode được chuyển từ closure ẩn danh sang hàm có tên (
init_plugin_suite_review_system_shortcode_*) để các tệprender.phpcủa block mới có thể gọi trực tiếp thay vì lặp lại logic. Không có thay đổi nào về hành vi hay kết quả xuất ra của shortcode - Thay đổi:
Requires at leastđược nâng từ 5.5 lên 6.9 để hỗ trợ tích hợp Abilities API.Requires PHPvẫn giữ nguyên 7.4 - Cải thiện:
/get-criteria-reviews(REST) và/reactions/summary(REST) giờ dùng chung logic tổng hợp dữ liệu cốt lõi với các ability mới thông qua hai hàm hỗ trợ nội bộ, thay vì tồn tại cùng một logic truy vấn/định dạng hai lần Đã kiểm tra đến: 7.1
1.19 – 2 tháng 8, 2026
- Đã sửa: tổng lượt bình chọn (
_init_review_total/_init_review_count) trước đây được cập nhật theo kiểu đọc-rồi-ghi, có thể âm thầm làm mất một lượt bình chọn khi hai yêu cầu đến gần như đồng thời trên một bài viết đông người xem. Giờ dùng phép tăng SQL nguyên tử nên các lượt bình chọn đồng thời không bao giờ bị mất. - Đã sửa: bộ đếm cảm xúc có thể bị lệch khỏi dữ liệu thực do cùng nguyên nhân đọc-rồi-ghi. Số lượng cảm xúc giờ được tính trực tiếp (COUNT) từ bảng
init_reactions— bảng này là nguồn dữ liệu chính xác duy nhất — với bộ nhớ đệm 1 giờ. Post meta_irs_rx_*vẫn được đồng bộ để tương thích ngược (ví dụ các site dùng nó trongorderby/meta_query) nhưng không còn là dữ liệu gốc. - Đã sửa: quy trình nâng cấp DB trước đây chỉ tạo bảng khi bảng đó bị thiếu, nên các thay đổi schema trong phiên bản mới (như chỉ mục bên dưới) không bao giờ đến được các site đã cài plugin từ trước. Giờ nó luôn chạy lại
dbDelta(), vốn được thiết kế để chỉ thêm/an toàn. - Đã sửa: sau khi gửi một đánh giá đa tiêu chí, frontend trước đây tính lại điểm trung bình/chi tiết tổng thể bằng công thức trung bình động phía client dựa trên số liệu chụp nhanh lúc tải trang — nếu có người khác gửi đánh giá trong lúc đó, điểm hiển thị có thể sai tạm thời cho đến khi tải lại trang.
/submit-criteria-reviewgiờ trả vềsummary(overall_avg/breakdown/total) thực tế, được truy vấn mới, và frontend chỉ việc hiển thị trực tiếp. - Thay đổi:
init_plugin_suite_review_system_get_reviews_by_post_id()/..._get_total_reviews_by_post_id()giờ được lưu đệm 5 phút theo mặc định (trước đây bị tắt theo mặc định). Vẫn có thể ghi đè hoàn toàn qua filterinit_plugin_suite_review_system_ttl(trả về0để tắt). Bộ nhớ đệm được đánh phiên bản theo từng bài viết và được vô hiệu hóa đúng cách khi có đánh giá mới và khi quản trị viên duyệt/từ chối/xóa (đơn lẻ hoặc hàng loạt) — trước đây các hành động quản trị này sửa đổi DB trực tiếp mà không xóa bất kỳ bộ nhớ đệm nào. - Thêm mới: chỉ mục kết hợp
(post_id, status)và(user_id, status)trên bảnginit_criteria_reviewsđể tăng tốc các truy vấn phổ biến nhất trên các site lớn. - Cải thiện:
init_plugin_suite_review_system_get_score_summary_by_post_id()giờ tính điểm trung bình tổng thể bằngAVG()của SQL thay vì cộng dồn từng dòng trong PHP. - Cải thiện: danh sách đánh giá quản trị và endpoint REST
/get-criteria-reviewsgiờ nạp trước bộ nhớ đệm đối tượng bài viết/người dùng hàng loạt thay vì gọiget_post()/get_userdata()cho từng dòng.
1.18 – 21 tháng 4, 2026
- Đã sửa lỗi
admin_initchạy kiểm tra bảng cơ sở dữ liệu ở mỗi lần tải trang quản trị - Giới thiệu cờ tùy chọn
irs_plugin_db_versionđể kiểm soát việc kiểm tra bảng dựa trên so sánh phiên bản - Việc tạo bảng giờ chỉ chạy khi phiên bản DB đã lưu thấp hơn phiên bản plugin hiện tại
- Thêm
register_activation_hookđể xử lý cài đặt mới và kích hoạt trên mạng multisite - Thêm hook
wpmu_new_blogđể tự động tạo bảng khi có site con mới trong multisite - Thêm hook
upgrader_process_completeđể đặt lại cờ phiên bản sau khi cập nhật plugin, kích hoạt kiểm tra lại ở lần tải trang quản trị tiếp theo
1.17 – 25 tháng 3, 2026
- Thêm object cache (TTL 1 giờ) cho
init_plugin_suite_review_system_get_score_summary_by_post_id() - Thêm object cache (TTL 1 giờ) cho
init_plugin_suite_review_system_has_user_reviewed() - Thêm object cache (TTL 1 giờ) cho
init_plugin_suite_review_system_get_user_reaction() - Bộ nhớ đệm cho
has_user_reviewedvàget_user_reactionlưu giá trị đánh dấu để phân biệt cache miss với kết quả phủ định - Vô hiệu hóa bộ nhớ đệm cho tổng hợp điểm và trạng thái đã-đánh-giá được kích hoạt qua hook action
init_plugin_suite_review_system_after_insert - Vô hiệu hóa bộ nhớ đệm cho cảm xúc người dùng được kích hoạt bên trong
init_plugin_suite_review_system_apply_user_reaction()sau mỗi lần ghi
1.16 – 1 tháng 3, 2026
- Đã sửa lỗi nút Xem thêm hiển thị sai ảnh đại diện và tên hiển thị của người dùng
- Đã sửa lỗi hiển thị đánh giá sau khi gửi dùng HTML viết cứng, không tương thích với mẫu tùy chỉnh
- Thêm
review-item.phplàm mẫu độc lập có thể ghi đè - Thêm hàm hỗ trợ
init_plugin_suite_review_system_get_criteria_by_post_id() - Thêm hàm hỗ trợ
init_plugin_suite_review_system_get_review_by_id() - Các endpoint REST giờ dựng HTML đánh giá phía server; JS chỉ chèn vào, không còn tự dựng DOM
- Đã xóa hàm JS
insertNewReview()không còn dùng đến
1.15 – 25 tháng 2, 2026
- Thêm giới hạn
$per_page(tối đa 100) trong endpoint REST để ngăn truy vấn dữ liệu quá mức - Thêm filter
init_plugin_suite_review_system_ttl(mặc định0) để chọn tham gia dùng object cache cho các truy vấn đánh giá - Khi TTL > 0, kết quả truy vấn được lưu đệm qua
wp_cache_setvới nhóminit_review_system - Có thể xử lý vô hiệu hóa bộ nhớ đệm qua hook action
init_plugin_suite_review_system_after_insert
1.14 – 29 tháng 1, 2026
- Giới thiệu Bayesian Weighted Rating (đánh giá có trọng số Bayes) để tính toán xếp hạng đáng tin cậy
- Meta key mới, được tính từ dữ liệu khác,
_init_review_weightedđược tạo khi gửi lượt bình chọn - Ngăn sai lệch do mẫu nhỏ (ví dụ 1 lượt×5★ không còn xếp hạng cao hơn 1000 lượt×4.9★)
- Sử dụng ngưỡng số lượt bình chọn tối thiểu có thể cấu hình qua filter
init_plugin_suite_review_system_min_votes_threshold
- Meta key mới, được tính từ dữ liệu khác,
- Cải tiến kiến trúc đánh giá:
- Điểm có trọng số được tính ngay khi ghi (tại endpoint REST), không phải lúc truy vấn
- Thiết lập ranh giới rõ ràng giữa dữ liệu thô và dữ liệu xếp hạng
- Plugin giờ đóng vai trò là nguồn dữ liệu chính xác duy nhất cho việc sắp xếp theo điểm đánh giá
- Hiệu năng & độ ổn định:
- Điểm đánh giá trung bình toàn cục được lưu đệm bằng transient để đảm bảo độ tin cậy trên nhiều môi trường
- Tự động vô hiệu hóa transient khi có lượt bình chọn mới để tránh tính toán bị lỗi thời
- Trải nghiệm lập trình viên:
- Hook
init_plugin_suite_review_system_after_voteđược nâng cấp giờ truyền thêm: - Điểm trung bình mới
- Tổng số lượt bình chọn
- Điểm xếp hạng có trọng số
- Hoàn toàn tương thích ngược — không cần thay đổi gì đối với bên đang sử dụng hiện tại
- Hook
- Không có thay đổi về giao diện hay hành vi frontend
- Không có thay đổi phá vỡ tương thích đối với phản hồi REST API
1.13 – 19 tháng 1, 2026
- Thêm biến thể
.darkcho.init-reaction-barđể hỗ trợ Chế độ tối - Cải thiện độ tương phản hiển thị của cảm xúc trong môi trường tối
- Tinh chỉnh trạng thái hover, active và disabled trong Chế độ tối
- Cải tiến thuần CSS, không thay đổi JS hay logic
1.12 – 14 tháng 11, 2025
- Thêm cơ chế chống gửi trùng vào widget đánh giá ở frontend
- Trạng thái mới
isSubmittingngăn việc nhấp nhiều lần liên tiếp gửi nhiều yêu cầu - Tương thích hoàn toàn với cả chế độ xác nhận nhấp một lần và nhấp đúp
- Logic hover đang chờ (
.hovering) được giữ nguyên, không thay đổi hành vi
- Trạng thái mới
- Cải thiện độ ổn định phía client:
- Đảm bảo chỉ một yêu cầu bình chọn được gửi tại một thời điểm
- Cho phép thử lại khi API trả về lỗi (trải nghiệm không bị chặn)
- Không có thay đổi nào đối với REST API, logic server, hay luồng đánh giá hiện có — hoàn toàn tương thích ngược
1.11 – 5 tháng 11, 2025
- Thêm API lấy đánh giá của người dùng
- Hàm mới
init_plugin_suite_review_system_get_reviews_by_user_id() - Hỗ trợ phân trang (
paged,per_page) giống như hàm lấy dữ liệu theo bài viết - Tự động kết hợp (join) với
wp_postsđể loại trừ các đánh giá mồ côi - Trả về
criteria_scoresđã giải chuỗi hóa để hiển thị trực tiếp lên giao diện
- Hàm mới
- Thêm Bộ đếm tổng số trang cho đánh giá của người dùng
- Hàm mới
init_plugin_suite_review_system_get_total_pages_by_user_id() - Đếm số đánh giá thuộc về một người dùng cụ thể (lọc theo
status) - Trả về tổng số trang (giá trị tối thiểu:
1để đảm bảo trải nghiệm nhất quán)
- Hàm mới
- Cải tiến hiệu năng và nội bộ:
- Làm sạch dữ liệu và đảm bảo an toàn nhất quán (
absint(),max(), giá trị có kiểu) - Mọi truy vấn SQL đều dùng
$wpdb->prepare()— không có tham số chưa ràng buộc - Tuân thủ PHPCS/WPCS và theo chuẩn tiền tố plugin
- Làm sạch dữ liệu và đảm bảo an toàn nhất quán (
1.10 – 3 tháng 11, 2025
- Thêm Metabox Đặt lại & Điều chỉnh điểm thủ công cho quản trị viên
- Chỉ hiển thị khi bài viết đã có dữ liệu đánh giá
- Giao diện mới: thẻ số liệu gọn gàng hiển thị Điểm TB / Lượt bình chọn / Tổng (kiểu thẻ mini cao cấp)
- Hỗ trợ ghi đè thủ công: quản trị viên có thể đặt Điểm trung bình (0–5) và Số lượt bình chọn
- Logic nội bộ tự động tính
Total = Avg × Count(làm tròn đến 2 chữ số thập phân) - Mọi giá trị hiển thị đều được escape đầy đủ (
esc_html() / esc_attr()) theo chuẩn PHPCS - Metabox được đăng ký theo từng bài viết, không phải toàn cục — không gây rối giao diện
- Bảo mật và quyền hạn:
- Chỉ người dùng có quyền
edit_others_posts(từ Biên tập viên trở lên) mới có thể xem hoặc tương tác với metabox - Trình xử lý
save_postkiểm tra nonce + quyền hạn, bảo vệ khỏi các gửi POST trái phép - Dữ liệu đầu vào được làm sạch:
sanitize_text_field( wp_unslash() )trước khi chuyển sang kiểu float/int
- Chỉ người dùng có quyền
- Cải tiến trải nghiệm người dùng:
- Không dùng thẻ
<style>nội tuyến — mọi kiểu dáng được chuyển sang thuộc tính inline (theo chuẩn quản trị WordPress) - Metabox không hiển thị cho đến khi có lượt bình chọn đầu tiên (không có hộp “rỗng”)
- Không dùng thẻ
1.9 – 31 tháng 10, 2025
- Thêm Xác nhận đánh giá bằng nhấp đúp (cơ chế chống nhấp nhầm)
- Cài đặt mới:
Yêu cầu nhấp đúp để đánh giá - Khi bật, người dùng phải nhấp vào cùng một sao hai lần để xác nhận đánh giá
- Lần nhấp đầu tiên chuyển sang trạng thái chờ, được đánh dấu bằng lớp
.hovering - Lần nhấp thứ hai gửi đánh giá và vô hiệu hóa khối như bình thường
- Cài đặt mới:
- Cải tiến JavaScript:
- Trình xử lý chờ mới với tự động hết thời gian (2.2 giây) — không còn tình trạng bị khóa ngoài ý muốn
- Lớp
.hoveringvẫn được giữ nguyên qua sự kiện mouseleave trong lúc đang chờ - Dọn dẹp trạng thái bất đồng bộ triệt để, đảm bảo không còn trạng thái “ma”
- Không có cửa sổ bật lên, không có cảnh báo — xác nhận đánh giá hoàn toàn dựa trên hành động
- Không có thay đổi phá vỡ tương thích — logic đánh giá hiện có được giữ nguyên
1.8 – 6 tháng 10, 2025
- Cập nhật hàm
init_plugin_suite_review_system_get_reviews_by_post_id():- Khi
$post_id = 0, các đánh giá mồ côi giờ được tự động loại trừ (bài viết không còn tồn tại trên tất cả các loại nội dung tùy chỉnh).
- Khi
- Shortcode
[init_review_criteria]được nâng cấp:- Thêm thuộc tính mới
pagedđể điều khiển phân trang đánh giá. - Lệnh gọi nội bộ giờ truyền
$pagedđộng choinit_plugin_suite_review_system_get_reviews_by_post_id().
- Thêm thuộc tính mới
1.7 – 13 tháng 9, 2025
- Thêm kiểm duyệt nội dung: từ cấm, cụm từ cấm, không khoảng trắng, lặp từ quá mức
- Cài đặt mới: bật kiểm tra sơ bộ bằng JS (tùy chọn), quản lý từ/cụm từ bị cấm trong ô nhập văn bản
- Cải thiện trải nghiệm modal: phải đánh giá đủ mọi tiêu chí bắt buộc, thông báo lỗi/thành công hiển thị ngay dưới nút gửi
- Cập nhật JavaScript: ánh xạ lỗi đa ngôn ngữ (i18n), kiểm tra sơ bộ phía client, làm nổi bật viền đỏ cho các điểm còn thiếu
- Cải tiến CSS:
.init-review-inline-msgcho thông báo,.init-review-criteria-errorcho kiểm tra tiêu chí (có hỗ trợ chế độ tối)
1.6 – 2 tháng 9, 2025
- Endpoint cảm xúc
/reactions/togglegiờ yêu cầu đăng nhập: bắt buộc kiểm trais_user_logged_in()và xác thực nonce - Cập nhật đăng ký REST API:
permission_callbackcho/reactions/togglegiờ chỉ cho phép người dùng đã đăng nhập - Cập nhật shortcode
[init_reactions]:require_loginluôn làtrue, đảm bảo hành vi frontend nhất quán - Cải thiện logic JS:
- Đã loại bỏ phương án dự phòng cho khách/localStorage (không còn cảm xúc ẩn danh)
- Giữ nguyên trạng thái
disabledban đầu của nút; khách luôn thấy số lượng nhưng không thể tương tác - Đã sửa lỗi nút của khách có thể bị bật lại sau khi gọi API
- Điều chỉnh CSS: kiểu
.is-disabledmới giữ cho emoji + số lượng luôn hiển thị đầy đủ, đồng thời thể hiện trực quan yêu cầu đăng nhập - Cải thiện khả năng truy cập: nút cảm xúc giờ chuyển đổi
aria-pressedchính xác và hỗ trợ trạng tháiis-activecho cảm xúc của người dùng hiện tại - Dọn dẹp mã nguồn: xóa các đoạn mã xử lý khách đã lỗi thời và đơn giản hóa việc quản lý trạng thái
1.5 – 1 tháng 9, 2025
- Nâng cấp Hệ thống Cảm xúc với bộ đếm tổng số cảm xúc hiển thị bên dưới “Bạn nghĩ sao?”
- Thêm
idduy nhất cho thẻ span đếm tổng (irs-total-reactions-{post_id}) để hỗ trợ cập nhật trực tiếp bằng JS - Cập nhật JavaScript: tổng số cảm xúc giờ cập nhật ngay lập tức khi người dùng bật/tắt cảm xúc
- Đồng bộ mẫu theme UIkit với kết quả hiển thị tổng số cảm xúc để đảm bảo hiển thị frontend nhất quán
- Thêm kiểu CSS cho
.init-reaction-total(độ đậm chữ, khoảng cách, hiển thị responsive) - Cải thiện khả năng truy cập: tổng số cảm xúc được bọc bằng
aria-live="polite"để cập nhật cho trình đọc màn hình - Dọn dẹp mã nguồn nhỏ và cải thiện tính nhất quán
1.4 – 31 tháng 8, 2025
- Giới thiệu Hệ thống Cảm xúc: cảm xúc dựa trên emoji (👍 😄 😍 😯 😠 😢)
- Thêm shortcode + mẫu cho thanh cảm xúc
- Cảm xúc được lưu trong cả post meta (số lượng) và bảng riêng
init_reactions(ánh xạ người dùngbài viết) - Thân thiện với khách: hoạt động không cần đăng nhập (theo dõi qua localStorage)
- Thêm các filter dành cho lập trình viên:
init_plugin_suite_review_system_get_reaction_typesinit_plugin_suite_review_system_reaction_meta_key
- Tái cấu trúc nội bộ: tách các hàm cốt lõi xử lý cảm xúc, tạo bảng âm thầm bằng
dbDelta()
1.3 – 25 tháng 8, 2025
- Tái cấu trúc giao diện quản trị: chuyển từ submenu Cài đặt sang menu chính riêng với biểu tượng ngôi sao
- Thêm hệ thống quản lý đánh giá toàn diện với thao tác hàng loạt và khả năng lọc
- Triển khai quy trình duyệt đánh giá với quản lý trạng thái đang chờ/đã duyệt/đã từ chối
- Nâng cấp bảng điều khiển quản trị với số liệu thống kê đánh giá, chức năng tìm kiếm, và phân trang
- Thêm các thao tác cho từng đánh giá: duyệt, từ chối, xóa, kèm bảo mật nonce phù hợp
- Tích hợp thao tác hàng loạt để quản lý nhiều đánh giá cùng lúc
- Tạo trang quản lý đánh giá riêng với hiển thị chi tiết đánh giá và thông tin người dùng
- Cải thiện các truy vấn cơ sở dữ liệu với câu lệnh chuẩn bị sẵn phù hợp và tuân thủ PHPCS
- Thêm script quản lý đánh giá chỉ dành cho quản trị viên, tuân theo chuẩn enqueue phù hợp
- Tinh chỉnh kiến trúc plugin để dễ mở rộng và bảo trì hơn
1.2 – 27 tháng 7, 2025
- Chuẩn hóa toàn bộ đầu ra bằng
esc_html(),esc_attr(), vàwp_kses()để đảm bảo an toàn cho frontend - Bảo mật endpoint REST API bằng cách bắt buộc đăng nhập + xác thực nonce cho người dùng đã đăng nhập
- Thêm
uninstall.phpđể dọn dẹp các tùy chọn plugin khi gỡ cài đặt - Tinh chỉnh nhãn giao diện và mô tả trên trang cài đặt
- Cải thiện tài liệu shortcode và các thuộc tính trong
readme.txt - Nâng cấp bố cục nhập liệu đa tiêu chí để rõ ràng hơn
1.1 – 11 tháng 7, 2025
- Thêm hỗ trợ cho đánh giá đa tiêu chí
- Shortcode mới để hiển thị điểm theo tiêu chí
- Tách riêng logic và xử lý schema cho đánh giá theo tiêu chí
- Cải thiện giao diện đánh giá và trải nghiệm modal
- Tái cấu trúc mã nguồn để hỗ trợ cả luồng đánh giá đơn và đa tiêu chí
1.0 – 28 tháng 6, 2025
- Phát hành lần đầu
- Shortcode
[init_review_system]cho khối bình chọn 5 sao - Shortcode
[init_review_score]để hiển thị điểm trung bình - Endpoint REST API
/wp-json/initrsys/v1/votevới kiểm tra đăng nhập có điều kiện và kiểm tra nonce - Theo dõi lượt bình chọn qua
localStoragecho người dùng khách - Tùy chọn giới hạn đăng nhập + kiểm tra IP nghiêm ngặt bằng IP đã băm + transient
- Xuất schema JSON-LD sử dụng
AggregateRating - Hệ thống tự động chèn: trước/sau nội dung bài viết hoặc form bình luận
- Trang cài đặt quản trị với trình tạo shortcode và các nút bật/tắt điều khiển
- Thiết kế tối giản, responsive, kế thừa từ theme
- Thân thiện với lập trình viên: filter, action, và các hàm hỗ trợ có thể tái sử dụng
