Files
wordpress-theme-aksrt/tools/check-class-refs.php
T
kate522andClaude Opus 5 2c7262770b fix(creator-studio): 修复白屏与前台 REST 鉴权
白屏根因:CreatorRest / SubmissionVersion 位于 Jio\Core 命名空间,
但调用 Jio\Content\PrivateAssets 时缺少 use 导入,PHP 就近解析为不存在的
Jio\Core\PrivateAssets,在 wp_head 中抛致命错误导致页面输出截断。

- 为 CreatorRest、SubmissionVersion 补上 use Jio\Content\PrivateAssets
- 新增前台 api-fetch nonce 中间件:WordPress 只在后台注入 wpApiSettings,
  前台工作台里 Gutenberg core-data 请求(/wp/v2/users/me)因此全部 403
- 提交前先落一次草稿,避免自动保存未触发时发布到旧内容
- 新增 tools/check-class-refs.php:静态检测命名空间内未导入的裸类引用
- 新增 assets/creator-studio/scripts/smoke.cjs:浏览器冒烟脚本,
  抓控制台错误、失败请求与未捕获的 Promise 拒绝

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-11-06 15:39:10 +08:00

70 lines
2.0 KiB
PHP

<?php
define('ABSPATH', 'C:/Users/Xing/Desktop/AKSRT/Jio/');
require 'C:/Users/Xing/Desktop/AKSRT/Jio/vendor/autoload.php';
$classes = [
'Jio\Core\CreatorRest',
'Jio\Core\CreatorStudio',
'Jio\Core\SubmissionVersion',
'Jio\Core\PreviewToken',
'Jio\Content\PrivateAssets',
'Jio\Content\ProtectedDownload',
'Jio\Admin\Native\SubmissionReview',
];
$bad = 0;
foreach ($classes as $c) {
$f = (new ReflectionClass($c))->getFileName();
$src = file_get_contents($f);
// 去掉注释与字符串,只保留可执行代码里的类引用。
$code = '';
foreach (token_get_all($src) as $tok) {
if (is_array($tok)) {
if (in_array($tok[0], [T_COMMENT, T_DOC_COMMENT, T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE], true)) {
continue;
}
$code .= $tok[1];
} else {
$code .= $tok;
}
}
$ns = '';
if (preg_match('/^namespace\s+([^;]+);/m', $src, $mm)) {
$ns = trim($mm[1], '\\');
}
$imports = [];
preg_match_all('/^use\s+([A-Za-z0-9_\\\\]+)(?:\s+as\s+([A-Za-z0-9_]+))?;/m', $code, $um, PREG_SET_ORDER);
foreach ($um as $u) {
$full = $u[1];
$short = (isset($u[2]) && $u[2] !== '') ? $u[2] : substr($full, strrpos($full, '\\') + 1);
$imports[$short] = true;
}
// 只匹配未加前导反斜杠的短类名;`\Foo\Bar::baz()` 是全限定引用,不受命名空间影响。
preg_match_all('/(?<![\\\\A-Za-z0-9_])([A-Z][A-Za-z0-9_]*)::/', $code, $m);
$own = substr($c, strrpos($c, '\\') + 1);
foreach (array_unique($m[1]) as $name) {
if (in_array($name, ['self', 'static', 'parent'], true) || $name === $own) {
continue;
}
if (isset($imports[$name])) {
continue;
}
$candidate = $ns . '\\' . $name;
if (class_exists($candidate) || interface_exists($candidate) || trait_exists($candidate)) {
continue;
}
if (class_exists($name) || interface_exists($name)) {
continue;
}
echo "MISSING in {$c}: {$name} (resolved as {$candidate})\n";
$bad++;
}
}
echo $bad === 0 ? "OK: no unresolved class references\n" : "FAILURES={$bad}\n";