Вступ
Якщо ви хочете керувати своїм WordPress-сайтом через зовнішні інструменти, наприклад Claude, зручним способом буде використання MCP-сервера. У цій статті ми розберемо, як створити такий сервер на Python із підтримкою WPML для багатомовності.
1. Архітектура сервера
Ми використовуємо бібліотеку FastMCP для реалізації MCP-сервера. Сервер уміє:
- Отримувати список записів.
- Отримувати один запис за ID.
- Створювати записи.
- Оновлювати записи.
- Працювати з мовою запису через WPML (параметр lang).
Конфігурація підключення до WordPress зберігається в окремому файлі .ini, що дозволяє легко змінювати облікові дані та URL сайту.
2. Конфігураційний файл
Створіть файл wordpress.ini у тій самій папці, що й скрипт MCP:
[wordpress]
url = https://example.com
user = your_username
app_password = your_application_password
Де взяти пароль: цей пароль потрібно створити на сайті, зайшовши до профілю користувача й вибравши опцію створення пароля застосунку.
3. Основний код MCP-сервера
import os
import configparser
import requests
from typing import Optional, Dict
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("WordPress-MCP-Server")
# --- завантаження конфігурації ---
config = configparser.ConfigParser()
config_path = os.path.join(os.path.dirname(__file__), 'wordpress.ini')
config.read(config_path)
WP_URL = config['wordpress']['url']
WP_USER = config['wordpress']['user']
WP_APP_PASSWORD = config['wordpress']['app_password']
auth = (WP_USER, WP_APP_PASSWORD)
# --- допоміжна функція ---
def wp_request(method: str, endpoint: str, data: Optional[Dict] = None, lang: Optional[str] = None):
url = f"{WP_URL.rstrip('/')}/wp-json/wp/v2/{endpoint.lstrip('/')}"
params = {}
if lang:
params['lang'] = lang # параметр мови WPML
resp = requests.request(method, url, auth=auth, json=data, params=params)
resp.raise_for_status()
return resp.json()
# --- інструменти MCP ---
@mcp.tool()
def list_posts(status: str = "publish", per_page: int = 10, lang: Optional[str] = None):
"""Повернути список записів указаною мовою"""
return wp_request('GET', f'posts?status={status}&per_page={per_page}', lang=lang)
@mcp.tool()
def get_post(post_id: int, lang: Optional[str] = None):
"""Повернути один запис за ID указаною мовою"""
return wp_request('GET', f'posts/{post_id}', lang=lang)
@mcp.tool()
def create_post(title: str, content: str, status: str = "draft", lang: Optional[str] = None):
"""Створити новий запис указаною мовою"""
endpoint = 'posts'
if lang:
endpoint += f"?lang={lang}"
data = {"title": title, "content": content, "status": status}
return wp_request('POST', endpoint, data)
@mcp.tool()
def update_post(post_id: int, title: Optional[str] = None, content: Optional[str] = None,
status: Optional[str] = None, lang: Optional[str] = None):
"""Оновити наявний запис указаною мовою"""
data = {}
if title is not None:
data['title'] = title
if content is not None:
data['content'] = content
if status is not None:
data['status'] = status
if not data:
return {"error": "No data to update"}
endpoint = f'posts/{post_id}'
if lang:
endpoint += f"?lang={lang}"
return wp_request('POST', endpoint, data)
if __name__ == "__main__":
print("WordPress MCP server running with WPML language support...")
mcp.run()
4. Використання MCP-сервера
Приклади викликів функцій через MCP:
Отримати записи французькою:
list_posts(lang="fr")
Отримати конкретний запис німецькою:
get_post(123, lang="de")
Створити запис іспанською:
create_post("Hola mundo", "Contenido de prueba", status="publish", lang="es")
Оновити запис англійською:
update_post(456, title="Updated title", lang="en")
WPML створює окремі записи для кожної мови. Цей MCP уміє працювати з мовою через параметр lang, але автоматичне зв’язування перекладів між мовами тут неможливе без додаткових розширень.
5. Висновок
За допомогою такого MCP-сервера ви можете інтегрувати WordPress із зовнішніми інструментами й керувати контентом різними мовами. Структура сервера проста, безпечна та розширювана: можна додавати додаткові функції, наприклад роботу з категоріями, тегами або медіафайлами.
Якщо хочеш, можна додатково зробити конфіг із мовою за замовчуванням, щоб не передавати lang у кожному виклику, і це ще більше спростить роботу з багатомовним контентом.
