用户 2026-10-27 提出,希望写文章时自动生成别名(英文 slug)、标签、分类、摘要。先问「主题能做吗,还是必须用插件」,我做了四组实测后给出方案,用户确认后开工。
post_excerpt
用户已删除原 wp-autotags 插件(该插件把文章内容发往第三方 cws.9sep.org)。
wp-autotags
cws.9sep.org
纯 PHP 做不到翻译。实测三条路:
信息焦虑综合症
xin-xi-jiao-lu-zong-he-zheng
Information Anxiety Syndrome
information-anxiety-syndrome
p(tag|cat)
后台需为每个服务商提供如何申请 Key 的说明(含申请入口链接与步骤)。
inc/theme-options.php
type=heading
inc/theme-writing.php
publish_post
$update === false
get_option('kratos')
主题设置新增「写作增强」标签页 + 四引擎自动生成(别名/标签/分类/摘要)。是在途工单里没有的新功能域,与 #24 分类挂件(已关闭)、#22 最近评论挂件等均无关。
代码已提交并推送:0a5486e(commit 信息带 #25)。 发布包已落到 theme-update/,update.json 已指向 3.2.57,md5 fa7169428795e8ca7414321612fec9b9。
0a5486e
theme-update/
update.json
fa7169428795e8ca7414321612fec9b9
升级方式:后台「外观 → 主题」点更新即可。升级完四个开关都是关的,行为和你现在完全一样;想用哪个再进去勾。
不用。主题自己就能做。 四个功能全部在主题内置,没有引入任何第三方插件,也没有把文章内容发到任何第三方站点(wp-autotags 那种行为本版完全没有)。
做发布前验证时发现的:apply() 里原来写的是
apply()
list($suggest, $_) = yang_writing_make_tags($title, $body);
make_tags() 返回两段——词典里已命中的标签和词典外值得新建的候选。$_ 把第二段整个丢掉了;接着又拿 $suggest 去 get_term_by 做二次分类,而 $suggest 里每个词都来自词典、必然全部命中 ⇒ 「新建标签」那个分支永远进不去。
make_tags()
$_
$suggest
get_term_by
也就是说:你第 1 条决策(「标签需要新增,如果不能新增,一个新的博客永远无法使用这个功能」)在真实发布流程里一次都没生效过。改成 list($exist_hits, $new_cands) 后实测「上限=3 时真的新建 3 个」。
list($exist_hits, $new_cands)
这个 bug 只有走端到端(真发一篇文章、再查数据库)才看得见——光看源码,make_tags() 本身是对的,, $_ 在 PHP 里也完全合法。
, $_
of_sanitize_password
反证的意思是:故意把产品改坏,确认判据会红。比如把钩子从 transition_post_status 改成 save_post、把 slug 改成一律覆盖、把 append 改成 false、把 list($exist_hits, $new_cands) 退回 list($suggest, $_)——每一组都精确红在对那条判据上。
transition_post_status
save_post
append
false
list($suggest, $_)
这一步不是形式主义:本轮我自己就写出过两条永远绿的假判据,都是靠反证揪出来的(详见下方"踩坑")。
GROUPS
list($a, $_)
count=0
term_relationships
array(
in_array(
strpos($ln,'array(')
in_array($tail, yang_writing_seps(), true)
\$
'#in_array\(\s*\\\$tail#'
$tail
****abcd
确认没问题我再关闭工单。有任何一项不符合,直接在这个单里说。
按用户确认收尾,交付见上条发布评论。
交付版本:3.2.57(写作增强四个引擎 + 设置页,零插件依赖)
用户已验收,关闭本单。
No dependencies set.
The note is not visible to the blocked user.
来源
用户 2026-10-27 提出,希望写文章时自动生成别名(英文 slug)、标签、分类、摘要。先问「主题能做吗,还是必须用插件」,我做了四组实测后给出方案,用户确认后开工。
一、需求(用户确认的 7 条)
post_excerpt用户已删除原
wp-autotags插件(该插件把文章内容发往第三方cws.9sep.org)。二、线上环境实测(决定了方案边界)
三、四引擎技术路线(各自独立,逐个可开关)
① 别名(英文 slug)—— 必须外部 API
纯 PHP 做不到翻译。实测三条路:
信息焦虑综合症→xin-xi-jiao-lu-zong-he-zhengInformation Anxiety Syndrome→information-anxiety-syndrome② 标签 —— 本地优先,外部可选
实测 60 篇 / 243 个人工标签:Top8 召回 74.9%,无一篇全错,单篇 17~27ms。
③ 分类 —— 纯本地
(
p(tag|cat)分母小 ⇒ 小分类被抬高几十倍)。Top1 90.0% / Top3 99.0%(290 篇单分类文章)。
④ 摘要 —— 纯本地
post_excerpt。四、服务商清单(服务器侧已探活)
Google 翻译LibreTranslate后台需为每个服务商提供如何申请 Key 的说明(含申请入口链接与步骤)。
五、待实现清单
inc/theme-options.php新增「写作增强」标签页(type=heading分组,框架天然支持多标签页)inc/theme-writing.php(新建)四引擎 + 服务商适配层publish_post(只发布)+ 新建判定($update === false)+ 幂等标记get_option('kratos'),页面上脱敏显示(只显示后 4 位)六、硬约束(红线)
七、验收标准
为什么单独建单
主题设置新增「写作增强」标签页 + 四引擎自动生成(别名/标签/分类/摘要)。是在途工单里没有的新功能域,与 #24 分类挂件(已关闭)、#22 最近评论挂件等均无关。
已发布 3.2.57,等你确认后关闭
代码已提交并推送:
0a5486e(commit 信息带 #25)。发布包已落到
theme-update/,update.json已指向 3.2.57,md5fa7169428795e8ca7414321612fec9b9。升级方式:后台「外观 → 主题」点更新即可。升级完四个开关都是关的,行为和你现在完全一样;想用哪个再进去勾。
一、你问的核心问题:要不要装插件
不用。主题自己就能做。 四个功能全部在主题内置,没有引入任何第三方插件,也没有把文章内容发到任何第三方站点(
wp-autotags那种行为本版完全没有)。二、四个引擎分别在哪儿、怎么工作的
post_excerpt为空时三、本版修掉的一个真 bug
做发布前验证时发现的:
apply()里原来写的是make_tags()返回两段——词典里已命中的标签和词典外值得新建的候选。$_把第二段整个丢掉了;接着又拿$suggest去get_term_by做二次分类,而$suggest里每个词都来自词典、必然全部命中 ⇒ 「新建标签」那个分支永远进不去。也就是说:你第 1 条决策(「标签需要新增,如果不能新增,一个新的博客永远无法使用这个功能」)在真实发布流程里一次都没生效过。改成
list($exist_hits, $new_cands)后实测「上限=3 时真的新建 3 个」。这个 bug 只有走端到端(真发一篇文章、再查数据库)才看得见——光看源码,
make_tags()本身是对的,, $_在 PHP 里也完全合法。四、验证数据
of_sanitize_password)反证的意思是:故意把产品改坏,确认判据会红。比如把钩子从
transition_post_status改成save_post、把 slug 改成一律覆盖、把append改成false、把list($exist_hits, $new_cands)退回list($suggest, $_)——每一组都精确红在对那条判据上。这一步不是形式主义:本轮我自己就写出过两条永远绿的假判据,都是靠反证揪出来的(详见下方"踩坑")。
五、过程中值得记下来的坑
GROUPS是 bash 只读内建数组(存用户组 ID)。我拿它当计数器,赋值被静默忽略,最后输出「1008 组」——恰好是本机主组 ID。list($a, $_)丢返回值:语法完全合法,静态检查全过,只有端到端能抓。count=0不是"可删除"的判据:反查term_relationships发现有的标签count=0但仍有 1 条关系,只是计数器漂移。按count=0清孤儿会误删真实标签。array(是in_array(的子串:判"有没有内联字数组"时写strpos($ln,'array('),在in_array($tail, yang_writing_seps(), true)这种正确代码上也命中,假红。\$不转义:'#in_array\(\s*\\\$tail#'得到的是「字面反斜杠 + 行尾锚点」,永远匹配不到$tail。教训不是记反斜杠个数,而是别在多层转义里手写正则。六、需要你在后台确认的
****abcd」。确认没问题我再关闭工单。有任何一项不符合,直接在这个单里说。
按用户确认收尾,交付见上条发布评论。
交付版本:3.2.57(写作增强四个引擎 + 设置页,零插件依赖)
用户已验收,关闭本单。