ThinhDev Live Chat — v1.2.0

ThinhDev Live Chat — v1.2.0

Mua sẵn Chuyển đổi

Plugin WordPress chat trực tuyến với khách hàng: khách phải để lại họ tên + số điện thoại mới được chat → dữ liệu khách lưu ngay trên website → quản trị viên nhận popup + âm thanh → bấm Chấp nhận để chat 2 chiều → khi khách rời trang, tin trả lời được gửi thông báo đẩy về trình duyệt Chrome của khách kèm logo + ảnh thương hiệu.

Tính năng nổi bật

  • Mỗi SĐT là 1 khách (không trùng); lưu tên, SĐT, email, trang bắt đầu, nguồn giới thiệu, IP, thiết bị, thời điểm đồng ý, số lần chat, ghi chú nội bộ. Trang Khách hàng: tìm kiếm, lọc khách nhận thông báo, xuất CSV mở bằng Excel (đúng tiếng Việt), xóa.

ThinhDev Live Chat — v1.2.0

Plugin WordPress chat trực tuyến với khách hàng: khách phải để lại họ tên + số điện thoại mới được chat → dữ liệu khách lưu ngay trên website → quản trị viên nhận popup + âm thanh → bấm Chấp nhận để chat 2 chiều → khi khách rời trang, tin trả lời được gửi thông báo đẩy về trình duyệt Chrome của khách kèm logo + ảnh thương hiệu.

Phát triển bởi thinhdev.

Mới ở 1.2: popup “khách vừa chat tư vấn” hiển thị trên website (hình ảnh + tên + SĐT đã che + nội dung tự đặt), cài thời gian, vị trí, giao diện, xem trước trực tiếp.

Mới ở 1.1: xem khách đang chat ở trang nào (theo thời gian thực, từng tin nhắn, hành trình xem trang, nguồn truy cập) và trang Thống kê lượt truy cập website. Không cần dịch vụ bên ngoài (không Firebase, không OneSignal, không thư viện Composer).


1. Tính năng

