Init Reading Position – Plugin ghi nhớ vị trí đọc, tự động cuộn lại khi người dùng quay lại bài viết

Phiên bản: 1.6 English version

Init Reading Position – Plugin ghi nhớ vị trí đọc, tự động cuộn lại khi người dùng quay lại bài viết
Init Reading Position là một plugin WordPress giúp người dùng quay lại đúng vị trí đã đọc trong bài viết trước đó. Khi người dùng cuộn qua bài viết, plugin sẽ tự động ghi nhớ vị trí và tự động cuộn lại vị trí đó khi họ quay lại – kể cả khi đã đăng nhập hay không. Được thiết kế siêu nhẹ, không dùng jQuery, không làm chậm website, hoàn toàn bằng JavaScript thuần và REST API nếu người dùng đã đăng nhập.

Tính năng chính

  • Ghi nhớ vị trí đọc bằng localStorage cho khách chưa đăng nhập.
  • Lưu vị trí đọc vào user_meta theo từng thiết bị nếu người dùng đã đăng nhập (PC, Mobile, Tablet…).
  • Tự động cuộn lại đúng đoạn đã đọc sau khi reload hoặc quay lại bài viết.
  • Tùy chỉnh post type được áp dụng qua giao diện cài đặt.
  • Không thêm bảng, không tracking, không bloat – hoàn toàn clean và an toàn.
  • Không dùng jQuery, viết bằng Vanilla JS hiện đại.
  • Hỗ trợ filter init_plugin_suite_reading_position_delay để tùy chỉnh thời gian dừng trước khi lưu.

Dành cho cả khách và người dùng đã đăng nhập

  • Khách chưa đăng nhập sẽ được lưu bằng localStorage trình duyệt.
  • Người dùng đã đăng nhập được lưu vào user_meta theo từng bài viết và từng thiết bị, đảm bảo mỗi thiết bị nhớ đúng vị trí đã đọc của nó.

Tùy chỉnh dễ dàng

  • Bạn có thể chọn loại bài viết nào được kích hoạt chức năng này.
  • Hỗ trợ filter để dev tùy chỉnh delay lưu vị trí hoặc can thiệp logic lưu theo post_id.

Cài đặt nhanh

  1. Tải plugin và giải nén vào thư mục /wp-content/plugins/
  2. Kích hoạt qua menu Plugins trong admin
  3. Cấu hình các post type được hỗ trợ tại Settings → Reading Position
  4. Hoàn tất – plugin tự động hoạt động, không cần thêm shortcode hay block.

Hiệu suất và tương thích

  • Tương thích WordPress 5.5 trở lên
  • Hỗ trợ PHP 7.4+
  • Không phụ thuộc theme, tương thích với mọi giao diện phổ biến
  • Code tối ưu, không gây chậm site kể cả bài viết rất dài

Dành cho Developer

  • Filter init_plugin_suite_reading_position_delay để tùy chỉnh debounce khi lưu vị trí
  • Filter init_plugin_suite_reading_position_meta_key để tùy chỉnh tên meta key lưu
  • Filter init_plugin_suite_reading_position_data_to_store để can thiệp nội dung lưu
  • Filter init_plugin_suite_reading_position_should_delete để quyết định có xoá vị trí đọc khi cuộn tới cuối
  • Filter init_plugin_suite_reading_position_localized_data để truyền thêm dữ liệu sang JS

Ví dụ sử dụng các filter mở rộng:

// Thay đổi thời gian debounce (mặc định: 1000ms)
add_filter('init_plugin_suite_reading_position_delay', fn() => 2000); // 2 giây

// Tuỳ chỉnh tên meta_key dùng để lưu vị trí đọc
add_filter('init_plugin_suite_reading_position_meta_key', function ($key, $post_id, $device) {
    return "_custom_rp_{$post_id}_{$device}"; // Ví dụ: _custom_rp_123_PC
}, 10, 3);

