Thảo luận trên trang của bạn

Dán mã vào trang — khối thảo luận hiện ra ngay chỗ khung chứa của nó. Mọi thứ còn lại nằm trong khung của chúng tôi: đánh dấu, kiểu dáng và mã của bạn giữ nguyên.

Thử trên trang của bạn

Nhập địa chỉ trang — bạn nhận mã và thấy khối ngay tại đây. Phần xem trước dùng đúng đoạn mã bạn sao chép: một khung chứa và một đoạn lệnh.

Mã sẵn sàng

<div data-vpvd-thread data-url="https://example.org/article" data-lang="vi" data-theme="auto">
  <a href="https://vpvd.io/embed/vi?url=https%3A%2F%2Fexample.org%2Farticle&amp;theme=auto" target="_blank" rel="noopener">Mở thảo luận trên vpvd</a>
</div>
<script src="https://vpvd.io/embed.js" async referrerpolicy="no-referrer"></script>

Độc giả sẽ thấy gì

Trang web đóng trước khi ra mắt: có thể đọc luồng thảo luận ẩn danh, nhưng đăng nhập chưa hoạt động — người đọc trên trang của bạn sẽ thấy một nút tạm thời không dẫn đến đâu. Đăng nhập sẽ mở vào ngày ra mắt.

Dán vào đâu

Mã giống nhau ở mọi nơi; khác nhau chỉ là chỗ đặt nó.

  • Trang tĩnh và mẫu tự viết Đúng chỗ cuộc thảo luận cần đứng trên trang: trong mẫu của bài viết hoặc bài đăng.
  • WordPress Khối mã tuỳ biến trong trình soạn bài, hoặc tiện ích mã ở thanh bên. Một số trình soạn cắt mất thẻ lệnh khi lưu — mở trang đã đăng và kiểm tra khối còn đó.
  • Tilda Khối chèn mã của riêng bạn, ở mục «Khác»: dán nguyên đoạn mã, kèm cả thẻ lệnh.
  • Next.js, Nuxt, React Đoạn lệnh nạp một lần trong mẫu của site, thành phần đặt khung chứa và gỡ khối khi bị tháo — nếu không, khi đổi trang khung cũ sẽ nằm lại trong khung chứa.
<div data-vpvd-thread data-url="https://example.org/article" data-lang="vi" data-theme="auto">
  <a href="https://vpvd.io/embed/vi?url=https%3A%2F%2Fexample.org%2Farticle&amp;theme=auto" target="_blank" rel="noopener">Mở thảo luận trên vpvd</a>
</div>
<script src="https://vpvd.io/embed.js" async referrerpolicy="no-referrer"></script>

Next.js, Nuxt, React

// components/VpvdThread.tsx — one page's discussion. Load the script once in the layout:
// <Script src="https://vpvd.io/embed.js" strategy="afterInteractive" />
'use client';
import { useEffect, useRef } from 'react';

export default function VpvdThread() {
	const box = useRef<HTMLDivElement>(null);
	useEffect(() => {
		const el = box.current;
		const vpvd = (window as any).vpvd;
		if (el && vpvd) vpvd.mount(el);
		return () => { if (el && vpvd) vpvd.destroy(el); };
	}, []);
	return (
		<div ref={box} data-vpvd-thread data-url="https://example.org/article" data-lang="vi" data-theme="auto">
			<a href="https://vpvd.io/embed/vi?url=https%3A%2F%2Fexample.org%2Farticle&amp;theme=auto" target="_blank" rel="noopener">Mở thảo luận trên vpvd</a>
		</div>
	);
}

Trang đổi mà không tải lại

React, Vue, Svelte, Nuxt: Thẻ script nằm trong đánh dấu của bạn và không sống qua lần đổi trang: khung chứa cứ trống ở chỗ từng có khối. Hãy nạp script một lần trong mẫu chung của site và gọi lệnh làm mới dưới đây sau mỗi lần chuyển trang: nó đi qua mọi khung chứa trên trang bằng đúng đoạn mã chạy ở lần tải đầu.

// after every client-side transition:
window.vpvd.refresh();

Giao diện và phông chữ

Đặt giao diện dứt khoát — sáng, tối hay tự động — và chỉnh cho khớp trang của bạn bằng các biến trên khung chứa: phông chữ, cỡ chữ, giãn dòng, màu nhấn và độ bo góc.

data-theme, --vpvd-font, --vpvd-font-size, --vpvd-line-height, --vpvd-accent, --vpvd-radius

Ở chế độ tự động, khối lấy giao diện của trang bạn — cái bạn bật trên site hoặc thiết lập hệ thống của độc giả — còn phông chữ, cỡ chữ và bo góc lấy từ chính khung chứa. Không tìm được gì thì giữ kiểu của chúng tôi.

Thuộc tính

data-url
địa chỉ của trang được thảo luận. Thảo luận gắn với nó, nên địa chỉ phải giống nhau với mọi người đọc.
data-lang
ngôn ngữ của khối — một trong các ngôn ngữ ở danh sách dưới. Giá trị nào khác sẽ trả 404: khung không tồn tại ở ngôn ngữ khác.
  • en — English
  • zh-Hans — 简体中文
  • es — Español
  • ar — العربية
  • ru — Русский
  • vi — Tiếng Việt
  • tr — Türkçe
  • fa — فارسی