Nhóm Chức năng
Khung chat cho khách Nút chat nổi (trái/phải, chỉnh khoảng cách để không trùng nút gọi/Zalo của Flatsome). Form bắt buộc họ tên + SĐT (kiểm tra SĐT Việt Nam, tự đổi +84 → 0), email tùy chọn, nội dung, ô đồng ý lưu trữ (Nghị định 13/2023/NĐ-CP), chống bot (honeypot + giới hạn tần suất). Chat có gửi ảnh, link bấm được, “nhân viên đang nhập…”, âm báo + nháy tiêu đề tab khi có tin mới, tải lại trang vẫn giữ cuộc trò chuyện. Giao diện tách biệt bằng Shadow DOM nên CSS của theme không làm vỡ khung chat. Toàn màn hình trên điện thoại.
Lưu khách hàng Mỗi SĐT là 1 khách (không trùng); lưu tên, SĐT, email, trang bắt đầu, nguồn giới thiệu, IP, thiết bị, thời điểm đồng ý, số lần chat, ghi chú nội bộ. Trang Khách hàng: tìm kiếm, lọc khách nhận thông báo, xuất CSV mở bằng Excel (đúng tiếng Việt), xóa.
Báo cho quản trị viên Popup góc phải trên mọi trang quản trị (và cả ngoài website khi đang đăng nhập) + âm thanh (lặp lại theo chu kỳ khi khách còn chờ), số khách chờ trên menu & thanh quản trị, nháy tiêu đề tab, thông báo hệ thống khi tab ẩn, Web Push tới máy quản trị kể cả khi đã đóng trang, email (tùy chọn).
Chấp nhận & chat 2 chiều Bấm Chấp nhận → mở hộp thoại. Chỉ 1 nhân viên nhận được (khóa nguyên tử), người khác thấy “đã có người nhận”. Hộp thoại 3 cột: danh sách (Đang mở / Chờ / Của tôi / Nhỡ / Đã đóng, tìm kiếm), khung chat, thông tin khách (sửa tên, email, ghi chú, lịch sử chat, gọi/Zalo nhanh). Câu trả lời nhanh (gõ /), gửi ảnh, kết thúc, mở lại.
Hết giờ chờ Quá N phút không ai nhận → chuyển Nhỡ, khách nhận tin “sẽ gọi lại qua số {phone}” và vẫn để lại tin được; nhân viên nhận lại sau. Báo “ngoài giờ” khi không nhân viên nào trực tuyến.
Thông báo đẩy tới Chrome của khách Khách bật thông báo ngay khi bắt đầu chat. Nhân viên trả lời lúc khách đã rời trang → thông báo gồm tên thương hiệu · nhân viên, nội dung tin, logo, ảnh thương hiệu lớn, badge Android; bấm vào mở lại đúng trang và tự bật khung chat. Gửi nhanh cho 1 khách từ hộp thoại. Chiến dịch: soạn tiêu đề + nội dung + ảnh + link, gửi tất cả / khách đã chọn / gửi thử, xem trước, lịch sử, đếm lượt bấm. Thiết bị hủy đăng ký (410) tự xóa.
Khách chat ở trang nào (1.1) Trong hộp thoại: thanh “Khách đang xem: …” tự cập nhật khi khách chuyển trang (xanh = còn trên web), mỗi tin nhắn ghi “📍 Khách nhắn từ trang …” khi khách đổi trang, khung Hành trình xem trang (tối đa 40 trang, thời gian, trang vào đầu tiên + nguồn + chiến dịch), nguồn truy cập, số lần ghé, lượt xem. Danh sách hội thoại hiện trang khách đang xem.
Thống kê truy cập (1.1) Menu Live Chat → Thống kê: Hôm nay / Hôm qua / 7 / 30 ngày / Tháng này / 90 ngày / tùy chọn. Thẻ số liệu so kỳ trước: đang online, khách truy cập, lượt xem trang, khách mới, lượt ghé, cuộc chat, khách để lại SĐT, tỉ lệ chuyển đổi. Biểu đồ theo ngày (hoặc theo giờ khi xem 1 ngày). Bảng khách đang trên website (trang đang xem, nguồn, thiết bị, thời gian, nút mở chat nếu đã để lại SĐT) tự cập nhật 15 giây. Trang xem nhiều + số chat phát sinh, trang khách bắt đầu chat, nguồn (Tìm kiếm / Mạng xã hội / Quảng cáo / Trực tiếp / Website khác / Email, chi tiết Google, Facebook, Zalo, TikTok, Google Ads…), chiến dịch UTM, thiết bị, trình duyệt (cả Zalo, Facebook, Cốc Cốc), giờ cao điểm. Tiện ích trên Bảng tin. Danh sách & CSV khách hàng có cột nguồn.
Popup “khách vừa chat tư vấn” (1.2) Thẻ popup hiện lần lượt ở góc website: hình ảnh (ảnh đại diện trang/sản phẩm khách đã chat, logo, ảnh tự chọn hoặc chữ cái đầu tên), tên (tên gọi “Minh” / viết tắt “Nguyễn V. M.” / đầy đủ), SĐT luôn che 3 số giữa (0912 xxx 678), nội dung tự đặt với biến {name} {phone} {time} {page} {brand}, dấu “Đã xác nhận qua Live Chat”, nút Chat ngay mở khung chat, thanh đếm thời gian. Vị trí: 6 góc (dưới/trên × trái/phải/giữa) + khoảng cách; tự nâng lên nếu trùng góc nút chat; điện thoại rộng toàn màn hình. Thời gian: hiện popup đầu sau X giây, mỗi popup Y giây (rê chuột tạm dừng), cách nhau Z giây, tối đa N popup/trang, ngẫu nhiên hoặc mới nhất trước, nối tiếp khi chuyển trang. Giao diện: Sáng / Tối / Màu thương hiệu. Khách bấm × tắt đến hết phiên; không hiện khi khung chat đang mở; khách không thấy chính mình. Chỉ dùng khách thật đã đồng ý lưu trữ, trong N ngày gần nhất; ẩn từng khách ở trang Khách hàng (cột Popup). Xem trước trực tiếp trong cài đặt + xem trên website bằng dữ liệu mẫu (chỉ quản trị viên).
Phân quyền Quản trị viên: toàn quyền. Vai trò được chọn (mặc định Biên tập viên) + vai trò mới Nhân viên chat: chỉ chat & xem khách. Cài đặt, thông báo đẩy, xuất/xóa dữ liệu chỉ dành cho quản trị viên.

