Mô tả
Init User Engine là một hệ thống người dùng nhẹ, không cồng kềnh cho các site WordPress hiện đại. Nó được thiết kế để có sự linh hoạt tối đa ở frontend và tương tác người dùng theo kiểu game hóa. Mọi giao diện động đều được dựng bằng JavaScript với tương tác REST API theo thời gian thực.
Không jQuery. Cài đặt tối giản. Thông minh theo mặc định.
Những gì bạn nhận được:
- Hiển thị ảnh đại diện người dùng và bảng điều khiển qua shortcode
- Hiển thị cấp độ, EXP, Coin/Cash, và toàn bộ ví người dùng
- Modal đăng nhập & đăng ký ở frontend với bảo vệ bằng Cloudflare Turnstile (hoặc captcha toán học tích hợp sẵn)
- Cho phép người dùng điểm danh hàng ngày và nhận thưởng theo thời gian
- Tự động theo dõi đăng ký qua giới thiệu bạn bè với hệ thống phần thưởng
- Cho phép người dùng mua trạng thái VIP bằng Coin, Cash, hoặc cả hai
- Hệ thống Mã đổi thưởng / Mã quà tặng và Mã VIP riêng, kèm xuất CSV từ wp-admin
- Hộp thư tích hợp sẵn cho thông báo (dùng bảng DB tùy chỉnh), với tin nhắn ghim/hết hạn và bảng thống kê
- Hỗ trợ ảnh đại diện tùy chỉnh với modal tải lên & xem trước
- Gửi thông báo tùy chỉnh đến người dùng được chọn hoặc toàn bộ thành viên từ wp-admin
- Chế độ “Yêu cầu đăng nhập để truy cập site” tùy chọn, chặn toàn bộ frontend phía sau modal đăng nhập tích hợp sẵn
- Tùy chọn “Đăng nhập sau khi đăng ký” một bước để người dùng mới vào site đã ở trạng thái đăng nhập sẵn
Plugin này là hệ thống người dùng cốt lõi đứng sau Init Plugin Suite – được tối ưu cho tương tác ưu tiên frontend, khả năng mở rộng, và game hóa theo thời gian thực.
Kho GitHub: https://github.com/brokensmile2103/init-user-engine
Tính năng
Hồ sơ & Ảnh đại diện
- Shortcode ảnh đại diện
[init_user_engine]– tự động hiển thị nút đăng nhập cho khách hoặc ảnh đại diện kèm bảng điều khiển thả xuống cho người đã đăng nhập - Bảng điều khiển dạng modal hiển thị cấp độ, tiến độ EXP, ví Coin/Cash, và các liên kết nhanh
- Tải lên ảnh đại diện tùy chỉnh với xem trước trực tiếp, quy trình không cần cắt ảnh, và khôi phục về ảnh mặc định/Gravatar chỉ với một cú nhấp
- Chính sách tải lên có thể cấu hình (cho phép tất cả, chỉ VIP, hoặc tắt hoàn toàn việc tải lên) với kích thước tệp tối đa có thể cấu hình
- Hỗ trợ ghi đè theme: bất kỳ tệp mẫu nào cũng có thể được ghi đè bằng cách sao chép vào
your-theme/init-user-engine/
Tài khoản, Đăng nhập & Đăng ký
- Modal đăng nhập & đăng ký ở frontend – không cần chỉnh sửa theme hay ghi đè mẫu
- Tùy chọn “Đăng nhập sau khi đăng ký” để tự động đăng nhập cho người dùng ngay sau khi họ tạo tài khoản (tắt theo mặc định)
- Đăng nhập thất bại sẽ mở lại modal đăng nhập ngay trên trang hiện tại kèm thông báo lỗi nội tuyến, thay vì chuyển hướng đến
wp-login.php - Captcha Cloudflare Turnstile khi đăng ký, kèm captcha câu hỏi toán học tích hợp sẵn làm phương án dự phòng tự động khi chưa thiết lập khóa Turnstile
- Bảo vệ tùy chọn cho các form đăng nhập, đăng ký, và quên mật khẩu gốc của WordPress (
wp-login.php) bằng cùng cấu hình Turnstile - Form “Quên mật khẩu?” ngay bên trong modal đăng nhập, sử dụng quy trình đặt lại mật khẩu gốc của WordPress (có thể tắt; URL Quên mật khẩu tùy chỉnh luôn được ưu tiên)
- URL chuyển hướng tùy chỉnh cho các liên kết “Đăng ký” và “Quên mật khẩu”
- Chế độ “Yêu cầu đăng nhập để truy cập site” tùy chọn, chặn toàn bộ frontend phía sau modal đăng nhập tích hợp sẵn
- Khả năng tạm thời tắt đăng ký mới mà không ảnh hưởng đến các plugin khác hay lõi WordPress
Game hóa
- Hệ thống EXP & Cấp độ với logic tiến trình có thể móc nối (hookable)
- Hệ thống ví kép Coin & Cash với nhật ký giao dịch và tỷ giá quy đổi có thể cấu hình giữa hai loại tiền tệ
- Điểm danh hàng ngày với các mốc chuỗi và bộ đếm thời gian thưởng trực tuyến
- Khôi phục chuỗi điểm danh tùy chọn: thành viên bỏ lỡ vài ngày có thể chi Coin để giữ chuỗi điểm danh còn sống (số ngày bỏ lỡ được phép và giá Coin mỗi ngày có thể cấu hình, tắt theo mặc định)
- Hook thưởng tích hợp sẵn cho đăng ký, đăng nhập hàng ngày, bình luận, bài viết đã xuất bản, và đơn hàng WooCommerce hoàn tất (khi WooCommerce hoạt động)
Gói thành viên VIP
- Hệ thống thành viên VIP với các tùy chọn mua bằng Coin, Cash, hoặc kết hợp cả hai
- Nhiều mức giá có thể cấu hình theo từng thời hạn, kể cả tùy chọn trọn đời
- Hệ số thưởng VIP cho việc nhận Coin/EXP
- Khóa mua VIP tùy chọn (tắt hoàn toàn việc mua mới) và giới hạn chồng gói
Giới thiệu bạn bè
- Module giới thiệu bạn bè với theo dõi đăng ký dựa trên cookie
- Phần thưởng riêng biệt, có thể cấu hình cho cả người giới thiệu lẫn người mới được giới thiệu
Mã đổi thưởng & Mã VIP
- Module Mã đổi thưởng / Mã quà tặng – nhập mã, nhận thưởng
- Module Mã VIP riêng để cấp thời hạn VIP thông qua một mã
- Xuất CSV chỉ với một cú nhấp cho cả hai danh sách mã (toàn bộ danh sách, truyền theo lô, có UTF-8 BOM, và được làm sạch để chống chèn công thức/lệnh CSV)
Hộp thư & Thông báo
- Hệ thống hộp thư tích hợp sẵn với phân trang và các thao tác đọc/nhận/xóa
- Tin nhắn được ghim sẽ tự động bỏ ghim khi đã đọc, hoặc khi qua thời hạn tùy chọn
- Bảng quản trị để gửi thông báo tùy chỉnh đến người dùng được chọn hoặc toàn bộ thành viên, kèm mức độ ưu tiên và thời hạn
- Bảng điều khiển Thống kê Hộp thư (Users Init User Engine Inbox Statistics) với bộ lọc khoảng thời gian
Công cụ quản trị
- Công cụ nạp Coin/Cash thủ công (Users Init User Engine Top-up Coin/Cash)
- Metabox tổng quan cho từng người dùng trên màn hình hồ sơ/chỉnh sửa người dùng của WordPress (cấp độ, ví, trạng thái VIP, hoạt động gần đây)
Thân thiện với lập trình viên
- REST API cho mọi tính năng (đọc/ghi/chỉnh sửa)
- Hook action/filter để tùy chỉnh toàn diện
- Frontend hoàn toàn bằng Vanilla JS thuần – không jQuery, không làm cồng kềnh máy chủ
Hook dành cho lập trình viên
Filter
init_plugin_suite_user_engine_online_minutes– Chỉnh sửa số phút trực tuyến cần thiết sau khi điểm danhinit_plugin_suite_user_engine_vip_prices– Chỉnh sửa giá gói VIPinit_plugin_suite_user_engine_referral_rewards– Chỉnh sửa phần thưởng giới thiệu bạn bèinit_plugin_suite_user_engine_localized_data– Chỉnh sửa dữ liệu JS ở frontendinit_plugin_suite_user_engine_calculated_coin_amount– Chỉnh sửa phần thưởng Coin trước khi áp dụnginit_plugin_suite_user_engine_calculated_exp_amount– Chỉnh sửa phần thưởng EXP trước khi áp dụnginit_plugin_suite_user_engine_exp_required– Chỉnh sửa EXP cần thiết cho mỗi cấp độinit_plugin_suite_user_engine_checkin_milestones– Đặt các mốc ngày chuỗi điểm danhinit_plugin_suite_user_engine_format_inbox– Chỉnh sửa dữ liệu hộp thư đã định dạnginit_plugin_suite_user_engine_render_level_badge– Tùy chỉnh HTML của huy hiệu cấp độinit_plugin_suite_user_engine_inbox_insert_data– Chỉnh sửa dữ liệu hộp thư trước khi chèn vào cơ sở dữ liệuinit_plugin_suite_user_engine_validate_register_fields– Kiểm tra hoặc chỉnh sửa các trường đăng ký trước khi tạo tài khoảninit_plugin_suite_user_engine_after_register– Hook sau khi đăng ký người dùng thành công (truyền ID người dùng và dữ liệu đã gửi)init_plugin_suite_user_engine_daily_tasks– Thêm hoặc chỉnh sửa danh sách nhiệm vụ hàng ngày và logicinit_plugin_suite_user_engine_captcha_bank– Mở rộng hoặc chỉnh sửa ngân hàng câu hỏi captcha nội bộ dùng để xác thực dự phònginit_plugin_suite_user_engine_format_log_message– Tùy chỉnh cách hiển thị thông báo nhật ký giao dịch, có thể truy cập dữ liệu mục, nguồn, loại, và số lượnginit_plugin_suite_user_engine_should_keep_original– Ghi đè quyết định giữ nguyên ảnh đại diện gốc đã tải lên (GIF hoặc định dạng khác)init_plugin_suite_user_engine_vip_expire_soon_threshold– Chỉnh sửa ngưỡng (tính bằng giây) dùng để xác định khi nào VIP được coi là sắp hết hạninit_plugin_suite_user_engine_body_vip_classes– Thêm, xóa, hoặc chỉnh sửa các lớp CSS liên quan đến VIP được áp dụng cho phần tử<body>init_plugin_suite_user_engine_theme_colors– Chỉnh sửa hệ thống màu theme (màu chính và màu đang hoạt động)init_plugin_suite_user_engine_streak_restore_max_days– Chỉnh sửa số ngày điểm danh bị bỏ lỡ tối đa mà người dùng có thể bù để giữ chuỗi (trả về0để tắt tính năng này cho người dùng đó)init_plugin_suite_user_engine_streak_restore_cost– Chỉnh sửa chi phí Coin để giữ chuỗi điểm danh (nhận tổng chi phí, số ngày bỏ lỡ, và ID người dùng)init_plugin_suite_user_engine_lostpassword_modal_enabled– Bật hoặc tắt form quên mật khẩu bên trong modal đăng nhập (nhận giá trị hiện tại và các cài đặt của plugin)
Action
init_plugin_suite_user_engine_level_up– Khi người dùng lên cấpinit_plugin_suite_user_engine_exp_added– Sau khi EXP được thêminit_plugin_suite_user_engine_transaction_logged– Sau khi Coin/Cash được ghi vào nhật kýinit_plugin_suite_user_engine_exp_logged– Sau khi nhật ký EXP được ghi lạiinit_plugin_suite_user_engine_inbox_inserted– Sau khi có tin nhắn hộp thư mớiinit_plugin_suite_user_engine_referral_completed– Khi việc giới thiệu bạn bè hoàn tấtinit_plugin_suite_user_engine_after_checkin– Sau khi người dùng điểm danhinit_plugin_suite_user_engine_streak_restored– Sau khi người dùng trả Coin để giữ chuỗi điểm danh (ID người dùng, số ngày bỏ lỡ, chi phí, chuỗi mới)init_plugin_suite_user_engine_after_claim_reward– Sau khi người dùng nhận thưởnginit_plugin_suite_user_engine_vip_purchased– Sau khi VIP được muainit_plugin_suite_user_engine_add_exp– Được kích hoạt khi thêm EXP qua hookinit_plugin_suite_user_engine_add_coin– Được kích hoạt khi thêm Coin qua hookinit_plugin_suite_user_engine_coin_changed– Sau khi số dư Coin của người dùng được cập nhậtinit_plugin_suite_user_engine_cash_changed– Sau khi số dư Cash của người dùng được cập nhậtinit_plugin_suite_user_engine_admin_send_notice– Khi quản trị viên gửi thông báo qua wp-admin.
Endpoint REST API
Cơ sở: /wp-json/inituser/v1/
POST /register– Tạo tài khoản người dùng mớiPOST /checkin– Điểm danh hàng ngày (nội dung JSON tùy chọn:prompt_restore,restore_streak,restore_costcho tính năng Khôi phục chuỗi điểm danh)POST /claim-reward– Nhận thưởng sau thời gian trực tuyếnGET /transactions– Lấy nhật ký giao dịch Coin/CashGET /exp-log– Lấy nhật ký EXPGET /inbox– Lấy tin nhắn hộp thưPOST /inbox/mark-read– Đánh dấu một tin nhắn đã đọcPOST /inbox/mark-all-read– Đánh dấu tất cả đã đọcPOST /inbox/delete– Xóa một tin nhắnPOST /inbox/delete-all– Xóa toàn bộ tin nhắnPOST /vip/purchase– Mua gói VIPGET /referral-log– Lấy lịch sử giới thiệu bạn bèPOST /avatar– Tải lên ảnh đại diện mớiPOST /avatar/remove– Xóa ảnh đại diện tùy chỉnh và khôi phục về mặc địnhGET /profile/me– Lấy hồ sơ người dùng hiện tạiPOST /profile/update– Cập nhật thông tin hồ sơGET /daily-tasks– Lấy danh sách nhiệm vụ hàng ngày đã hoàn thành và phần thưởngPOST /exchange– Quy đổi Cash Coin theo tỷ giáPOST /redeem-code– Đổi mã quà tặng (trả về phần thưởng Coin/Cash)
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















