WordPress 前端调试:无法删除中文命名的模板

1、不使用 min.js

在 wp-config.php 中增加一行 define( 'SCRIPT_DEBUG', true ); 即可让 WordPress 前端不使用 xx.min.js,直接使用 xx.js。

其他更多的调试设置,包括输出 php 日志、打印 sql 执行语句等,请阅读:debugging-in-wordpress

2、BUG,无法删除中文命名的模板

今天遇到一个 WordPress 自身的 BUG,就是当你在编辑文章的时候,创建了一个文章模板,并使用中文命名。然后当你删除这个模板的时候,页面不会有任何提示,但它提交的 ajax post 请求其实返回了一个404错误:

其表面原因是这个 URL 中,在主题名与模板名之间,变成了两个斜杠/。URL 中的 %e8%87%aa%e5%ae%9a%e4%b9%89%e6%a8%a1%e6%9d%bf22 是模板名「自定义模板22」的 URL 编码。

我的开发环境:

WordPress 6.1.1

Nginx 1.23.3

3、DEBUG

在源码中一通乱找跟 ‘delete template’ 有关的信息,先是定位到 core-data.js 文件。

其中 path = “/wp/v2/templates/twentytwentytwo//%e8%87%aa%e5%ae%9a%e4%b9%89%e6%a8%a1%e6%9d%bf22”

组成 path 的 recordId 应该来自 edit-post.js 中的 template.id。

template.id = “twentytwentytwo//%e8%87%aa%e5%ae%9a%e4%b9%89%e6%a8%a1%e6%9d%bf22”

template 来自于

这一小段代码实在看得人太痛苦了,对 javascript 的语法糖简直是无所不用其极。😤

(1) => 箭头函数

(x) => x + 6

相当于

function(x){
  return x + 6;
}

(2) {} 解构

const {foo, bar} = obj

相当于

const foo = obj.foo
const bar = obj.bar

(3) (0, function)(params) 间接调用

(0, function_name)(params);
等价于
function_name(params);

但是 (0, function_name)(params) 的变量作用域会被扩大。

其本质是:
fun1 = (0, function_name)  // 逗号隔开的多个表达式,会返回最后一个表达式的结果。(所以前头这个 0,你也可以用任意其他数字或表达式)
fun1(params)               // 此时 fun1 仍是 function_name,但是内部作用域变了

但是上面的 useSelect 函数源码我还是没看懂。

总之最后能追踪到的就是在 getEditedPostTemplate 函数中,它给加上了双斜杠!

4、解决办法

(1) 已经提交了 BUG 给 WordPress 官网,等他们团队解决。

(2) URL 中的双斜杠处理还跟 HTTP 服务程序有关,我用的是 Nginx, 网上可以找到 Nginx 处理双斜杠的方法。

(3) 临时修改,可以直接在浏览器开发者工具的 console 窗口中,修改 path 变量,删除一个斜杠即可。

 

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top