Tới nội dung chính
hstation
Dịch vụDự ánVề tôiBlogThư viện nhạc

WordPress · 6 phút đọc · 2026-09-17

WordPress AI: lõi 7.1, Abilities API và kiểm tra khi chưa có khoá

WordPress AI có thể hiện diện trên giao diện nhưng vẫn chưa gọi được mô hình nào nếu chưa có khoá, provider hoặc model phù hợp. Các bước kiểm tra dưới đây tách rõ khả năng có mặt, quyền gọi và lỗi thiếu model.

WordPress AI không còn chỉ là chuyện của plugin bên ngoài. Trong WordPress 7.1, bản mình đo, lõi WordPress có sẵn ba mảnh để làm việc với AI. Nhưng lõi không tự viết bài, cũng không tự gọi mô hình nào. Bài này mở từng mảnh ra trên một site thử WordPress 7.1 để thấy nó làm được gì, và dừng ở đâu khi chưa có khoá API.

Mình không nhập khoá của nhà cung cấp nào, nên trong suốt bài không có lời gọi AI nào tốn tiền. Mọi kết quả dưới đây là đầu ra thật của WP-CLI 2.12 trên site thử.

WordPress AI là gì trong lõi 7.1

Trong thư mục wp-includes của WordPress 7.1 có ba phần liên quan tới AI:

  1. Abilities API: cách mô tả chuẩn "WordPress làm được việc gì" để công cụ khác, kể cả AI, gọi tới. Hàm chính: wp_register_ability, wp_get_abilities, wp_get_ability.
  2. AI Client: một lớp gọi mô hình AI dùng chung, bắt đầu từ hàm wp_ai_client_prompt().
  3. Connectors: nơi lưu khoá API dùng chung cho mọi plugin, có trang riêng trong wp-admin.

Ba phần này là hạ tầng. Tính năng mà người viết bài dùng trực tiếp, như tạo tiêu đề hay alt text, nằm ở plugin AI riêng.

WordPress Abilities API: ba việc có sẵn

Liệt kê các ability đang đăng ký:

bash
wp eval 'foreach ( wp_get_abilities() as $name => $a ) { echo $name, " | ", $a->get_label(), "\n"; }'

Site thử cho ra đúng 3 ability:

  • core/get-site-info: Lấy thông tin trang web.
  • core/get-user-info: Lấy thông tin người dùng.
  • core/get-environment-info: Lấy thông tin về môi trường.

Chạy thử một ability bằng tài khoản quản trị (thay demo bằng tên đăng nhập của bạn):

bash
wp eval 'echo wp_json_encode( wp_get_ability( "core/get-site-info" )->execute(), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT );' --user=demo

Kết quả trả về tên site, mô tả, URL, admin_email, bảng mã UTF-8, ngôn ngữ vi và phiên bản 7.1.

Hai ability còn lại, chạy cùng cách:

  • core/get-user-info trả mã người dùng, tên hiển thị, tên đăng nhập (user_login), vai trò administrator, ngôn ngữ, và URL hồ sơ. Ability này nhận tham số fields để chỉ lấy những trường cần, ví dụ chỉ display_name và locale.
  • core/get-environment-info trả môi trường local, phiên bản PHP 8.3.30, máy chủ cơ sở dữ liệu 8.4.3 và phiên bản WordPress 7.1.

Để ý: kết quả có cả email quản trị lẫn tên đăng nhập. Vì vậy quyền là chỗ quan trọng, và mình đo hai cách gọi không đăng nhập:

  • Chạy ability đó mà không có --user → lỗi ability_invalid_permissions: "Khả năng "core/get-site-info" không có quyền cần thiết."
  • Gọi REST GET /wp-json/wp-abilities/v1/abilities không đăng nhập → 401 với mã rest_forbidden.
bash
curl -s -o /dev/null -w "%{http_code}\n" https://ten-mien-cua-ban/wp-json/wp-abilities/v1/abilities

Đã đúng khi lệnh trên in ra 401. Nếu site của bạn trả 200 cho người chưa đăng nhập, hãy xem plugin nào đã mở quyền đó ra.

WordPress AI Client: khi chưa có khoá thì trả lời gì

Hàm wp_ai_client_prompt() nhận câu lệnh và trả về một bộ dựng. Mình hỏi nó có tạo được văn bản không:

bash
wp eval 'var_export( wp_ai_client_prompt( "Xin chào" )->is_supported_for_text_generation() );'

Kết quả: false. Gọi thẳng generate_text() thì nhận lỗi prompt_invalid_argument với nội dung "No models found that support text_generation for this prompt."

Nghĩa là: lõi có sẵn đường gọi AI, nhưng chưa có nhà cung cấp và khoá thì không có mô hình nào để gọi, và không có lời gọi mạng nào tốn tiền. Bộ dựng còn có using_abilities(), là chỗ để cho mô hình được dùng các ability ở phần trên khi đã có nhà cung cấp.

WordPress Connectors: trang lưu khoá dùng chung

Vào Cài đặt → Connectors. Bản tiếng Việt ghi tiêu đề "Kết nối":

