=== Virava Auto Content ===
Contributors: wiwiagency
Author: Wiwi Agency
Author URI: https://wiwi.vn
Requires at least: 5.3
Tested up to: 6.8
Requires PHP: 7.1
Stable tag: 1.0.70
License: GPLv2 or later

Hệ thống viết bài chuẩn SEO với quy trình chặt chẽ, từ ý tưởng đến xuất bản.

== Description ==

Virava Auto Content — Lên ý tưởng. Viết chuẩn SEO. Chủ động xuất bản.

Nhập ý tưởng và từ khóa chính. Các bước xử lý: nghiên cứu, xác định ý định tìm kiếm, chống trùng bài, dàn ý, soạn bài, biên tập SEO, link và ảnh, kiểm tra 3 lớp. Bạn duyệt, lên lịch hoặc đăng ngay.

Nội dung được soạn tự động (có sử dụng AI) trên server của Wiwi rồi gửi về WordPress của bạn; hãy đọc lại trước khi đăng.

H1 = post_title. SEO Title nằm ở Rank Math / Yoast / meta riêng và phải khác H1. post_content chỉ từ H2.

Phát triển bởi Wiwi Agency.

== Installation ==

1. Copy thư mục `zone-seo-writer` vào `wp-content/plugins/` (giữ nguyên tên thư mục để bản cài cũ cập nhật được).
2. Kích hoạt plugin.
3. Làm theo trình thiết lập: kết nối website, thông tin thương hiệu, ảnh và cách đăng bài. Có thể chạy lại ở Virava → Thiết lập.
4. Kiểm tra thứ hạng (Chrome extension "Virava – Kiểm tra thứ hạng"):
   1. Mở `chrome://extensions`.
   2. Bật Developer mode.
   3. Load unpacked thư mục `wp-content/plugins/zone-seo-writer/browser-extension`.
   4. Mở lại WordPress → Virava → Thứ hạng.
   5. Xác nhận **Browser checker: Đã kết nối**.
5. Tạo bài.

== Changelog ==

= 1.0.70 =
* Trình thiết lập: ô không bắt buộc "Ghi nhận nguồn giới thiệu" (mặc định không chọn) ở bước Kết nối website. Chỉ hiện khi Wiwi bật tính năng; khi bạn chọn, một tab wiwi.vn mở ra để ghi nhận bạn biết Virava từ đâu. Không gửi tên miền hay email sang wiwi.vn; việc cài đặt không phụ thuộc tab này.

= 1.0.69 =
* Bỏ mật khẩu mở khóa: plugin tạo bài được ngay khi website đã kết nối và ví có credit.
* Khi chưa tạo bài được, plugin nói rõ lý do (chưa kết nối, site chưa kích hoạt hoặc chưa có credit) kèm nút mở đúng màn cần làm.

= 1.0.68 =
* Viết lại và Sửa theo ảnh thật: màn xác nhận hiện mức credit thường gặp ("Thường khoảng a–b credit") bên cạnh mức tối đa; mức tối đa chỉ giữ tạm, thu theo mức dùng thật. Cách tính tiền không đổi.

= 1.0.67 =
* Viết lại bài: trên bài đã giao (nháp hoặc đã đăng) chọn viết lại cả bài hoặc từng mục H2 / mở bài, kèm ghi chú muốn sửa thế nào. Giá bằng 50% giá bán của chi phí thật của chính lượt viết lại; hiện mức tối đa trước khi bấm. Giữ ảnh, liên kết, slug; lưu bản cũ trong Revisions để hoàn tác; phần đã tự sửa sau khi gửi sẽ được hỏi trước khi ghi đè. Không ghép lại được vì bài đã thêm/xóa mục thì hoàn đủ credit và hiện bản viết lại để tự dán.
* Sửa theo ảnh thật: mỗi ảnh AI có nút sửa lại theo 1–3 ảnh chụp thật của sản phẩm (giữ đúng hình dáng, màu, logo). Thư viện "Ảnh sản phẩm" riêng của website, lưu 180 ngày từ lần dùng cuối, xóa được. Có phí theo chi phí thật; ảnh không hợp lệ hoặc tạo không đạt thì không trừ credit.
* Entity thương hiệu: màn kiểm tra cấp Entity (TOP 1, liên kết phụ, Maps) trên máy tính và điện thoại.
* Sửa lỗi bài về thiếu tiêu đề: luôn có tiêu đề; form "Sửa lỗi lớp 1" có ô tiêu đề; từ khóa "Thêm vào bảng Thứ hạng" vào bảng ngay khi nhận bài.
* Các tính năng mới bật dần theo thông báo của Wiwi.

