用途:从源码启动 WordPress Playground 网站的本地开发服务器,并通过 Playwright MCP(浏览器自动化 MCP 服务器)进行交互,用于排查 UI 缺陷等调试工作。需要 Node.js 与 Playwright MCP 服务器。
主要能力与界面结构:Playground 网站为三层结构。父页面为 Playground 外壳(React 应用),包含 URL 栏、保存按钮、已保存 Playground、站点管理器、设置齿轮。外层 iframe(playground-viewport)加载 remote.html,负责注册 Service Worker、启动 PHP 运行时 Web Worker,并通过 Comlink 暴露 Playground API。内层 iframe(#wp)承载实际 WordPress 站点,包括仪表盘、文章、页面、插件、主题、区块编辑器与前台。Playwright 的 browser_snapshot 会自动遍历两个 iframe,一次快照即可看到三层内容;点击 WordPress 内元素时由 Playwright 处理 iframe 定位。
启动方式:确保使用 .nvmrc 指定的 Node.js 版本(nvm use);清理占用 5400、5263、6400 端口的旧进程(lsof -ti:5400 -ti:5263 -ti:6400 | xargs kill);后台启动 npm run dev,首次构建最长约 120 秒,可用 curl 轮询 http://127.0.0.1:5400/website-server/ 直到返回就绪;随后用 Playwright MCP 执行 browser_navigate 打开该地址、browser_snapshot 查看页面结构、browser_take_screenshot 截图。开发服务器默认以管理员身份自动登录,支持热更新。访问 WordPress 页面(如 /wp-admin/)可通过 Playground URL 栏输入路径并回车。
调试要点:可用 browser_console_messages 查看 JS 错误;用 browser_network_requests 查看 XHR/fetch 请求状态,无状态码为仍挂起,显示 ERR_FAILED 多为 Service Worker 25 秒超时,可能对应 PHP-WASM 死锁。WordPress 管理后台的侧边栏子菜单默认被定位到屏幕外,点击会报元素在视口外,可先悬停父菜单项再点击,或直接对元素执行 JS click。
请求管线:浏览器请求经 Service Worker 拦截,broadcastMessageExpectReply 广播到窗口客户端,remote.html 接收后代理到 Web Worker,PHPProcessManager 通过信号量获取 PHP 实例(最多 2 个,30 秒超时),由 PHP-WASM 执行;若 PHP 调用 wp_remote_get,会经 Wp_Http_Fetch 回到 JS fetch,而回环 URL 会再次经过 Service Worker,需要另一个 PHP 实例。Service Worker 等待响应 25 秒超时,PHP 信号量却等待 30 秒,二者不一致。注意 npm run dev 还会启动 PHP CORS 代理(php -S 127.0.0.1:5263),若系统未安装 PHP,该子进程会失败,网站仍可加载,但依赖 CORS 代理的功能不可用。具体页面行为、限制条件与其它细节资料暂未提供。