data-theme
chủ đề khối: tự động (như trên trang của bạn), sáng hoặc tối.
data-height
chiều cao dành sẵn cho khối cho tới khi khung báo chiều cao của nó, tính bằng pixel, ví dụ 200. Sau đó khối khớp với chiều cao thật; giá trị nằm trong khoảng 120–2000. Hãy đặt nếu trang bạn thấy rõ sự nhảy: mặc định chúng tôi dành 160 pixel.

Khi có bình luận mới

Thêm thuộc tính này và khối sẽ báo cho trang của bạn biết có bình luận mới. Sự kiện chỉ có một từ và không có gì về người đọc:

data-events="on" → vpvd:commented

Số bình luận cho danh sách

Danh sách bài viết cần một con số, không cần widget: yêu cầu này trả về số trả lời của một trang (bằng không nếu chưa ai thảo luận). Nó mở cho trang của bạn, không cần cookie và không biết gì về người đọc:

GET /api/nodes/count?url=…

Mã không làm gì

Nó không đọc nội dung trang của bạn và không để lại cookie của chúng tôi trên đó. Chỉ địa chỉ trong thuộc tính tới được máy chủ của chúng tôi: không có nội dung trang, không tên, không bộ đếm. Chúng tôi tắt thông tin nguồn cho cả mã lẫn khung.

Kiểm tra xem đã nhúng được chưa

Mở trang trong trình duyệt và chạy mấy dòng dưới trong bảng điều khiển: một dòng, một câu trả lời.

  1. khung đã ở đúng chỗ: trình nạp đã thay liên kết dự phòng trong khung chứa bằng nó
  2. trình nạp đã chạy: giá trị dưới đã có và phiên bản là 1 window.vpvd
  3. khung đã báo chiều cao: con số không còn là 160 dành sẵn, và khối ăn khớp với mạch thảo luận
// 1
document.querySelector('iframe[data-vpvd-frame]')
// 2
window.vpvd.version
// 3
document.querySelector('iframe[data-vpvd-frame]').style.height

Kiểm tra tự động từ trình duyệt không cửa sổ (Firefox)? Các giá trị của trang không hiện ra với script của bạn: nó chạy trong một thế giới riêng, chỉ chia sẻ đánh dấu của trang. Hãy đọc dấu hiệu từ thế giới chính: chèn script của bạn vào tài liệu rồi lấy câu trả lời từ một thuộc tính.

Chính sách nghiêm ngặt trên trang của bạn

Hãy cho phép địa chỉ của chúng tôi (https://vpvd.io) trong các chỉ thị mang khối tới:

  • script-src — mã của khối đến từ đó
  • frame-src — bản thân luồng thảo luận hiện trong khung của chúng tôi
  • child-src → frame-src — nếu chính sách của bạn có đặt nó, khung tuân theo nó chứ không theo chỉ thị chung: một giá trị từ nguồn khác sẽ âm thầm chặn mọi khung trên trang, kể cả khung của chúng tôi. Hãy ghi địa chỉ của chúng tôi vào đây nữa — hoặc bỏ chỉ thị đó.

Nếu mã hoàn toàn không chạy, người đọc vẫn thấy một liên kết thường tới thảo luận: khung chứa của chúng tôi mang nó từ đầu.

Câu hỏi

Độc giả thấy gì?

Mạch thảo luận của trang này và đường vào. Đọc không cần tài khoản; viết được với tư cách khách (bình luận sống khoảng nửa giờ) hoặc sau khi đăng nhập ngay trong khối. Đăng nhập là quyết định của độc giả: phiên của trang bạn không tới chỗ chúng tôi.

Các bạn biết gì về độc giả của tôi?

Địa chỉ trang bạn đặt trong mã — chỉ thế. Chúng tôi không thấy lịch sử duyệt web, nội dung trang hay ai ghé thăm: tiện ích kiểm tra ngay trên máy xem có thảo luận hay không, không hỏi máy chủ nào. Cookie chỉ thuộc về khung và chỉ của nó.

Bình luận có lên kết quả tìm kiếm không?

Không: công cụ tìm kiếm không lập chỉ mục nội dung trong khung. Bản thân mạch thảo luận được lập chỉ mục trên vpvd, và liên kết tới nó nằm trong khung chứa.

Tôi được gì khi là chủ trang?

Bỏ khối là bỏ mã. Xác nhận bạn sở hữu địa chỉ thì một dấu hiện ra cạnh bình luận của bạn; nhưng nó không cho ẩn bình luận của người khác: quy tắc kiểm duyệt là như nhau cho mọi người. Quy tắc riêng và chặn trên tên miền của bạn sẽ đến cùng bảng điều khiển chủ trang.

Làm sao thu hồi quyền truy cập?

Chúng tôi không có quyền vào trang bạn: đoạn lệnh chỉ đặt một khung. Xoá mã là khối biến mất. Phiên bên trong khung sống trong cookie của chúng tôi và mất theo nó.

Mã cho trang của bạn

Trình tạo sẽ dựng mã theo ngôn ngữ và giao diện bạn chọn.

Mở trình tạo