= 1.0.66 =
* Rà soát tổng thể: trước khi giao bài, AI kiểm một lượt nội dung, cấu hình SEO, ảnh và ý định tìm kiếm; sai chỗ nào chỉ sửa đúng chỗ đó (mỗi loại tối đa một lượt). Bước này tính credit như các bước khác; kết quả hiện ở tab Kiểm tra của bài.
* Báo ảnh lỗi: mỗi ảnh Virava có nút "Báo ảnh lỗi" (chọn lý do + ghi chú). AI kiểm lại; đúng lỗi thì đổi ảnh mới miễn phí, không trừ credit, thay đúng chỗ kể cả bài đã đăng. Chưa rõ lỗi thì chuyển Wiwi kiểm duyệt và báo trên màn hình. Mỗi ảnh được đổi tự động tối đa một lần.

= 1.0.65 =
* Tự kiểm tra bản mới: trang Plugins của WordPress hiện "Có bản mới" với nút cập nhật và "Xem chi tiết" (ghi chú thay đổi) như plugin thường; dòng plugin có link "Kiểm tra bản mới". Trên các màn Virava, quản trị viên thấy "Có bản Virava … mới — Cập nhật ngay · Xem thay đổi · Để sau" ("Để sau" ẩn 1 ngày, theo từng tài khoản).
* Gói cập nhật được kiểm mã sha256 trước khi cài; không khớp thì hủy cập nhật, plugin đang dùng giữ nguyên. Máy chủ cập nhật không trả lời thì không hiện gì và không ảnh hưởng việc dùng plugin. Plugin không tự cài: chỉ cập nhật khi quản trị viên bấm (hoặc khi bạn bật "tự động cập nhật" của WordPress).
* Thứ hạng: giao diện mới theo bảng thứ hạng trên wiwi.vn (chip hạng theo màu top 1–3 / 4–10 / >10, mũi tên tăng hạng, nút Kiểm tra quay khi đang chạy, cột cố định không nhảy khi đổi trạng thái). Trên điện thoại mỗi từ khóa là một thẻ, không còn bảng cuộn ngang.
* Thứ hạng: kiểm tra thứ hạng chỉ chạy trên Google Chrome máy tính có cài Virava Extension. Trên điện thoại hoặc khi chưa có extension, bấm Kiểm tra sẽ báo rõ và không tạo lượt kiểm; dữ liệu đã lưu vẫn xem được.

= 1.0.64 =
* Có credit là chạy: site có credit trong ví (kể cả credit Wiwi tặng / bù) tạo được ý tưởng và bài ngay, không còn đòi "nạp credit lần đầu". Server kiểm cùng quy tắc (cờ can_run). Ví trống vẫn báo cần nạp.

= 1.0.63 =
* Kết nối website: sửa lỗi "Chưa xác minh được domain" trên host có object cache (vd. LiteSpeed Cache + Redis/Memcached). Phiên kết nối đang chờ nay lưu thẳng vào DB thay vì transient, nên bước xác minh của server luôn đọc được.

= 1.0.62 =
* Cài ZIP là chạy chế độ server (content.wiwi.vn) ngay, không cần sửa wp-config: kích hoạt plugin xong mở thẳng trình thiết lập; không còn hiện ô Gemini API key / "AI chạy trên site" trên site khách (khách nạp credit và dùng AI của Virava). Chế độ AI trên site chỉ bật khi wp-config đặt define( 'ZSW_REMOTE_MODE', false ).
* Cài đặt: nút "Chọn logo từ Media" bấm không phản hồi — đã sửa (thư viện Media nạp sau đoạn gắn nút).
* Search Console: nút "Kiểm tra kết nối" chỉ hiện khi đã kết nối Google; trước đây chưa kết nối vẫn hiện và bấm chỉ ra lỗi.

