CMS Publishing

Kết nối WordPress và xuất bản bài viết trực tiếp từ SEO Tool — lên lịch tự động, quản lý hàng chờ và theo dõi trạng thái publish theo thời gian thực.

1. CMS Publishing là gì?

CMS Publishing cho phép bạn xuất bản bài viết đã soạn thảo trực tiếp lên website WordPress mà không cần copy-paste thủ công. Toàn bộ quá trình — từ gửi nội dung đến phân loại bài, gắn tags, lên lịch — đều được tự động hoá.

Lưu nội bộ (Internal)

Bài viết được lưu trong SEO Tool — có URL nội bộ, ngày publish, trạng thái riêng. Không cần CMS connection.

Mặc địnhKhông cần kết nối

Xuất bản CMS (WordPress)

Bài viết được đẩy lên WordPress qua REST API — tạo post mới hoặc cập nhật bài đã có, kèm categories, tags và publish status.

Cần kết nối WordPressCó Publish Queue

Nền tảng CMS được hỗ trợ

WordPressĐã hỗ trợ
WixSắp ra mắt
BloggerSắp ra mắt
MediumSắp ra mắt

2. Kết nối WordPress

Để xuất bản lên WordPress, bạn cần tạo một Application Password trong WordPress admin và điền thông tin kết nối vào SEO Tool.

Bước 1 — Tạo Application Password trong WordPress

1

Đăng nhập WordPress Admin → vào Users → Your Profile (hoặc Users → All Users → chọn user)

2

Cuộn xuống phần "Application Passwords" ở cuối trang profile

3

Nhập tên cho password (ví dụ: "SEO Tool") → nhấn "Add New Application Password"

4

WordPress hiển thị password dạng xxxx xxxx xxxx xxxx xxxx xxxx — copy ngay vì chỉ hiển thị 1 lần

5

Dùng password này (kèm username WordPress) để điền vào form kết nối trong SEO Tool

Quan trọng: Dùng Application Password, KHÔNG dùng mật khẩu đăng nhập WordPress thông thường. Application Password chỉ dùng để kết nối API, không ảnh hưởng đến tài khoản chính.

Bước 2 — Thêm kết nối trong SEO Tool

Các trường cần điền khi tạo kết nối

Tên kết nối

Bắt buộc

Tên để phân biệt khi có nhiều website

Blog chính

URL Website

Bắt buộc

Địa chỉ gốc của WordPress site (không có /wp-admin)

https://example.com

Username

Bắt buộc

Tên đăng nhập WordPress của user tạo Application Password

admin

Application Password

Bắt buộc

Password vừa tạo ở Bước 1 — được mã hoá AES-256 trước khi lưu

xxxx xxxx xxxx xxxx xxxx xxxx

Trạng thái mặc định

Status mặc định khi publish: draft (bản nháp) hoặc publish (công khai)

draft / publish

Auto Publish

Tự động đẩy bài lên WordPress khi article được approved trong workflow

Bật/Tắt

Test Connection

Sau khi lưu kết nối, nhấn nút "Test Connection" — hệ thống sẽ thử gọi WordPress API để kiểm tra. Nếu thành công, trạng thái chuyển sang Active màu xanh. Nếu thất bại, kiểm tra lại URL, username và Application Password.

3. Xuất bản bài viết lên WordPress

Có 2 cách xuất bản — trực tiếp từ trình soạn thảo bài viết hoặc qua trang CMS Publishing để quản lý nhiều bài cùng lúc.

Từ Article Editor

  1. 1Mở bài viết trong trình soạn thảo
  2. 2Nhấn nút "Publish to CMS" trong sidebar
  3. 3Chọn CMS Connection (website WordPress)
  4. 4Chọn Categories và Tags từ WordPress
  5. 5Chọn "Đăng ngay" hoặc "Lên lịch"
  6. 6Nhấn Publish — bài vào Publish Queue

Từ trang CMS Publishing

  1. 1Vào Project → menu CMS Publishing
  2. 2Xem danh sách bài viết chưa publish
  3. 3Tích chọn nhiều bài (bulk select)
  4. 4Nhấn "Bulk Schedule" để lên lịch hàng loạt
  5. 5Chọn connection, datetime và publish status
  6. 6Tất cả bài vào Queue với thứ tự ưu tiên

Tùy chọn khi xuất bản

Publish Status

  • publish — Công khai ngay
  • draft — Lưu bản nháp trên WordPress
  • pending — Chờ editor WordPress duyệt
  • private — Bài riêng tư (chỉ admin xem)

Categories

  • Chọn từ danh sách category WordPress đã sync
  • Có thể chọn nhiều category cùng lúc

Tags

  • Chọn từ danh sách tag đã sync hoặc nhập tag mới
  • Tự động tạo tag mới nếu chưa có trên WordPress

Featured Image

  • Upload ảnh thumbnail cho bài viết
  • Tự động đặt làm featured image của WordPress post