Cài đặt
- Tải plugin lên
/wp-content/plugins/init-user-engine - Kích hoạt qua màn hình Plugin
- Dùng
[init_user_engine]trong bất kỳ trang/bài viết/mẫu nào - Vậy là xong – các modal và logic sẽ tự động tải
Hỏi đáp
-
Làm sao để tùy chỉnh giao diện?
-
Frontend được viết bằng Vanilla JS theo module với cấu trúc HTML tối giản.
Ghi đè kiểu dáng qua theme của bạn hoặc chèn JS tùy chỉnh khi cần. -
Dữ liệu người dùng được lưu trữ ở đâu?
-
user_meta: EXP, cấp độ, Coin, Cash, VIP, giới thiệu bạn bèwp_init_user_engine_inbox: tin nhắn hộp thư (bảng DB tùy chỉnh)
-
Tôi có thể mở rộng hoặc tích hợp plugin này không?
-
Có. Plugin được xây dựng xoay quanh hook của WordPress và REST API. Bạn có thể chèn logic qua
add_action,add_filter, hoặc tự xây dựng giao diện riêng dựa trên các endpoint. -
Plugin có tương thích với WooCommerce hoặc BuddyPress không?
-
Không chính thức, nhưng plugin có tính module hóa và có thể tích hợp qua mã hoặc các addon trong tương lai.
-
Làm sao để gửi tin nhắn thủ công đến người dùng?
-
Vào Users Init User Engine Send Notification trong wp-admin.
Bạn có thể tìm người dùng, tùy chỉnh loại tin nhắn, liên kết, mức ưu tiên, và thậm chí đặt thời hạn.
Đánh giá
Người đóng góp & Lập trình viên
“Init User Engine – Gamified, Fast, Frontend-First” 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 User Engine – Gamified, Fast, Frontend-First” đã đượ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 User Engine – Gamified, Fast, Frontend-First” 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
1.6.6 – 1 Tháng 10, 2026
- Đã thêm Quên mật khẩu trong Modal (Init User Engine Cài đặt, ngay bên dưới Đăng nhập sau khi đăng ký). Liên kết “Quên mật khẩu?” trong modal đăng nhập giờ đây sẽ mở một form quên mật khẩu ngay bên trong modal đó thay vì chuyển hướng người truy cập đến
wp-login.php- Được bật theo mặc định. Hãy tắt đi nếu trang web của bạn chưa thể gửi email — khi đó liên kết sẽ dẫn đến trang
wp-login.php?action=lostpasswordmặc định như trước đây - URL Quên mật khẩu tùy chỉnh (Liên kết tùy chỉnh) vẫn được ưu tiên: khi tùy chọn này được thiết lập, liên kết sẽ luôn dẫn đến đó, bất kể tùy chọn này được cấu hình ra sao
- Sử dụng quy trình đặt lại mật khẩu gốc của WordPress: form gửi dữ liệu đến
wp-login.php?action=lostpassword, do đó email đặt lại mật khẩu, các hooklostpassword_form/lostpassword_postvà tính năng bảo vệ “Lost Password Form” của Turnstile đều tiếp tục hoạt động bình thường - Sau khi gửi, người truy cập sẽ quay lại đúng trang đó với modal đang mở: thông báo thành công trong form đăng nhập khi email đã được gửi, hoặc lỗi hiển thị trực tiếp trong form quên mật khẩu (người dùng không tồn tại, trường trống, gửi email thất bại, lỗi captcha). Bất kỳ lỗi nào khác sẽ giữ nguyên hành vi mặc định
wp-login.phpcủa WordPress để thông báo chính xác vẫn được hiển thị - Template
lostpassword-form.phpcó thể được ghi đè từgiao-diện-của-bạn/init-user-engine/; bất kỳ phần tử nào cũng có thể mở nó bằngdata-iue="lostpassword" - Đã thêm bộ lọc
init_plugin_suite_user_engine_lostpassword_modal_enabled
- Được bật theo mặc định. Hãy tắt đi nếu trang web của bạn chưa thể gửi email — khi đó liên kết sẽ dẫn đến trang
- Hiệu năng: script dành cho khách không còn chạy
MutationObservertrên toàn bộ<body>(trước đây nó kích hoạt mỗi khi DOM của trang thay đổi chỉ để gắn nút ẩn/hiện mật khẩu vào form đăng ký, vốn đã có sẵn trong trang) - Hiệu năng: bộ lọc
get_avatar_urlkhông còn chạy lại các callbackpre_get_avatar_datacủa mọi plugin cho từng ảnh đại diện; nó chỉ áp dụng logic ảnh đại diện riêng của Init User Engine (kết quả vẫn tương tự) - Hiệu năng: đếm ngược điểm danh hiện lưu trạng thái khi diễn ra sự kiện
pagehidethay vìbeforeunload, giúp trình duyệt có thể giữ trang trong bộ nhớ đệm tiến/lùi (back/forward cache) - Đã sửa: hook hủy kích hoạt (deactivation hook) đã được đăng ký với
includes/core.phpthay vì tệp plugin chính, do đó nó không bao giờ chạy và các sự kiện cron của plugin vẫn duy trì lịch trình sau khi hủy kích hoạt. Cả ba sự kiện định kỳ hiện đã được xóa khi hủy kích hoạt (chúng sẽ tự động được lên lịch lại khi kích hoạt lại) - Đã sửa: tác vụ dọn dẹp hai lần một ngày đã so sánh thời gian hết hạn transient (lưu theo UTC) với giờ địa phương của trang web, do đó trên các trang web ở múi giờ sớm hơn UTC, nó có thể xóa các captcha đăng ký và bộ đếm giới hạn tần suất (rate-limit) chưa hết hạn
- Đã sửa: trên các trang web sử dụng đường dẫn tĩnh dạng “Cơ bản” (REST URL dạng
?rest_route=/inituser/v1), các yêu cầu có thêm chuỗi truy vấn (query string) riêng bị hỏng: captcha toán học khi đăng ký không bao giờ tải, và phân trang Hộp thư, Lịch sử giao dịch, Nhật ký điểm kinh nghiệm bị lỗi. Các chuỗi truy vấn hiện được nối thêm bằng&khi REST URL đã có sẵn một chuỗi truy vấn - Đã cập nhật các tệp dịch
.pot/.po/.movới các chuỗi mới nêu trên (kèm bản dịch tiếng Việt), được tạo lại bằng WP-CLI
1.6.5 – 24 tháng 9, 2026
- Đã thêm Khôi phục chuỗi điểm danh (Init User Engine Settings Streak Recovery). Khi một thành viên bỏ lỡ vài ngày, giờ họ có thể chi Coin để giữ chuỗi điểm danh thay vì mất nó
- Hai cài đặt mới: Số ngày bỏ lỡ được phép (số ngày bỏ lỡ có thể bù,
0= tắt tính năng) và Chi phí Coin cho mỗi ngày bỏ lỡ (0= miễn phí). Tắt theo mặc định, nên không có gì thay đổi trên các site hiện có cho đến khi quản trị viên bật nó lên - Nhấp vào Điểm danh sau khi có khoảng trống sẽ mở modal tiêu chuẩn của plugin hiển thị chuỗi hiện tại, số ngày bỏ lỡ, tổng chi phí và số dư của thành viên, với hai lựa chọn: giữ chuỗi (trả tiền), hoặc đặt lại và vẫn điểm danh. Đóng modal không làm gì cả. Bỏ lỡ nhiều ngày hơn số cho phép sẽ đơn giản đặt lại chuỗi như trước
- Việc giữ chuỗi bù đắp các ngày bỏ lỡ nhưng không tính chúng là các lần điểm danh: chuỗi tiếp tục từ vị trí cũ và hôm nay cộng thêm +1, nên các phần thưởng mốc chuỗi (7/30/90…) hoạt động chính xác như trước
- Mỗi lần trừ tiền đều được ghi vào nhật ký giao dịch Coin với lý do dễ hiểu (ví dụ “Giữ chuỗi điểm danh (bỏ lỡ 2 ngày)”), hiển thị trong Lịch sử giao dịch của thành viên và trong metabox quản trị người dùng
- Frontend chỉ luôn hiển thị Nhãn Coin đã cấu hình, không bao giờ hiển thị chữ “Coin” viết cứng; mọi chuỗi frontend và lỗi mới đều nhận biết nhãn
- An toàn: giá được kiểm tra lại trên máy chủ đối chiếu với giá đã hiển thị cho thành viên (bị từ chối nếu đã thay đổi), số dư được xác minh ngay trước khi trừ tiền, và nếu không thể ghi mục nhật ký thì Coin sẽ được hoàn lại và chuỗi điểm danh được giữ nguyên
POST /checkincó thêm ba trường JSON tùy chọn:prompt_restore(trả lời với trạng tháirestore_availablethay vì điểm danh khi chuỗi có thể được giữ lại — không thay đổi gì),restore_streakvàrestore_cost. Các client không gửi các trường này sẽ hoạt động chính xác như trước- Đã thêm filter
init_plugin_suite_user_engine_streak_restore_max_daysvàinit_plugin_suite_user_engine_streak_restore_cost, cùng actioninit_plugin_suite_user_engine_streak_restored - Logic mới nằm trong
includes/streak-restore.php
- Hai cài đặt mới: Số ngày bỏ lỡ được phép (số ngày bỏ lỡ có thể bù,
- Đã sửa lỗi:
POST /checkintrước đây không có bảo vệ chống các yêu cầu chồng chéo, nên hai yêu cầu bắn ra cùng lúc đều có thể vượt qua kiểm tra “đã điểm danh hôm nay” và thưởng cho cùng một ngày hai lần. Giờ việc điểm danh được xử lý tuần tự theo từng người dùng với cùng mẫu mutex ngắn hạn dùng bởi các endpoint quy đổi; một yêu cầu đến khi một yêu cầu khác đang chạy sẽ nhận phản hồi409 busy - Đã sửa lỗi: các modal mở từ bảng điều khiển đã đăng nhập trước đây không bao giờ phát hiệu ứng mở. Các keyframe
fadeIn/slideDownmà#iue-modaltham chiếu chỉ tồn tại trongstyle-guest.css, vốn không được tải cho người dùng đã đăng nhập. Đã thêm keyframe có namespaceiue-fade-in/iue-slide-downvàostyle-user.css(đểfadeIn/slideDownriêng của theme không còn gây xung đột) cùng tùy chọn tắt quaprefers-reduced-motion - Đã sửa lỗi: để trống trường Nhãn Coin hoặc Nhãn Cash trước đây khiến frontend (dữ liệu bảng điều khiển, quyền lợi giới thiệu bạn bè, màn hình quy đổi và VIP) hiển thị tên tiền tệ trống, và tin nhắn hộp thư mua VIP có thể hiển thị nhãn trống. Giờ cả hai đều dùng “Coin” / “Cash” làm dự phòng thông qua các hàm hỗ trợ dùng chung
init_plugin_suite_user_engine_get_coin_label()/..._get_cash_label() - Đã sửa lỗi: sau một yêu cầu điểm danh thất bại (lỗi máy chủ, hoặc lỗi mạng), nút điểm danh trước đây chuyển thành “Đã điểm danh” hoặc quay về chữ “Check-in” chưa dịch (nó đọc một khóa dịch chưa bao giờ được định nghĩa); giờ nó quay lại nhãn bình thường, đã dịch và hiển thị lỗi
- Đã sửa lỗi: hook kích hoạt của plugin trước đây được đăng ký với
includes/init.phpthay vì tệp plugin chính, nên không bao giờ chạy và các bảng cơ sở dữ liệu chỉ được tạo sau đó, ở lầnadmin_initđầu tiên. Giờ nó chạy khi kích hoạt như dự định (kiểm tra phiên bản quaadmin_initvẫn giữ làm đường nâng cấp) - Đã cập nhật các tệp dịch
.pot/.po/.movới các chuỗi mới nêu trên (kèm bản dịch tiếng Việt), được tạo lại bằng WP-CLI
1.6.4 – 10 tháng 9, 2026
- Đã sửa lỗi: việc xóa vĩnh viễn một người dùng (từ Users All Users, xóa hàng loạt, hoặc endpoint REST Users) trước đây để lại lịch sử EXP và tin nhắn Hộp thư của người dùng đó mãi mãi trong cơ sở dữ liệu, vì không có gì dọn dẹp chúng sau khi tài khoản đã biến mất
- Giờ được móc vào action
deleted_usercủa lõi WordPress (kích hoạt cho cảwp_delete_user()đơn site vàwpmu_delete_user()multisite, nên một hook bao trùm cả hai): ngay khi một người dùng bị xóa vĩnh viễn, các dòng nhật ký EXP và mọi tin nhắn Hộp thư của họ cũng bị xóa theo - Nhật ký giao dịch Coin/Cash chủ ý được giữ nguyên không đổi — lịch sử ví góp phần vào thống kê toàn site và đối soát (tổng coin/cash đã phát hành, báo cáo doanh thu, v.v.), nên nó được chủ ý giữ lại ngay cả sau khi tài khoản người dùng không còn
- User meta
iue_*(chuỗi điểm danh, cờ thưởng đăng nhập, cờ thưởng hồ sơ…) không cần xử lý thêm — lõi WordPress đã xóa toàn bộ usermeta của người dùng trước khideleted_userđược kích hoạt - Đã thêm hook action
init_plugin_suite_user_engine_user_data_purged(kích hoạt với ID người dùng đã xóa ngay sau khi dọn dẹp) để các plugin/add-on khác có thể móc vào và dọn dẹp dữ liệu liên quan của riêng họ
- Giờ được móc vào action
- Không có chuỗi mới hướng đến người dùng trong phiên bản này, nên các tệp
.pot/.pokhông thay đổi
1.6.3 – 7 tháng 9, 2026
- Đã thêm tùy chọn mới “Đăng nhập sau khi đăng ký” (Init User Engine Settings General, tắt theo mặc định). Khi bật, một lần đăng ký thành công qua endpoint REST của plugin (
/register) sẽ đăng nhập ngay cho người dùng mới (wp_set_auth_cookie()+wp_set_current_user(), kèm theo actionwp_logintiêu chuẩn để tương thích với các plugin/theme khác) thay vì để họ ở lại form Đăng nhập- Form đăng ký ở frontend giờ tải lại trang sau khi tự động đăng nhập thành công (thay vì chuyển sang form Đăng nhập) để giao diện, nonce, và ảnh đại diện phản ánh ngay trạng thái đã đăng nhập
- Vẫn tắt theo mặc định để đăng ký và đăng nhập vẫn là hai bước rõ ràng, riêng biệt trừ khi chủ site chủ động bật
- Đã sửa lỗi: một lần đăng nhập thất bại từ modal đăng nhập của plugin (qua
wp_login_form()) trước đây quay về hành vi mặc định của WordPress và chuyển hướng người truy cập đếnwp-login.php, gây cảm giác lạc lõng trên các site chưa từng công khai trang đó. Giờ đăng nhập thất bại sẽ chuyển hướng trở lại đúng trang mà người truy cập đang ở, kèm modal đăng nhập tự động mở lại và một thông báo lỗi nội tuyến (sai tên đăng nhập, sai mật khẩu, hoặc thiếu trường)- Được triển khai qua action
wp_login_failedkết hợp vớiwp_get_referer(); chỉ can thiệp khi lần đăng nhập đến từ một trang frontend thông thường, nên các lần đăng nhập trực tiếp trênwp-login.phphoặc trongwp-adminvẫn giữ hành vi gốc của WordPress không đổi - Việc chuyển hướng dùng hai tham số truy vấn ngắn hạn (
iue_login_failed,iue_login_code) màassets/js/guest.jsđọc một lần để mở modal và hiển thị đúng thông báo, sau đó xóa ngay khỏi URL quahistory.replaceState()nên việc tải lại hay chia sẻ liên kết không bao giờ hiển thị lại thông báo
- Được triển khai qua action
- Đã làm mới
readme.txt— phần Tính năng được viết lại hoàn toàn để khớp với bộ tính năng thực tế hiện tại của plugin (Turnstile/captcha, chặn Yêu cầu đăng nhập, Mã đổi thưởng/VIP kèm xuất CSV, Thống kê Hộp thư, metabox quản trị người dùng, và nhiều hơn nữa), một số trong đó đã được triển khai ở các phiên bản trước nhưng chưa từng được ghi lại ở đây - Đã cập nhật các tệp dịch
.pot/.povới các chuỗi mới nêu trên (kèm bản dịch tiếng Việt)
1.6.2 – 4 tháng 9, 2026
- Thay đổi: một tin nhắn Hộp thư được ghim giờ chỉ ở lại vị trí trên cùng khi nó chưa đọc. Ngay khi được đánh dấu đã đọc (một tin nhắn hoặc “đánh dấu tất cả đã đọc”), nó sẽ tự động bỏ ghim và hoạt động như mọi tin nhắn khác, nên các tin nhắn đã đọc không còn chiếm chỗ ở đầu modal Hộp thư
- Được triển khai bằng cách đặt
pinnedvề lại0trong chính câu truy vấnUPDATEđã đặt một tin nhắn thànhread(init_plugin_suite_user_engine_mark_inbox_read()và endpoint REST “đánh dấu tất cả đã đọc”) — không thêm truy vấn, không thay đổiSELECT/ORDER BYcủa Hộp thư, và không cần chỉ mục cơ sở dữ liệu mới - Đã thêm một lượt điền dữ liệu một lần (chạy một lần khi nâng cấp, cùng cơ chế đã dùng cho cập nhật schema) xóa
pinnedcho bất kỳ tin nhắn có sẵn nào đã ghim và đã đọc trước bản cập nhật này - Đã thêm lớp bảo vệ phía client trong bộ dựng Hộp thư để biểu tượng ghim không bao giờ hiện trên một tin nhắn đã đọc, ngay cả trong khoảnh khắc ngắn trước khi việc điền dữ liệu ở trên chạy xong
- Được triển khai bằng cách đặt
- Đã cập nhật các tệp dịch
.pot/.po(không cần chuỗi mới cho thay đổi này; các chuỗi hiện có đã đủ)
1.6.1 – 4 tháng 9, 2026
- Đã thêm Xuất CSV cho cả hai màn hình danh sách mã (User Engine Redeem Codes / VIP Codes)
- Nút “Xuất CSV” mới bên cạnh tiêu đề “Existing Redeem Codes” / “Existing VIP Codes”, xuất toàn bộ danh sách (mọi trang, không chỉ trang hiện tại) thành một tệp
.csvcó thể tải về - Các cột CSV của Mã đổi thưởng: ID, Mã, Loại, ID người dùng bị khóa, Tên đăng nhập bị khóa, Số lượng Coin, Số lượng Cash, Số lần dùng tối đa, Số lần đã dùng, Trạng thái, Có hiệu lực từ, Có hiệu lực đến, Người tạo, Ngày tạo, Ngày cập nhật
- Các cột CSV của Mã VIP: giống như trên, với Số ngày VIP thay cho Số lượng Coin/Cash
- Dữ liệu được truyền trực tiếp đến trình duyệt theo lô 500 dòng để mức sử dụng bộ nhớ luôn thấp ngay cả trên các site có nhiều mã
- Tệp được ghi với UTF-8 BOM để mở đúng cách trong Excel, và mọi ô đều được làm sạch để chống chèn công thức/lệnh CSV (các giá trị bắt đầu bằng
=,+,-,@, hoặc tab đều được thêm tiền tố an toàn) - Được kiểm soát bằng quyền
manage_optionscùng một nonce riêng cho mỗi màn hình (iue_redeem_code_export_csv/iue_vip_code_export_csv)
- Nút “Xuất CSV” mới bên cạnh tiêu đề “Existing Redeem Codes” / “Existing VIP Codes”, xuất toàn bộ danh sách (mọi trang, không chỉ trang hiện tại) thành một tệp
- Đã cập nhật các tệp dịch
.pot/.povới các chuỗi mới nêu trên (kèm bản dịch tiếng Việt);.mokhông được xây dựng lại trong thay đổi này
1.6.0 – 2 tháng 9, 2026
- Đã thêm tùy chọn mới “Yêu cầu đăng nhập để truy cập site” (Init User Engine Settings General). Khi bật, người truy cập chưa đăng nhập sẽ không còn thấy nội dung thực của site trên bất kỳ trang nào
- Thay vào đó, họ thấy một trang trống với màu theme của plugin cùng modal đăng nhập tích hợp sẵn tự động mở, để họ có thể đăng nhập mà không cần rời trang
- Được triển khai qua
template_redirect, nênwp_head()/wp_footer()vẫn chạy đầy đủ — modal đăng nhập của riêng plugin, và mọi hook theme/plugin khác gắn vào các action đó, vẫn hoạt động bình thường - Các yêu cầu REST API, AJAX, cron, feed, và robots.txt luôn được loại trừ và không bao giờ bị chặn bởi tùy chọn này
- Đã thêm filter
init_plugin_suite_user_engine_require_login_bypassđể các plugin/theme khác có thể loại trừ các yêu cầu cụ thể (ví dụ URL callback thanh toán) khỏi lớp chặn - Các tệp mới riêng
assets/css/require-login.cssvàassets/js/require-login.jsdựng nền cho lớp chặn và tự động mở modal đăng nhập, được tách riêng khỏi kết quả xuất PHP để tuân thủ chuẩn viết mã
- Đã sửa lỗi: script khách ở frontend (
guest.js) trước đây chỉ công khaiwindow.openLoginModal(và thiết lập Escape để đóng, Alt+L, và mở qua hash) khi có phần tử ảnh đại diện trên trang. Các trang không có shortcode/widget ảnh đại diện — kể cả chặn Yêu cầu đăng nhập mới — hoàn toàn không thể mở modal đăng nhập. Giờ phần tử ảnh đại diện là tùy chọn; modal và các cách kích hoạt của nó hoạt động trên mọi trang miễn là modal được dựng ra (luôn đúng quawp_footer) - Đã cập nhật các tệp dịch
.pot/.povới các chuỗi mới nêu trên (kèm bản dịch tiếng Việt);.mokhông được xây dựng lại trong thay đổi này
1.5.9 – 29 tháng 8, 2026
- Thay đổi: “Gửi thông báo” (Init User Engine Send Notification) giờ dùng loại tin nhắn riêng admin thay vì dùng lại system, vốn cũng được dùng nội bộ bởi nhiều thông báo tự động không liên quan (đã xóa VIP, đổi mã thành công, mã VIP thành công). Thông báo do quản trị viên gửi và thông báo hệ thống tự động giờ được tách bạch rõ ràng
- Tab bộ lọc “System” trong Hộp thư hướng đến người dùng vẫn bao gồm các tin nhắn do quản trị viên gửi, giống như trước
- Các tin nhắn đã gửi trước đây (loại
system) không được di chuyển dữ liệu và vẫn hiển thị bình thường trong Hộp thư; chỉ các thông báo mới gửi mới dùng loạiadminmới
- Đã sửa lỗi: “Ghim tin nhắn này” trên màn hình Gửi thông báo trước đây không có tác dụng nhìn thấy được ngoài việc lưu một cờ — giờ các tin nhắn đã ghim luôn nổi lên đầu danh sách Hộp thư, trước các tin nhắn chưa ghim, trên mọi tab bộ lọc
- Đã sửa lỗi: trường “Thời hạn” trên Gửi thông báo trước đây được lưu vào cơ sở dữ liệu nhưng chưa bao giờ thực sự được đọc lại ở bất kỳ đâu — nó hoàn toàn không có tác dụng, với bất kỳ tin nhắn nào
- Đã làm rõ và giới hạn hành vi để hoạt động cùng với việc sửa ghim ở trên: Thời hạn giờ chỉ áp dụng cho các tin nhắn đã ghim — khi qua thời gian, tin nhắn sẽ tự động bỏ ghim (nó vẫn hiển thị đầy đủ trong Hộp thư như một tin nhắn thông thường, không có gì bị ẩn hay xóa). Các tin nhắn chưa ghim hoàn toàn bỏ qua trường này và không bao giờ hết hạn
- Đã thêm tác vụ cron hàng giờ (
init_plugin_suite_user_engine_unpin_expired_inbox) xóa cờpinnedtrên các tin nhắn đã quaexpire_at; nó chỉ luôn cập nhật một cột đó, không bao giờ xóa hay thay đổi nội dung tin nhắn - Đã thêm mô tả nội tuyến trên màn hình Gửi thông báo làm rõ phạm vi này cho cả ô đánh dấu “Ghim tin nhắn này” và trường “Thời hạn”
- Đã sửa lỗi: bộ lọc Khoảng thời gian (7/30/90 ngày qua, Mọi thời điểm) trên trang Thống kê Hộp thư (Users Init User Engine Inbox Statistics) trước đây chỉ ảnh hưởng đến biểu đồ “Hoạt động hàng ngày”; mọi con số khác trên trang (Tổng/Chưa đọc/Tin ghim, Tổng người nhận, Loại tin nhắn, Mức ưu tiên, Người nhận hàng đầu, Người nhận đang hoạt động, Ngày cao điểm) âm thầm bỏ qua bộ lọc và luôn hiển thị số liệu toàn thời gian (hoặc 30/90 ngày viết cứng)
- Tất cả các mục trên giờ đều giới hạn đúng theo khoảng thời gian đã chọn
- “Người nhận đang hoạt động” và “Ngày cao điểm” không còn dùng khung 30/90 ngày viết cứng — chúng tuân theo khoảng thời gian đã chọn như mọi thứ khác; nhãn được cập nhật từ “Active Recipients (30d)” thành “Active Recipients” cho khớp
- “Đã gửi hôm nay”, “Tuần này”, và “Tháng này” chủ ý vẫn là các mốc lịch cố định, độc lập với bộ chọn Khoảng thời gian
- Đã thêm bộ nhớ đệm ngắn hạn (5 phút) cho trang Thống kê Hộp thư, dùng chung cho mọi phần thống kê, để tránh chạy lại khoảng 10 truy vấn tổng hợp mỗi khi tải trang/thay đổi khoảng thời gian
- Đã thêm chỉ mục cơ sở dữ liệu trên
created_atcho bảng hộp thư để giữ các truy vấn thống kê nhận biết khoảng thời gian luôn nhanh trên các bảng lớn. Được áp dụng tự động và an toàn quadbDelta()ở lần tải trang quản trị tiếp theo — dữ liệu hiện có không bị ảnh hưởng, không cần thao tác DB thủ công hay cài lại - Đã cập nhật các tệp dịch
.pot/.pocho những thay đổi trên: thêmadmin/Active Recipients/ hai chuỗi mô tả mới cho Ghim & Thời hạn, loại bỏ chuỗisystem(dạng nhãn độc lập) /Active Recipients (30d)không còn dùng, và sửa các tham chiếu dòng nguồn đã lỗi thời
1.5.8 – 22 tháng 8, 2026
- Đã sửa lỗi: nhiều thông báo hướng đến người dùng và thông báo lỗi REST API trước đây bỏ qua Nhãn Coin / Nhãn Cash do quản trị viên cấu hình và luôn hiển thị chữ tiếng Anh viết cứng “Coin”/”Cash” bất kể nhãn tùy chỉnh đã đặt trong Settings Currency Labels
- Bị ảnh hưởng: thông báo thưởng lên cấp, thông báo thưởng đăng ký/đơn hàng/đánh giá, mọi thông báo lỗi quy đổi Coin ⇄ Cash (số tiền không hợp lệ, giới hạn tối thiểu/tối đa, không đủ số dư, kết quả bằng 0, cập nhật thất bại), và thông báo lỗi mua VIP (sai loại tiền tệ, không đủ số dư)
- Tất cả các mục trên giờ đều nhất quán dùng nhãn đã cấu hình, khớp với hành vi đã dùng bởi Mã đổi thưởng, Nạp tiền, và thông báo mua VIP thành công
- Đã thêm các hàm hỗ trợ dùng chung
init_plugin_suite_user_engine_get_coin_label()vàinit_plugin_suite_user_engine_get_cash_label()trongincludes/utils.php
- Đã sửa lỗi: JS frontend (
member.js) trước đây tham chiếu một chuỗi dịchexchange_insufficient_coincho màn hình quy đổi CoinCash mà chưa bao giờ được bản địa hóa từ PHP, âm thầm dùng chuỗi “Not enough Coin.” viết cứng, không thể dịch; giờ được bản địa hóa đúng cách và nhận biết nhãn - Đã loại bỏ một khóa mảng trùng lặp/thừa còn sót lại trong dữ liệu bản địa hóa frontend (
exchange_insufficient) vốn bị ghi đè ngay lập tức và chưa bao giờ thực sự được dùng - Đã cập nhật các tệp dịch
.pot/.pocho khớp: gộp các cặp tin nhắn Coin/Cash trùng lặp thành các chuỗi nhận biết nhãn dùng chung; bản dịch tiếng Việt giờ nhất quán dùng “Coin” thay vì cách gọi “xu”/”đồng xu” như trước
1.5.7 – 16 tháng 8, 2026
- Đã thêm trường Ngày sinh vào modal Chỉnh sửa hồ sơ ở frontend, được lưu theo từng người dùng thay vì một con số tuổi thô để luôn chính xác theo thời gian mà người dùng không cần nhập lại
- Trường REST mới
dobtrên cảGET /profile/mevàPOST /profile/update - Kiểm tra phía máy chủ từ chối các ngày sai định dạng, ngày trong tương lai, và ngày cũ hơn 120 năm; dữ liệu không hợp lệ bị từ chối trước khi bất kỳ trường hồ sơ nào khác được lưu
- Trường REST mới
- Đã thêm hàm hỗ trợ
init_plugin_suite_user_engine_get_age( $user_id )— tính tuổi hiện tại của người dùng từ ngày sinh đã lưu, trả về0nếu chưa đặt - Đã thêm chuỗi i18n mới cho trường Ngày sinh và các thông báo kiểm tra của nó
1.5.6 – 16 tháng 8, 2026
- Đã thêm Mã VIP — một hệ thống mã riêng để cấp ngày thành viên VIP, bên cạnh Mã đổi thưởng Coin/Cash hiện có
- Trang quản trị mới (User Engine VIP Codes) với cùng quy trình như Mã đổi thưởng: đơn/hàng loạt, dùng nhiều lần, và mã khóa theo người dùng, lịch sử sử dụng, tắt/xóa
- Endpoint REST mới
POST /redeem-vip-code, dùng cùng quy trình đổi mã có khóa giao dịch, an toàn với tranh chấp thời điểm như Mã đổi thưởng - Tùy chọn mới “Đổi mã VIP” trong bảng điều khiển người dùng ở frontend, kèm modal riêng
- Đã thêm cài đặt Tắt chồng gói VIP
- Khi bật, một người dùng có VIP đang hoạt động không thể mua hoặc đổi thêm gói/mã VIP khác cho đến khi gói hiện tại hết hạn, thay vì gia hạn nó
- Được áp dụng nhất quán trên cả việc mua bằng Coin/Cash lẫn đổi Mã VIP, với khóa DB ở mức dòng khi đổi mã để ngăn hai yêu cầu đồng thời cùng chồng gói VIP trước khi một trong hai lượt ghi hoàn tất
- Đã thêm cài đặt Tắt mua VIP
- Tắt hoàn toàn việc mua/kích hoạt VIP cho mọi người dùng; ẩn giao diện mua và mục menu “Đổi mã VIP”, và chặn cả endpoint mua lẫn đổi Mã VIP
- Các thành viên VIP đang hoạt động không bị ảnh hưởng — chỉ các lượt kích hoạt mới bị chặn
- Thay đổi: gói VIP Trọn đời giờ lưu trữ 99999 ngày thay vì 9999 (trước đây chỉ khoảng 27 năm, gây nhầm lẫn cho người dùng); mọi logic phát hiện trọn đời hiện có vẫn tương thích với dữ liệu cũ
- Đã thêm chuỗi i18n mới cho Mã VIP, chồng gói VIP, và thông báo tắt mua VIP
1.5.5 – 11 tháng 8, 2026
- Đã thêm bảo vệ Cloudflare Turnstile cho các form mặc định của WordPress
- Mở rộng cùng widget Turnstile sang các form Đăng nhập, Đăng ký, và Quên mật khẩu gốc của WordPress (
wp-login.php), không chỉ endpoint đăng ký riêng của plugin này - Ba nút bật/tắt mới trong Cloudflare Turnstile Protect Default WordPress Forms: Form Đăng nhập, Form Đăng ký, Form Quên mật khẩu
- Bảo vệ đăng nhập bao trùm cả trang
wp-login.phpgốc lẫn modal đăng nhập riêng của plugin, vì cả hai đều gửi qua cùng luồng đăng nhập của WordPress - Bảo vệ đăng ký áp dụng cho trang
wp-login.php?action=registergốc của WordPress (chỉ liên quan khi “Anyone can register” được bật), độc lập với form/endpoint đăng ký riêng của plugin này - Cả ba đều yêu cầu thiết lập cả hai khóa Turnstile và chỉ có hiệu lực khi “Tắt Captcha” đang tắt, giống như captcha đăng ký hiện có
- Script Turnstile cho modal đăng nhập chỉ tải khi modal thực sự được mở, khớp với hành vi tải chậm hiện có của widget đăng ký
- Mở rộng cùng widget Turnstile sang các form Đăng nhập, Đăng ký, và Quên mật khẩu gốc của WordPress (
- Đã thêm nút Kiểm tra API cho Cloudflare Turnstile
- Xác minh Secret Key với Cloudflare trực tiếp từ trang Cài đặt, trước khi lưu
- Site Key chỉ có thể được xác nhận đầy đủ khi widget thực sự hiển thị trong trình duyệt (ví dụ trên form đăng ký)
- Đã thêm chuỗi i18n mới cho cài đặt bảo vệ form Turnstile và nút Kiểm tra API
1.5.4 – 11 tháng 8, 2026
- Đã sửa lỗi: metabox Tổng quan quản trị người dùng (Giao dịch gần đây / Dữ liệu liên quan EXP gần đây) trước đây ngừng hiển thị hoạt động mới sau khi di chuyển từ meta sang bảng tùy chỉnh (v1.5.x). Nguyên nhân gốc: bộ đọc nhật ký giao dịch/EXP truy vấn 100 mục cũ nhất (
ORDER BY logged_at ASC LIMIT 100) thay vì các mục gần đây nhất, nên các mục được ghi sau khi người dùng vượt quá 100 giao dịch tổng cộng không bao giờ hiển thị. Giờ lấy và hiển thị đúng 100 mục mới nhất - Cải thiện: metabox Tổng quan quản trị người dùng giờ chỉ chạy một truy vấn tổng hợp duy nhất cho số liệu hộp thư (tổng / 7 ngày qua / thời gian tin nhắn gần nhất) thay vì 3 truy vấn
COUNT/MAXriêng biệt, giảm số lượt truy vấn cơ sở dữ liệu khi tải trang hồ sơ - Cải thiện: dọn dẹp nhỏ việc xử lý mảng dư thừa khi dựng danh sách Giao dịch gần đây
Đã kiểm tra đến: 7.1
1.5.3 – 29 tháng 7, 2026
- Đã thêm quy đổi tiền tệ hai chiều giữa Cash và Coin
- Endpoint REST mới
POST /exchange-reverseđể quy đổi Coin Cash - Modal quy đổi giờ hỗ trợ chuyển đổi giữa Cash Coin và Coin Cash
- Đã thêm cài đặt tỷ giá quy đổi độc lập cho cả hai chiều
- Giới hạn tần suất, tính bất biến (idempotency), và khóa mutex được áp dụng cho cả hai endpoint
- Endpoint REST mới
- Đã thêm thưởng VIP cho Cash
- Người dùng VIP giờ nhận thêm Cash thưởng có thể cấu hình (%) trên mọi lần cộng Cash
- Phù hợp với hành vi thưởng VIP hiện có cho Coin và EXP
- Đã thêm mua VIP bằng Cash
- Các gói VIP giờ có thể được định giá và mua bằng Cash thay vì Coin
- Cài đặt mới để chọn loại tiền tệ thanh toán: chỉ Coin, chỉ Cash, hoặc cả hai
- Khi đặt là Both, người dùng có thể chuyển đổi giữa Coin và Cash trong modal mua hàng
- Nhật ký mua VIP giờ ghi lại loại tiền tệ đã dùng cho mỗi giao dịch
- Đã thêm chuỗi i18n mới cho chiều quy đổi, lựa chọn tiền tệ VIP, và thông báo liên quan đến Cash
1.5.2 – 17 tháng 5, 2026
- Đã cập nhật CSS dashicon tùy chỉnh để dùng
currentColor, tương thích hoàn toàn với các bảng màu quản trị của WordPress - Đã loại bỏ màu biểu tượng viết cứng gây xung đột với các biến màu nhận biết theme
- Đảm bảo tương thích với hệ thống màu quản trị đã cập nhật của WordPress 7.0
1.5.1 – 22 tháng 4, 2026
- Đã tái cấu trúc kiến trúc di chuyển dữ liệu để dùng WP-Cron tự lặp thay vì chạy qua admin_init
- Giới thiệu trình chạy di chuyển dữ liệu ngầm (
init_plugin_suite_iue_migration_event) với tự động lên lịch lại - Đã thêm cơ chế khóa dựa trên transient để ngăn việc di chuyển dữ liệu chạy đồng thời
- Quy trình di chuyển dữ liệu giờ hoàn toàn tách biệt khỏi lưu lượng truy cập quản trị và chạy đáng tin cậy trong môi trường ít lưu lượng
- Cải thiện độ ổn định và tính nhất quán của việc di chuyển dữ liệu theo lô cho các tập dữ liệu lớn
- Hook kích hoạt giờ tự động lên lịch di chuyển dữ liệu nếu chưa hoàn tất
- Duy trì khả năng tương thích ngược đầy đủ với logic di chuyển dữ liệu và cấu trúc dữ liệu hiện có
1.5.0 – 21 tháng 4, 2026
- Đã di chuyển nhật ký giao dịch (coin/cash) và nhật ký EXP từ user meta sang các bảng cơ sở dữ liệu riêng
- Giới thiệu các bảng
init_user_engine_transaction_logvàinit_user_engine_exp_logđể tăng khả năng mở rộng - Tự động di chuyển dữ liệu từ user meta cũ (
iue_coin_cash_log,iue_exp_log) kèm dọn dẹp khi hoàn tất - Việc di chuyển dữ liệu chạy theo lô 200 người dùng để tránh hết thời gian chờ trên các site lớn và tiếp tục nếu bị gián đoạn
- Phân trang REST API cho lịch sử giao dịch và EXP giờ dùng COUNT + OFFSET thực sự thay vì tải toàn bộ bản ghi
- Đã thêm hỗ trợ
wp_cachecho việc đọc nhật ký giao dịch và EXP với tự động vô hiệu hóa khi ghi - Việc kiểm tra schema cơ sở dữ liệu giờ được kiểm soát theo phiên bản để tránh truy vấn dư thừa ở mỗi lần tải trang quản trị
- Schema và việc di chuyển dữ liệu cũng được kích hoạt qua
upgrader_process_completeđể xử lý cập nhật đáng tin cậy - Duy trì tương thích ngược đầy đủ: mọi hook, filter, và chuỗi i18n đều được giữ nguyên
1.4.9 – 15 tháng 4, 2026
- Đã thêm filter để ghi đè hệ thống màu theme (theme_color, theme_active_color)
- Giới thiệu hook màu tập trung để dễ tùy chỉnh hơn từ theme và addon
- Đảm bảo dự phòng an toàn khi filter trả về giá trị không đầy đủ hoặc không hợp lệ
1.4.8 – 25 tháng 3, 2026
- Đã sửa lỗi bộ đếm ngược điểm danh không bắt đầu trên thiết bị mới sau khi đăng nhập
- Bộ đếm ngược giờ đặt lại về đầy đủ thời lượng trên các thiết bị không nhận diện được
- Thời gian còn lại chỉ được lưu khi ẩn tab và khi rời trang, không phải mỗi giây
- Đã sửa việc so sánh ngày dùng định dạng nhận biết locale để tránh lệch múi giờ UTC
1.4.7 – 24 tháng 3, 2026
- Đã thêm hỗ trợ wp_cache cho số lượng Hộp thư chưa đọc
- Giảm tải cơ sở dữ liệu bằng cách lưu đệm các truy vấn COUNT(*) theo từng người dùng
- Bộ nhớ đệm tự động được xóa khi chèn, đọc, xóa, và các thao tác hàng loạt
- Giới thiệu các hàm hỗ trợ bộ nhớ đệm tập trung và cách đặt tên nhất quán
- Cải thiện hiệu năng và cấu trúc mã nội bộ để dễ bảo trì hơn
1.4.6 – 7 tháng 2, 2026
- Đã sửa logic tạo mã đổi thưởng để tôn trọng mã tùy chỉnh
- Mã dùng một lần giờ giữ nguyên đúng nội dung nhập khi số lượng là 1
- Tiền tố + hậu tố ngẫu nhiên chỉ áp dụng cho việc tạo hàng loạt (số lượng > 1)
- Mã dùng nhiều lần và mã bị khóa giờ không còn bị bắt buộc thêm hậu tố ngẫu nhiên
1.4.5 – 4 tháng 2, 2026
- Đã sửa lỗi phân trang Hộp thư không tuân theo bộ lọc đang hoạt động
- Tổng số tin nhắn và tổng số trang giờ được tính theo từng danh mục
- Ngăn số trang bị sai khi chuyển đổi giữa các bộ lọc
- Đảm bảo phân trang phía máy chủ chính xác và điều hướng nhất quán
1.4.4 – 4 tháng 2, 2026
- Đã thêm tạo hàng loạt cho mã đổi thưởng dùng một lần
- Hỗ trợ tạo theo số lượng với việc dùng tiền tố tự động
- Tạo hậu tố ngẫu nhiên 6 ký tự bằng
wp_generate_password() - Khi số lượng = 1, dùng đúng mã đã nhập (không thêm hậu tố ngẫu nhiên)
- Đã thêm thao tác xóa an toàn cho mã đổi thưởng (chỉ mã chưa dùng mới có thể bị xóa)
- Cải thiện quy trình tạo mã đổi thưởng với kiểm tra, làm sạch dữ liệu tốt hơn, và hành vi nhất quán giữa các chế độ
- Nâng cấp hệ thống Hộp thư với các bộ lọc theo danh mục
- Đã thêm các bộ lọc: Tất cả, Chưa đọc, Hệ thống, Phần thưởng, Hoạt động, Khác
- Lọc phía máy chủ với phân trang chính xác
- Nhóm các loại tin nhắn một cách hợp lý để trải nghiệm gọn gàng hơn
- Tinh chỉnh giao diện và nội bộ nhỏ để đảm bảo tính nhất quán và dễ bảo trì
1.4.3 – 28 tháng 1, 2026
- Đã thêm các lớp body nhận biết trạng thái VIP để tùy chỉnh frontend
- Tự động thêm
iue-vipcho người dùng VIP đang hoạt động - Thêm
iue-vip-expiredcho người dùng có VIP đã hết hạn - Thêm
iue-expire-soonkhi VIP sắp hết hạn (mặc định: ≤ 1 ngày)
- Tự động thêm
- Giới thiệu các hook mở rộng cho logic hiển thị VIP
- Filter mới
init_plugin_suite_user_engine_vip_expire_soon_thresholdđể tùy chỉnh khung thời gian “sắp hết hạn” - Filter mới
init_plugin_suite_user_engine_body_vip_classesđể lập trình viên có thể thêm hoặc chỉnh sửa các lớp body liên quan đến VIP
- Filter mới
- Cải thiện sự tách biệt giữa logic cốt lõi của VIP và lớp giao diện
- Cho phép tùy chỉnh nhẹ dựa trên CSS mà không cần kiểm tra điều kiện
- Giữ logic nghiệp vụ VIP tách biệt và ổn định
- Tinh chỉnh nội bộ nhỏ để đảm bảo tính nhất quán và dễ bảo trì lâu dài
1.4.2 – 19 tháng 11, 2025
- Đã cập nhật hệ thống ghi nhật ký giao dịch cho Coin & Cash
- Người dùng VIP giờ tự động nhận đúng % thưởng ngay trong mục nhật ký
- Các mục nhật ký giờ bao gồm:
original(số lượng trước khi thưởng)amount(số lượng sau khi thưởng)- Cờ
vip_bonusvà giá trịbonus_percent - Đảm bảo hành vi khớp hoàn toàn với
init_plugin_suite_user_engine_add_coin()
- Cải thiện độ chính xác của các thao tác liên quan đến VIP
- Thưởng chỉ áp dụng cho Coin và chỉ khi cộng thêm (không thưởng khi trừ tiền)
- Tránh sai lệch giữa lịch sử hiển thị và thay đổi số dư thực tế
- Tăng cường tính nhất quán dữ liệu nội bộ
- Các mục nhật ký được giới hạn ở 100 mục với cách cắt mảng ổn định
- Đảm bảo lưu trữ meta gọn gàng, nhẹ trong quá trình sử dụng lâu dài
- Tinh chỉnh cấu trúc nhỏ để dễ đọc hơn và các luồng mã dễ bảo trì
1.4.1 – 17 tháng 11, 2025
- Đã sửa logic thưởng VIP khi chỉnh sửa số dư Coin
- Phần trăm thưởng giờ chỉ áp dụng khi cộng thêm số lượng Coin dương
- Các điều chỉnh âm (trừ Coin) không còn nhận thưởng
- Đã thêm hỗ trợ cho
data-iue="register"- Tự động mở modal và chuyển thẳng sang tab Đăng ký
- Bỏ qua chế độ URL đăng ký tùy chỉnh (chỉ bật/tắt modal khi đang hoạt động)
- Cải thiện khả năng tương thích WPCS
- Đã thêm các quy tắc
phpcs:ignorecó chủ đích cho các cảnh báo sai của PluginCheck - Xử lý gọn gàng tên bảng động trong các câu truy vấn SQL đã chuẩn bị
- Đã thêm các quy tắc
- Không có thay đổi nào khác; bản vá nhanh để sửa đúng ngay lập tức
1.4.0 – 4 tháng 11, 2025
- Cải thiện mô hình bảo mật của Tổng quan quản trị người dùng
- Bất kỳ người dùng nào cũng có thể xem tổng quan của riêng mình (Coin, Cash, Cấp độ, thông tin VIP, Hộp thư)
- Các nút thao tác (Xóa VIP / Bật-tắt cấm tải ảnh đại diện / Thống kê Hộp thư) giờ chỉ dành riêng cho quản trị viên
- Giao diện tắt một cách mượt mà các thao tác bị hạn chế cho người dùng không phải quản trị viên thay vì ẩn chúng đi
- Đã thêm bảo vệ quyền hạn phía máy chủ cho các thao tác nhạy cảm
iue_remove_vipvàiue_toggle_avatar_bangiờ yêu cầu quyềnmanage_options- Các yêu cầu được kiểm tra bằng kiểm tra quyền hạn + xác thực nonce
- Ngăn việc chế tạo URL/REST hoặc gọi thủ công đến các endpoint admin-post
- Cải thiện hành vi thông báo quản trị
- Thông báo thành công/lỗi chỉ hiển thị cho quản trị viên
- Thông báo được giới hạn ở các màn hình
profile.phpvàuser-edit.php
- Dọn dẹp mã nhỏ và cải thiện tính nhất quán cho cấu trúc dễ bảo trì
Xem toàn bộ nhật ký thay đổi (mọi phiên bản): Init User Engine – Changelog