// Can thiệp dữ liệu sẽ lưu vào user_meta (mặc định gồm scrollTop, percent, screenHeight, updated)
add_filter('init_plugin_suite_reading_position_data_to_store', function ($data, $post_id, $device, $user_id) {
    $data['ip'] = $_SERVER['REMOTE_ADDR'] ?? ''; // Lưu thêm IP người dùng (tuỳ mục đích)
    return $data;
}, 10, 4);

// Quyết định có xoá dữ liệu vị trí đọc khi người dùng cuộn tới cuối hay không
add_filter('init_plugin_suite_reading_position_should_delete', fn($yes) => false); // Không xoá, giữ lại để đọc lại lần sau

// Bổ sung dữ liệu truyền sang JS (InitRPData)
add_filter('init_plugin_suite_reading_position_localized_data', function ($data, $post_id) {
    $data['debug'] = current_user_can('manage_options'); // Gửi thêm biến debug nếu là admin
    return $data;
});

Bắt đầu ngay

Bạn đang làm blog, web truyện, tạp chí số hay long-form content? Init Reading Position sẽ mang đến trải nghiệm người đọc mượt mà hơn bao giờ hết – nhẹ, thông minh và hoàn toàn tự động.

Đánh giá

5.0/5 (7)

Changelog

  • 1.6 – Tối ưu bulk query & cache đa thiết bị
    • Cải thiện: lấy reading position bằng 1 bulk query thay vì query từng device — giảm số lần truy vấn và tăng hiệu năng.
    • Thêm: bulk cache key cố định (pc_mobile_tablet) — đảm bảo cache đồng nhất và dễ invalidate.
    • Cải thiện: cache invalidation đồng bộ — xóa cả cache từng device và cache bulk, tránh dữ liệu stale.
    • Cải thiện: frontend nhận đầy đủ position của tất cả device — JS tự chọn đúng thiết bị runtime.
    • Sửa: cache key md5 trước đây không ổn định có thể gây stale cache — đã thay bằng key cố định.
    • Sửa: lỗi undefined savedPositions với guest user — luôn khởi tạo giá trị mặc định.
    • Không có breaking changes — REST API, database, localStorage và toàn bộ settings vẫn tương thích như cũ.
  • 1.5 – Tối ưu tracking & rate limit
    • Sửa: autoClearOnEnd không có selector sẽ không bao giờ kích hoạt xóa vị trí — đã fix để fallback về page-bottom đúng cách.
    • Cải thiện: cache bounds của scope element sau DOMContentLoaded, refresh khi resize — không còn gọi getBoundingClientRect() trên mỗi scroll event.
    • Cải thiện: device detection chuyển hoàn toàn sang JS — PHP không còn UA sniff phía server, tránh lệch device giữa lúc load trang và lúc save.
    • Cải thiện: rate limiting chuyển từ transient sang wp_cache — không còn ghi rác vào wp_options; hoạt động tốt nhất với Object Cache (Redis/Memcached), graceful degradation nếu không có.
    • Không có breaking changes — REST API, localStorage keys và toàn bộ settings vẫn tương thích như cũ.
  • 1.4 – Migration chạy nền bằng cron tự lặp
    • Refactor: Chuyển migration sang WP-Cron tự schedule thay vì chạy qua admin request.
    • Tự động lặp lại mỗi 30 giây cho đến khi hoàn tất toàn bộ dữ liệu.
    • Loại bỏ phụ thuộc vào traffic admin — migration chạy ổn định trong nền.
    • Thêm cơ chế lock để tránh chạy trùng (overlapping cron).
    • Luồng xử lý gọn hơn: tự start → chạy batch → tự dừng khi xong.
    • Giảm tải cho admin_init, tránh overhead không cần thiết.
    • Không có breaking changes — toàn bộ hệ thống vẫn tương thích như cũ.
  • 1.3 – Chuyển sang custom database & tối ưu hiệu năng
    • Chuyển từ user_meta sang custom database table để lưu vị trí đọc.
    • Tự động migrate dữ liệu cũ từ user_meta sang database mới (chạy an toàn trong nền).
    • Tối ưu schema với unique key (user_id, post_id, device) — đảm bảo mỗi bản ghi là duy nhất và hỗ trợ upsert hiệu quả.
    • Cải thiện hiệu năng đọc/ghi và khả năng scale cho website lớn.
    • Giảm số lượng request nhờ thêm throttle layer bên cạnh debounce hiện tại.
    • Chuẩn hoá giá trị device (pc, mobile, tablet) để đồng bộ với backend.
    • Thêm xử lý fail-safe cho REST API — tránh lỗi JS khi request thất bại.
    • Giảm đáng kể tải server cho user đăng nhập, tăng độ mượt khi đọc nội dung dài.
    • Tương thích ngược hoàn toàn: dữ liệu cũ được migrate dần, vẫn có fallback trong quá trình chuyển đổi.
    • Không thay đổi hành vi frontend — localStorage, REST API và tracking vẫn hoạt động như cũ.
  • 1.2 – Multi-selector & tự động xoá vị trí khi hết nội dung
    • Hỗ trợ nhiều CSS Selector cùng lúc — ví dụ: .entry-content, .post-content, #main.
    • Tiến trình đọc được theo dõi khi người dùng ở trong bất kỳ selector nào đã cấu hình.
    • Tự động xóa vị trí đọc khi kéo đến cuối vùng nội dung (selector).
    • Nếu tắt auto-clear theo selector, plugin sẽ quay về behavior cũ: xoá khi chạm đáy trang.
    • Tính toán phần trăm tiến trình ưu tiên selector đang ở trong phạm vi, fallback về trang khi ngoài mọi vùng.
    • Thêm tuỳ chọn mới trong trang cài đặt: “Auto-clear saved position at content end” (mặc định bật).
    • Không phá logic hiện tại: localStorage + user_meta giữ nguyên, không mất dữ liệu.
    • Hoàn thiện i18n cho tất cả string mới (EN + VI).
  • 1.1 – Hỗ trợ Selector & theo dõi tiến trình trong vùng nội dung
    • Thêm tuỳ chọn CSS Selector để chỉ theo dõi vị trí đọc trong vùng mong muốn (ví dụ: .entry-content).
    • Chỉ lưu tiến trình khi người dùng đang cuộn trong vùng selector — không lưu khi sang phần bình luận.
    • Xoá tiến trình đọc chỉ khi cuộn đến cuối trang, bất kể selector.
    • Không thay đổi logic lưu cũ: localStorage đối với khách & user_meta đối với user đăng nhập.
    • Giữ nguyên toàn bộ cấu trúc dữ liệu cũ — không gây lỗi hoặc mất dữ liệu ở phiên bản trước.
    • Trang cài đặt được bổ sung trường input selector (placeholder, mặc định rỗng).
    • Hoàn thiện i18n (tiếng Anh & tiếng Việt) cho string mới trong setting.
    • Code tối ưu & sạch — không thêm scripts hoặc assets thừa.
  • 1.0 – Phiên bản đầu tiên của Init Reading Position
    • Ghi nhớ vị trí đọc của người dùng trong bài viết và tự động cuộn lại khi quay lại.
    • Lưu vị trí bằng localStorage nếu người dùng chưa đăng nhập.
    • Lưu vị trí bằng user_meta nếu người dùng đã đăng nhập – theo từng thiết bị.
    • Tự động preload vị trí từ user_meta để tránh gọi REST API không cần thiết.
    • Xoá vị trí đã lưu nếu người dùng cuộn gần cuối bài viết hoặc quay lại đầu trang.
    • Tùy chọn bật/tắt tính năng theo từng post type qua trang cài đặt.
    • Không dùng jQuery, code nhẹ bằng JavaScript thuần.
    • Không tạo bảng trong database, không ghi đè dữ liệu plugin khác.
    • Hỗ trợ các filter: init_plugin_suite_reading_position_delay, init_plugin_suite_reading_position_meta_key, init_plugin_suite_reading_position_data_to_store, init_plugin_suite_reading_position_should_delete, init_plugin_suite_reading_position_localized_data.
    • Plugin sạch, nhẹ, dễ mở rộng, phù hợp mọi loại nội dung dài như blog, truyện, tạp chí.
Made with in HCMC.

Bình luận


  • Không có bình luận.

Công cụ trực tuyến

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...