4. Publish Queue — Hàng chờ xuất bản

Mỗi lệnh publish đều đi qua Publish Queue — hệ thống xử lý tự động theo lịch định kỳ, đảm bảo bài được publish đúng giờ và tự retry khi thất bại.

Vòng đời trạng thái trong Queue

Đang chờ

pending

Bài đã vào queue, đang chờ đến giờ xử lý hoặc chờ cron job chạy (mỗi 5 phút)

Đang xử lý

processing

Cron job đang thực hiện publish lên WordPress — trạng thái này thường chỉ kéo dài vài giây

Hoàn thành

completed

Publish thành công — bài đã có trên WordPress, kèm remote_post_id và URL bài viết

Thất bại

failed

Đã thử 3 lần, vẫn thất bại — hệ thống gửi email thông báo, bạn có thể Retry thủ công

Đã hủy

cancelled

Bạn đã hủy thủ công trước khi được xử lý

Thao tác trên Queue

Retry

Đặt lại trạng thái → pending, cron job sẽ xử lý lại trong lần chạy tiếp theo

Cancel

Hủy bỏ item đang pending hoặc failed — item chuyển sang cancelled

Bulk Schedule

Chọn nhiều bài, đặt lịch hàng loạt cùng connection và thời điểm

Thứ tự xử lý: Queue xử lý theo priority (cao trước) rồi đến thứ tự thêm vào (cũ trước). Khi bulk schedule, bài đầu tiên trong danh sách sẽ có priority cao nhất và được xuất bản trước.

5. Health Stats — Sức khoẻ hệ thống publish

Bảng Health Stats cho cái nhìn tổng quan về toàn bộ queue — giúp bạn phát hiện sự cố sớm trước khi ảnh hưởng đến lịch publish.

Tổng trong Queue

Tất cả items (mọi trạng thái) hiện có trong hệ thống

Đang chờ (Pending)

Items chưa được xử lý — cần chú ý nếu số này tăng đột biến

Hoàn thành

Tổng số bài đã publish thành công qua hệ thống

Thất bại (Failed)

Items đã hết retry — cần xem error và Retry thủ công

Tỷ lệ thành công

completed / (completed + failed) — mục tiêu ≥ 95%

Thời gian TB

Milliseconds trung bình để xử lý 1 publish request

Lỗi theo từng CMS Connection

Phần "Errors by Connection" liệt kê số lần thất bại theo từng website WordPress đã kết nối — giúp bạn xác định connection nào đang có vấn đề (credentials hết hạn, WordPress down, v.v.).

Blog chính (example.com)

connection_id: abc123

5 lỗi

Nếu 1 connection có nhiều lỗi liên tiếp → vào Settings → CMS Connections → kiểm tra lại Application Password hoặc test lại connection.

6. Lên lịch xuất bản

Thay vì publish ngay, bạn có thể chọn thời điểm cụ thể trong tương lai — hệ thống sẽ tự động gửi bài lên WordPress đúng giờ.

Đăng ngay (Immediate)

  • Publish ngay khi bạn nhấn nút
  • WordPress nhận request trong vài giây
  • Kết quả (URL bài) hiển thị ngay trong editor
  • Phù hợp cho bài viết đã sẵn sàng hoàn toàn

Lên lịch (Scheduled)

  • Chọn ngày giờ publish trong tương lai
  • Bài vào Queue với trạng thái pending
  • Cron job chạy mỗi 5 phút, kiểm tra bài đến hạn
  • Auto-Scheduler kích hoạt sớm hơn nếu bài sắp đến giờ

Bulk Schedule — Lên lịch hàng loạt

Cách bulk schedule nhiều bài cùng lúc

1

Vào trang CMS Publishing → tích chọn nhiều bài viết (bài đang ở trạng thái writing, editing, approved hoặc review)

2

Nhấn "Bulk Schedule" → dialog mở ra

3

Chọn CMS Connection (website WordPress muốn đăng)

4

Chọn Publish Status: publish (công khai) hoặc draft (bản nháp)

5

Chọn ngày giờ publish — tất cả bài sẽ được lên lịch cùng thời điểm, xử lý lần lượt theo priority

6

Nhấn "Lên lịch" — tất cả bài vào Queue, bài đầu tiên có priority cao nhất

7. Xử lý lỗi & Retry

Hệ thống tự động retry khi publish thất bại — bạn chỉ cần can thiệp khi đã hết tất cả lần thử.

Cơ chế Auto-Retry (tối đa 3 lần)

Lần 1

retry_count = 1 → status = pending → cron sẽ thử lại lần tiếp theo

Lần 2

retry_count = 2 → status = pending → cron sẽ thử lại lần tiếp theo

Lần 3

retry_count = 3 → status = failed → Gửi email thông báo → dừng auto-retry

Manual Retry

status = pending → cron xử lý lại ở lần chạy tiếp theo (không reset retry_count)