= 1.0.61 =
* Thứ hạng: thêm ô "Tự động kiểm tra thứ hạng", mặc định TẮT (cả site mới và site nâng cấp chưa chọn). Khi tắt, mở trang Thứ hạng, tải lại, xem lịch sử hay khối Tổng quan thứ hạng chỉ hiển thị dữ liệu đã có: không tạo lượt kiểm, không hỏi Chrome Extension, không truy vấn Google (kể cả kiểm hạng hằng ngày qua Search Console). Nút "Kiểm tra" / "Kiểm tra tất cả" vẫn chạy khi bạn bấm.
* Khi bật: tự kiểm một lần/ngày khi mở trang và extension đã kết nối; lượt tự động bỏ qua từ khóa đang bị Google CAPTCHA (bấm Kiểm tra để thử lại). Chỉ quản trị viên WordPress được bật/tắt.
* Bài viết → "Lịch đăng": lịch tháng, bấm một ngày để chọn giờ (theo múi giờ WordPress, hiện rõ trên trang) và chọn bài hoàn chỉnh chưa có lịch; xem lịch, đổi giờ hoặc hủy lịch (bài về nháp) ngay trong plugin. Lúc lưu, bài được kiểm tra lại; bài còn lỗi không được lên lịch. Hai người cùng đặt một bài chỉ một người thành công; giờ đã qua bị từ chối; sửa ngày đăng trong trình soạn WordPress hiện lại trên lịch. Không dùng AI, không tốn credit.
* Google sau khi đăng: ngừng gửi Indexing API cho bài viết thường (Google chỉ hỗ trợ API đó cho tin tuyển dụng / sự kiện phát trực tiếp). Thay bằng "Thông báo sitemap cho Google" (dùng sitemap sẵn có của Rank Math / Yoast / WordPress, gộp nhiều bài vào một lượt, tối đa 1 lượt/giờ) và "Kiểm tra lập chỉ mục" (chỉ đọc). Bỏ nhãn "Đã đăng & Submit"; bài đã gửi Indexing API trước đây ghi rõ việc đó không chứng minh đã được lập chỉ mục. Thiếu quyền / chưa kết nối / không có sitemap thì báo rõ; bài đã đăng không bị trả về nháp vì lỗi Google. Cần kết nối lại Google để cấp quyền gửi sitemap.
* Search Console: chỉ dùng property thật sự khớp website (Domain property của tên miền / subdomain; URL-prefix đúng giao thức, tên miền và đường dẫn). Không khớp thì dừng mọi thao tác Google và báo rõ, không bao giờ dùng nhầm property của site khác. Nhiều property khớp thì chọn được trong Cài đặt. Lỗi Search Console hiện bằng câu tiếng Việt theo mã lỗi.
* Kiểm tra bài: tiêu đề / SEO title / meta có năm cũ hơn năm hiện tại đi kèm "mới nhất", "hiện nay", "cập nhật", "chuẩn", "năm nay", "top"… mà bạn không nêu năm đó trong ý tưởng / từ khóa / ghi chú → bài giữ nháp, cần duyệt. Hệ thống không tự đổi năm; năm lịch sử, năm đời sản phẩm, năm bạn nêu được giữ nguyên.
* Kết nối: thêm ô "Email liên hệ" (điền sẵn email quản trị WordPress, sửa được; dùng để thông báo giao dịch và hỗ trợ) và ô riêng, không tick sẵn, "Tôi muốn nhận hướng dẫn, cập nhật và ưu đãi từ Virava." Không chọn vẫn dùng bình thường.
* Cài đặt → "Liên hệ & nhận tin": đổi email liên hệ, bật hoặc bỏ chọn nhận tin bất cứ lúc nào. Site đã kết nối trước đây được mời bổ sung email (không chặn tạo bài; email có sẵn không được coi là đồng ý nhận tin).
* Hướng dẫn từng bước trên Tổng quan, Tạo bài, Ý tưởng, Bài viết, Credit, Thứ hạng: tự mở ở lần đầu mỗi tài khoản vào màn đó, có "Bỏ qua", "Tắt hướng dẫn ở mọi màn" và nút "Hướng dẫn lại". Hướng dẫn chỉ chỉ vào các phần của trang: không điền, không bấm, không đổi cấu hình, không tạo bài, không gọi server hay extension. Trạng thái lưu riêng cho từng tài khoản WordPress.
* Trang "Hướng dẫn kết nối Google Search Console": các bước tạo OAuth client, màn hình đồng ý và Test users, bật Search Console API, Redirect URI, chọn property URL-prefix / Domain, quyền cần có (đọc từ plugin), cách xác nhận và lỗi thường gặp; đối chiếu tài liệu Google ngày 17/10/2026.
* Kết nối Google: lỗi từ Google hiện bằng câu dễ hiểu kèm cách sửa (từ chối quyền / Test users, hết hạn 7 ngày ở chế độ Testing, Client Secret sai, Redirect URI không khớp…); không còn hiện nguyên văn lỗi Google hay lỗi mạng (có thể chứa email, mã client, địa chỉ).