2. Yêu cầu

  • WordPress 6.6+ (đã chạy thử trên 7.2), PHP 7.4+ có OpenSSL (đường cong P-256, AES-128-GCM — hầu hết hosting có sẵn).
  • HTTPS (Chrome chỉ cho thông báo đẩy trên HTTPS).
  • Thông báo đẩy hoạt động trên Chrome, Edge, Cốc Cốc, Firefox, Opera (máy tính & Android). iPhone chỉ nhận khi khách Thêm vào Màn hình chính (giới hạn của Apple). Ảnh lớn hiển thị trên Windows/Android/ChromeOS; macOS chỉ hiện logo + chữ.

3. Cài đặt

  1. Plugins → Add New → Upload thinhdev-live-chat.zip → Activate. Menu Live Chat xuất hiện (khóa VAPID cho Web Push được tạo tự động).
  2. Live Chat → Cài đặt → Thương hiệu: tên, màu, logo vuông 192×192, ảnh thương hiệu 1350×675 (2:1), badge.
  3. Cài đặt → Thông báo đẩy: bấm Bật thông báo cho trình duyệt này → Gửi thử.
  4. Cài đặt → Thông báo quản trị: âm thanh, chu kỳ nhắc lại, email, câu trả lời nhanh.
  5. Nên dùng cron thật (cho việc tự đóng hội thoại, dọn dữ liệu):
    define( 'DISABLE_WP_CRON', true );
    
    */10 * * * * wget -q -O - https://ten-mien.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
    

Lưu ý trình duyệt quản trị: Chrome chặn tự phát âm thanh khi chưa tương tác với trang — nếu thấy nút “🔔 Bấm để bật âm thanh”, bấm một lần. Bật Web Push cho máy quản trị để không bỏ lỡ khách khi đóng tab.

Popup khách đã chat: Cài đặt → Popup khách đã chat → tick Bật popup → Lưu (mặc định tắt). Popup hiển thị công khai nên nên sửa ô đồng ý ở tab Khung chat, ví dụ: “Tôi đồng ý để {brand} lưu trữ họ tên, số điện thoại để liên hệ tư vấn và hiển thị tên gọi, số điện thoại đã che trên website.” Danh sách được lấy qua /wp-json/tdlc/v1/proof (cache 5 phút, chỉ chứa tên rút gọn + SĐT đã che).

Thống kê: Cài đặt → Thống kê — bật/tắt, bỏ qua tài khoản nội bộ khi đăng nhập (mặc định bật), tôn trọng Do Not Track, số ngày giữ dữ liệu chi tiết (mặc định 180; số liệu theo ngày giữ vĩnh viễn). Đếm bằng ID ẩn danh trong localStorage (không cookie), IP làm mờ, bỏ qua bot. Thống kê vẫn chạy trên các trang đã ẩn khung chat.