Email thông báo tự động

Publish thành công

Tiêu đề bài, URL trên WordPress, tên connection, thời điểm publish

Publish thất bại (final)

Thông báo lỗi, số lần đã thử, link để Retry thủ công từ email

Email gửi đến người tạo bài viết. Lỗi không phải lần cuối (lần 1, 2) sẽ không gửi email để tránh spam — chỉ lần cuối mới thông báo.

Lỗi thường gặp & Cách xử lý

Các lỗi phổ biến

401 UnauthorizedApplication Password sai hoặc hết hạn

Vào WordPress → tạo Application Password mới → cập nhật lại kết nối trong SEO Tool

403 ForbiddenUser không có quyền tạo post trên WordPress

Đảm bảo user dùng để kết nối có role Editor hoặc Administrator trong WordPress

404 Not FoundURL WordPress sai hoặc REST API bị tắt

Kiểm tra lại URL website. Trong WordPress Admin → Settings → Permalinks → nhấn Save để kích hoạt REST API

Connection timeoutWordPress server phản hồi chậm hoặc down

Thử lại sau vài phút. Nếu vẫn lỗi, kiểm tra server hosting hoặc nhấn Retry thủ công

SSL Certificate errorWebsite dùng HTTPS nhưng SSL cert không hợp lệ

Gia hạn SSL certificate hoặc dùng HTTP nếu site chưa có SSL

8. Bảo mật & Mã hoá

Thông tin đăng nhập WordPress (Application Password) được bảo vệ nghiêm ngặt — không ai, kể cả admin hệ thống, có thể đọc được password gốc sau khi lưu.

Mã hoá AES-256-GCM

Application Password được mã hoá bằng AES-256-GCM trước khi lưu vào database. Key mã hoá được lưu ở server environment, tách biệt hoàn toàn với database.

PBKDF2 Key Derivation

100.000 vòng lặp PBKDF2 (SHA-256) để derive encryption key từ master secret — chống brute force ngay cả khi database bị rò rỉ.

Không lộ trong API response

Các endpoint API trả về thông tin connection nhưng KHÔNG bao gồm password_encrypted. Frontend chỉ thấy trạng thái kết nối, không thấy credentials.

Xoá an toàn

Khi xoá kết nối, toàn bộ dữ liệu liên quan (queue items, logs, metadata cache) bị xoá theo — không còn credentials tồn tại trong hệ thống.

Khuyến nghị: Tạo một WordPress user riêng (role Editor) dành riêng cho SEO Tool, thay vì dùng tài khoản admin chính. Nếu credentials bị compromised, bạn chỉ cần revoke Application Password của user đó mà không ảnh hưởng đến admin account.

Câu hỏi thường gặp

Tôi có thể kết nối nhiều website WordPress không?

Có. Mỗi project có thể có nhiều CMS Connection — ví dụ blog tiếng Việt và blog tiếng Anh. Khi publish, bạn chọn connection muốn đăng. Mỗi connection quản lý categories/tags/authors riêng biệt.

Bài viết có bị cập nhật lại trên WordPress khi tôi chỉnh sửa trong SEO Tool không?

Không tự động. Bạn phải publish lại thủ công (Edit → Publish to CMS) để cập nhật bài trên WordPress. Hệ thống dùng remote_post_id để xác định bài đã tồn tại và thực hiện updatePost thay vì createPost.

Bài publish xong có URL WordPress không?

Có. Sau khi publish thành công, queue item lưu remote_post_url từ WordPress response. URL này hiển thị trong danh sách queue và có thể mở trực tiếp bài trên WordPress.

Nếu WordPress site down trong lúc publish thì sao?

Hệ thống sẽ retry tối đa 3 lần. Nếu cả 3 lần đều thất bại, bạn nhận email thông báo. Sau khi WordPress phục hồi, nhấn Retry thủ công trong Publish Queue để gửi lại.

Lên lịch publish lúc 2 giờ sáng có chính xác không?

Có độ trễ tối đa 5 phút (chu kỳ cron job). Hệ thống có Auto-Scheduler theo dõi bài sắp đến giờ và kích hoạt sớm hơn để giảm độ trễ. Thực tế bài thường được publish trong vòng 1–2 phút sau giờ hẹn.

Tôi có thể publish cùng bài lên nhiều WordPress site không?

Có. Mỗi lần bạn nhấn "Publish to CMS" là tạo 1 queue item mới. Chọn connection khác để publish lên site khác. Mỗi site có remote_post_id riêng được lưu lại.

Cron job không chạy — bài pending mãi không được xử lý?

Nếu queue item ở trạng thái pending quá lâu (>15 phút), có thể cron job đang bị lỗi. Liên hệ admin hệ thống để kiểm tra GitHub Actions / cron service. Trong lúc chờ, bạn có thể thử Cancel và publish lại theo cách Immediate.