Trang Kết nối trong wp-admin WordPress 7.1 bản tiếng Việt, dòng mô tả Tất cả các khóa API và thông tin đăng nhập của bạn được lưu trữ ở đây và chia sẻ giữa các plugin. Phía trên là banner Plugin AI có thể sử dụng các cổng kết nối AI của bạn để tạo ảnh đại diện, văn bản thay thế, tiêu đề, đoạn trích, kèm nút Cài đặt plugin AI. Bên dưới là bốn thẻ: Chống thư rác Akismet với nút Kích hoạt; Anthropic, Tạo văn bản với Claude; Google, Tạo văn bản và hình ảnh với Gemini và Imagen; OpenAI, Tạo văn bản và hình ảnh với GPT và Dall-E; ba thẻ AI đều có nút Cài đặt.
Trang Kết nối trong wp-admin WordPress 7.1 bản tiếng Việt, dòng mô tả Tất cả các khóa API và thông tin đăng nhập của bạn được lưu trữ ở đây và chia sẻ giữa các plugin. Phía trên là banner Plugin AI có thể sử dụng các cổng kết nối AI của bạn để tạo ảnh đại diện, văn bản thay thế, tiêu đề, đoạn trích, kèm nút Cài đặt plugin AI. Bên dưới là bốn thẻ: Chống thư rác Akismet với nút Kích hoạt; Anthropic, Tạo văn bản với Claude; Google, Tạo văn bản và hình ảnh với Gemini và Imagen; OpenAI, Tạo văn bản và hình ảnh với GPT và Dall-E; ba thẻ AI đều có nút Cài đặt.

Trên site thử có 4 connector: Anthropic, Google, OpenAI (loại nhà cung cấp AI) và Akismet (loại chống thư rác). Mỗi nhà cung cấp AI là một plugin riêng: ai-provider-for-anthropic, ai-provider-for-google, ai-provider-for-openai. Nút "Cài đặt" trên thẻ là để cài plugin đó.

WordPress AI API key: WordPress tìm khoá ở đâu

Mã nguồn connectors.php của WordPress 7.1 tìm khoá theo đúng thứ tự:

  1. Biến môi trường trên máy chủ.
  2. Hằng số PHP, ví dụ đặt trong wp-config.php.
  3. Cơ sở dữ liệu, trong tuỳ chọn tên connectors_ai_{id}_api_key.

Tên biến môi trường và hằng số giống nhau, theo quy ước id viết hoa cộng _API_KEY: OPENAI_API_KEY, ANTHROPIC_API_KEY, GOOGLE_API_KEY. Đặt bằng hằng số trông như sau:

php
define( 'OPENAI_API_KEY', 'khoa-cua-ban' );

Vì sao thứ tự này đáng để ý: khoá nhập qua trang Kết nối nằm trong bảng tuỳ chọn của cơ sở dữ liệu. Ở bài Khôi phục website WordPress, bản sao lưu cơ sở dữ liệu xuất bằng wp db export chứa toàn bộ các bảng, kể cả bảng tuỳ chọn. Tức là ai giữ tệp sao lưu cũng giữ luôn khoá. Đặt khoá bằng biến môi trường hoặc hằng số thì khoá không nằm trong tệp đó.

Khi hiển thị khoá, WordPress che bớt: tối đa 16 dấu chấm tròn, chỉ hiện 4 ký tự cuối.

Kiểm nhanh site của bạn đã có WordPress AI trong lõi chưa

Chạy bốn lệnh sau trong thư mục gốc của site. Kết quả trong ngoặc là của site thử:

  1. Phiên bản WordPress (site thử in ra 7.1):
bash
wp core version
  1. Ba tệp lõi có mặt không (site thử in đủ abilities-api.php, ai-client.php, connectors.php):
bash
ls wp-includes | grep -E "^(abilities-api|ai-client|connectors)\.php$"
  1. Có bao nhiêu ability (site thử in ra 3):
bash
wp eval 'echo count( wp_get_abilities() ), "\n";'
  1. Có những connector nào (site thử in ra anthropic, google, openai, akismet):
bash
wp eval 'foreach ( wp_get_connectors() as $id => $c ) { echo $id, "\n"; }'

Nếu lệnh thứ hai không in ra gì, site của bạn chưa có các phần này trong lõi, và các lệnh sau sẽ báo hàm không tồn tại. Số ability và danh sách connector có thể nhiều hơn site thử nếu bạn đã cài plugin đăng ký thêm.

WordPress AI có tự viết bài không

Không, ít nhất là với lõi 7.1 trên site thử. Lõi chỉ có hạ tầng: ability, bộ gọi AI, và nơi lưu khoá. Muốn có nút tạo tiêu đề, alt text, đoạn trích trong trình soạn thảo, cần plugin AI chính thức cùng một plugin nhà cung cấp, rồi nhập khoá. Phần đó mình đã cài và đo ở bài riêng về plugin AI cho WordPress.

Những gì mình chưa kiểm

  • Chưa nhập khoá, chưa gọi mô hình thật, nên không có số về chất lượng, tốc độ hay chi phí.
  • Chưa thử cho công cụ AI bên ngoài gọi ability qua REST khi đã đăng nhập.
  • Chưa kiểm WordPress bản cũ hơn 7.0.

Nếu bạn đang chuẩn bị bật AI cho site thật, làm các bước kiểm tra an toàn ở bài Website WordPress bị hack trước. Một khoá API lộ ra là một khoản tiền có thể bị người khác tiêu.