Plugin cache (LiteSpeed, WP Rocket, FlyingPress…): cấu hình khung chat không chứa dữ liệu riêng nên cache trang thoải mái; chỉ cần loại trừ ?tdlc_sw= khỏi cache và không gộp/hoãn assets/js/widget.js nếu thấy lỗi. Cloudflare: không cache /wp-json/tdlc/*. Mỗi lượt xem trang gửi 1 yêu cầu nhỏ tới /wp-json/tdlc/v1/collect (+ 1 nhịp mỗi 45 giây khi tab đang mở) — với website rất đông khách có thể tắt thống kê và dùng Google Analytics.

4. Cách hoạt động

Khách mở khung chat ─► nhập Tên + SĐT (+ đồng ý) ─► lưu khách hàng ─► hội thoại "Chờ"
        │                                                    │
        │                         popup + âm thanh + Web Push cho quản trị viên
        ▼                                                    ▼
  "Đang kết nối…" ◄────────── Chấp nhận (1 người) ─► "Đang chat" ◄─► chat 2 chiều
        │ quá N phút                                         │
        ▼                                     khách rời trang → Web Push về Chrome khách
   "Nhỡ" + hẹn gọi lại                      (tin nhắn + logo + ảnh thương hiệu)
  • Kết nối bằng REST API + hỏi định kỳ (khách 3 giây khi mở khung, nhân viên 2,5–4 giây) — chạy được trên mọi hosting chia sẻ, không cần WebSocket.
  • Khách được coi là “đang xem trang” nếu trình duyệt hỏi tin trong 15 giây gần nhất; ngoài khoảng đó tin trả lời sẽ được gửi Web Push.
  • Gửi Web Push chạy sau khi đã trả phản hồi (fastcgi_finish_request) nên không làm chậm chat; chiến dịch gửi song song 50 thiết bị/lượt.
  • Service worker phục vụ tại /?tdlc_sw=… với phạm vi riêng /tdlc-push/ → không xung đột với PWA/OneSignal/service worker khác của website.

5. Mở khung chat từ nút bất kỳ

Gắn link #tdlc-open hoặc class tdlc-open cho nút trong Flatsome UX Builder (vd. nút “Tư vấn ngay”), hoặc gọi TDLCWidget.open() bằng JavaScript. Thêm ?tdlc_open=1 vào URL để tự mở khung chat.

6. Cấu trúc mã nguồn

thinhdev-live-chat/
├── thinhdev-live-chat.php   Khởi động, autoload
├── uninstall.php            Xóa dữ liệu (chỉ khi bật tùy chọn)
├── assets/
│   ├── js/widget.js         Khung chat khách (Shadow DOM)
│   ├── js/sw.js             Service worker nhận thông báo đẩy
│   ├── js/admin-pulse.js    Popup + âm thanh trên mọi trang quản trị
│   ├── js/admin-console.js  Hộp thoại chat của nhân viên
│   ├── js/admin-stats.js    Bảng khách đang online
│   ├── js/proof.js          Popup "khách vừa chat tư vấn" (Shadow DOM)
│   ├── js/admin-proof.js    Xem trước popup trong cài đặt
│   ├── css/, sounds/ding.wav
├── src/
│   ├── Plugin, Installer (8 bảng, quyền, khóa VAPID), Settings, Util
│   ├── Repo (dữ liệu), Chat (nghiệp vụ), Tracker (truy cập & thống kê), Proof (popup khách đã chat), Rest (API), Frontend, Admin, Pages
│   └── Push/WebPush (VAPID ES256 + mã hóa aes128gcm thuần PHP), Push/Sender
└── tests/integration.php    145 kiểm thử trên WordPress thật

Bảng: wp_tdlc_customers, wp_tdlc_conversations, wp_tdlc_messages, wp_tdlc_push_subs, wp_tdlc_campaigns, wp_tdlc_visitors (khách truy cập ẩn danh), wp_tdlc_pageviews (lượt xem chi tiết), wp_tdlc_daily (tổng theo ngày).

7. Hook cho lập trình viên

Hook Mục đích
tdlc_customer_saved (action) ($customer_id, $data, $is_new) — vd. đẩy khách sang ThinhDev CRM / Google Sheet
tdlc_conversation_started, _accepted, _missed, _closed (action) Theo dõi vòng đời hội thoại
tdlc_show_widget (filter) Ẩn/hiện khung chat theo điều kiện riêng
tdlc_pulse_on_frontend (filter) Tắt popup cho quản trị viên khi xem ngoài website
tdlc_start_limit (filter) Số lần bắt đầu chat tối đa / IP / 10 phút (mặc định 6)
tdlc_trust_proxy_headers (filter) Tin header CF-Connecting-IP / X-Real-IP khi dùng Cloudflare
tdlc_show_proof (filter) Ẩn/hiện popup “khách vừa chat” theo điều kiện riêng
tdlc_collect_limit (filter) Số lượt ghi nhận tối đa / IP / phút (mặc định 240)
tdlc_push_dispatch (filter) Thay cơ chế gửi push (kiểm thử, hàng đợi riêng)

8. Kiểm thử

php tests/integration.php /duong-dan/wordpress   # CHỈ chạy trên site thử: test xóa dữ liệu Live Chat

Bao phủ: kích hoạt/bảng/quyền/khóa VAPID, chuẩn hóa & kiểm tra SĐT, form bắt buộc tên + SĐT + đồng ý, honeypot, lưu khách không trùng, popup quản trị (pulse), nhận nguyên tử (người thứ 2 bị từ chối), chat 2 chiều, lọc HTML/JS, đang nhập, chưa đọc, ghi chú, Web Push tới quản trị viên & khách (giải mã payload kiểm tra tiêu đề, nội dung, logo, ảnh thương hiệu, link), chiến dịch, 410 tự xóa thiết bị, hết giờ → nhỡ, đóng/mở lại, quyền REST (401/403), bảo trì, xóa dây chuyền, hiển thị mọi trang quản trị, mã hóa + chữ ký ES256 40/40 lần, ghi lượt xem / bỏ bot / phân loại nguồn (Google, Facebook Ads, UTM, trực tiếp) / phiên 30 phút / online / gắn khách truy cập với khách hàng / trang của từng tin nhắn / hành trình / báo cáo / cộng dồn ngày sau khi xóa dữ liệu chi tiết, không phát sinh warning PHP. Ngoài ra đã chạy thử trình duyệt thật (Chromium): khách điền form → popup + âm thanh ở trang quản trị → Chấp nhận → chat 2 chiều → tải lại trang giữ lịch sử; khách vào từ quảng cáo Google → xem 3 trang → chat → chuyển trang, quản trị viên thấy thanh “Khách đang xem” và hành trình tự cập nhật.

9. Lưu ý

  • Đổi khóa VAPID (Cài đặt → Thông báo đẩy → Tạo lại khóa) sẽ hủy toàn bộ đăng ký cũ; khách bật lại khi chat lần sau.
  • Ảnh chat lưu ở uploads/tdlc/YYYY/MM (không vào Thư viện), tối đa 5MB, chỉ JPG/PNG/WebP/GIF.
  • Xóa khách = xóa luôn hội thoại, tin nhắn, thiết bị nhận thông báo. “Tự xóa hội thoại sau N ngày” giữ lại thông tin khách hàng.
  • Hosting rất yếu có nhiều khách đồng thời: tăng chu kỳ hỏi bằng cách sửa hằng số trong widget.js hoặc dùng object cache (Redis) để transient nhanh hơn.

10. Lộ trình v1.1

  • Đồng bộ khách sang ThinhDev CRM (tạo khách + nguồn “Live Chat”) bằng 1 nút
  • Giờ làm việc, phân chia nhân viên theo lượt (round-robin), chuyển hội thoại
  • Kết nối Zalo OA / Messenger vào cùng hộp thoại
  • Đánh giá sao sau khi kết thúc, báo cáo thời gian phản hồi
  • Element/shortcode cho Flatsome UX Builder

Plugin khác

Tất cả plugin
Order riêng Chuyển đổi

Form báo giá nhiều bước

Form hỏi từng bước để khách tự chọn dịch vụ, xem giá tạm tính và để lại số điện thoại.

  • Nhiều bước, có thanh tiến độ
  • Tính giá tạm theo lựa chọn
  • Gửi email, lưu danh sách khách
Chi phí Từ 1.500.000đ
Đọc review
Order riêng qua Zalo

Order plugin riêng

Cần plugin theo nhu cầu riêng?

Chưa có plugin phù hợp? Gửi yêu cầu qua Zalo, tôi phản hồi trong ngày kèm báo giá và thời gian thực hiện.

  1. 1Gửi yêu cầu qua Zalo
  2. 2Nhận báo giá và thời gian thực hiện
  3. 3Làm, cài đặt lên website và bàn giao kèm hướng dẫn

Thông tin cần gửi khi order

  • Chức năng plugin cần có (càng chi tiết càng tốt)
  • Website đang dùng: WordPress, theme (Flatsome…), WooCommerce
  • Website hoặc plugin mẫu để tham khảo (nếu có)
  • Thời gian mong muốn hoàn thành
  • Ngân sách dự kiến
Order plugin riêng qua Zalo

Zalo: 0866 071 057 · Bấm nút, mẫu tin nhắn được chép sẵn, bạn chỉ cần dán vào Zalo.