白屏根因: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>
70 lines
2.0 KiB
PHP
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";
|