= 1.0.60 =
* Bỏ mục nạp thử nghiệm 10.000đ (chỉ dùng nội bộ lúc kiểm nhận tiền); mức nạp từ 100.000đ.

= 1.0.59 =
* Kết nối từ trình thiết lập: khi bạn tick "Tôi đồng ý Điều khoản…", máy chủ ghi nhận việc đồng ý kèm phiên bản điều khoản hiện hành. Không tick (hoặc kết nối từ trang Credit) vẫn kết nối được như cũ.

= 1.0.58 =
* Mục nạp thử nghiệm (vd. 10.000đ) chỉ hiện khi wp-config đặt ZSW_TOPUP_TEST_AMOUNT; dùng để thử nhận tiền, gỡ bằng cách xóa hằng.

= 1.0.57 =
* Gửi lại bài tự động (cron, tải lại trang) chờ đúng hạn, không tiêu lượt khi chưa tới hạn. Wizard chỉ rõ trường thông tin thương hiệu cần rút gọn, không cắt chữ khi dán.

= 1.0.56 =
* Thông tin thương hiệu: hiện giới hạn và bộ đếm ký tự, báo lỗi ngay tại trường (không tự cắt). Bài chỉ được gửi khi thông tin thương hiệu đã đồng bộ lên máy chủ; lỗi đồng bộ được báo rõ, sửa xong bấm "Chạy tiếp".

= 1.0.55 =
* Nội dung gửi lên quá lớn (413): báo câu dễ hiểu, không tự gửi lại.

= 1.0.54 =
* Khi máy chủ báo quá tải (429): chờ tăng dần có ngẫu nhiên, theo Retry-After, số lần hữu hạn; tạo ý tưởng không còn gửi lại liên tục mỗi 2 giây.

= 1.0.53 =
* Nạp credit: đơn đã thanh toán hiện số tiền thực nhận và credit đã cộng (kèm cảnh báo nếu lệch); lịch sử ghi số tiền nhận; nội dung chuyển khoản không còn dấu "/" cho site cài ở thư mục con; banner ghi rõ khi nạp là tiền thật.
* Ghi rõ số trang nguồn từ công cụ tìm kiếm (không có nghĩa mọi khẳng định đã được kiểm).

= 1.0.52 =
* Ghi rõ bài có tra cứu nguồn trực tuyến hay chưa ("Chưa xác minh được nguồn trực tuyến"). Bài cần dữ liệu mới hoặc nội dung nhạy cảm mà chưa xác minh được nguồn thì giữ nháp chờ duyệt, không tự lên lịch hay đăng.

= 1.0.51 =
* Nạp credit qua SePay: QR theo tài khoản nhận tiền, nội dung "VRV-tên miền số credit", nút sao chép số tài khoản / số tiền / nội dung, đếm ngược 10 phút. Credit cộng theo số tiền thực nhận.
* Số ảnh được chốt vào bài lúc tạo; giá trị không hợp lệ bị từ chối. Bài cũ giữ quy tắc số ảnh cũ khi chạy lại.

= 1.0.50 =
* Chọn số ảnh minh họa 0 / 1 / 2 / 4 khi tạo bài, kèm ước tính credit theo số ảnh (mặc định 2).

= 1.0.49 =
* Chế độ gọi Gemini trực tiếp gửi key qua header x-goog-api-key thay vì trong URL.

= 1.0.48 =
* Gửi phiên bản plugin cho máy chủ (quản trị thấy bản đang dùng); báo máy chủ khi plugin bị tắt.
* Câu báo khi dịch vụ tạm dừng nhận yêu cầu mới hoặc tạm dừng nạp credit.

= 1.0.47 =
* Câu báo rõ ràng khi hệ thống quá tải (thử lại sau), đạt giới hạn thử lại, hoặc nội dung không đáp ứng chính sách; không hiện "Chạy tiếp" cho hai trường hợp sau.

= 1.0.46 =
* Tự đồng bộ SEO title, meta description, từ khóa chính sang Rank Math hoặc Yoast SEO (mục "Plugin SEO" trong Cài đặt, nút đồng bộ ở chi tiết bài).
* Bài bị từ chối vì trần credit thấp hoặc chờ ngân sách: nút "Chạy tiếp" kèm hộp xác nhận nâng trần.

= 1.0.45 =
* Đổi thương hiệu hiển thị sang Virava (Virava Auto Content). Không đổi slug, text domain, option, API hay dữ liệu; bản cài cũ cập nhật bình thường.
* Màn hình khách dùng tiếng Việt tự nhiên cho các bước xử lý; không hiện tên mô hình / nhà cung cấp.
* Logo đóng dấu mặc định là logo Virava. Trang Điều khoản / Chính sách trên máy chủ nội dung; wizard có ô đồng ý.
* Tùy chọn "Hiển thị ghi chú về nội dung được hỗ trợ bởi AI" (mặc định tắt).

= 1.0.31 =
* Viết nháp và pass SEO không còn bị cắt JSON vì hết token: trần output cao hơn, thinking mức thấp, cấm HTML entity.

= 1.0.30 =
* Kiểm tra từ khóa: đọc kết quả organic trên DOM Google (href /goto và cite), đưa tab ra trước để Google render SERP. CAPTCHA giữ tab để tự giải rồi kiểm tra tiếp.

= 1.0.29 =
* Làm lại màn hình Thứ hạng theo dashboard: chọn nhiều từ khóa bằng checkbox, tìm/lọc, trạng thái và lỗi rõ ràng.
* Extension chỉ dùng một tab Google không active, tái sử dụng qua trang 1–5 rồi tự đóng; chỉ đưa tab ra trước khi Google chặn hoặc DOM lỗi.

= 1.0.28 =
* Thứ hạng: browser-assisted rank check qua Chrome Extension MV3. WordPress chỉ cấp token và lưu kết quả. Không scrape Google, không dùng Gemini/GSC làm hạng live.

= 1.0.23 =
* Chống trùng liệt kê bài trùng / nghi trùng kèm URL, link xem/sửa và lý do.

= 1.0.22 =
* Job Chờ duyệt có nút Duyệt và lên lịch / Duyệt và đăng ngay (ghi đè lớp 2).

= 1.0.21 =
* Báo cáo tổng hợp thứ hạng: tổng từ khóa, top XX, đã/chưa xuất hiện, kèm %.

= 1.0.20 =
* Kiểm tra hạng lấy số từ Search Console (không scrape Google). Khớp từ khóa không phân biệt hoa thường, hiện lỗi nếu chưa có impression.

= 1.0.19 =
* Kiểm tra hạng không mở tab Google. Máy chủ bị chặn SERP thì lấy hạng + URL từ Search Console và vẫn cập nhật bảng.

= 1.0.18 =
* Thêm từ khóa không cần URL. Khi kiểm tra hạng, plugin tự bốc URL Google có domain site rồi cập nhật.

= 1.0.17 =
* Kiểm tra hạng chạy ngầm và cập nhật bảng; chỉ mở tab Google khi gặp captcha thật. Từ khóa đang quét có vòng quay.

= 1.0.16 =
* Theo dõi thứ hạng: thêm từ khóa bằng Enter hoặc paste từng dòng, KPI top N, n/a ngoài top 50, lịch sử ngày/tuần/tháng. Captcha Google thì mở tab mới để xử lý tay.

= 1.0.15 =
* Hai trạng thái mới: Đã đăng & Submit, Đã Index. Public bài thì tự submit Google. Mỗi ngày 7h kiểm tra index; job có tick thì lấy thứ hạng.

= 1.0.14 =
* Search Console: bấm «Kết nối Google» để xin ủy quyền OAuth (không cần Service Account).

= 1.0.13 =
* Không gắn nguồn tham khảo/link ngoài cuối bài. Mở khóa tool bằng mật khẩu (lưu một lần, không lưu plaintext).

= 1.0.12 =
* Sửa Search intent lỗi invalid argument (bỏ thinkingConfig / JSON mime không hợp lệ).

= 1.0.11 =
* Hiện kết quả từng bước trên job; sửa Search intent lỗi JSON (bỏ grounding, parse JSON chắc hơn).

= 1.0.10 =
* Ảnh bài luôn vuông 900×900px, logo góc trên bên phải.

= 1.0.9 =
* Chế độ bài có hình mặc định; tạo ảnh bằng Gemini Image vì Imagen API đã tắt.

= 1.0.8 =
* Cấu hình Google Search Console / Indexing API: tự submit URL khi bài được public.

= 1.0.0 =
* V1 pipeline, validator 3 lớp, Drive/Imagen, Action Scheduler hoặc WP-Cron.
