Bolt CMS后台能否为内容类型添加自定义过滤器/验证器?
当然可以!在Bolt CMS里,你完全可以通过事件监听的方式,给内容保存流程添加自定义的过滤器/验证逻辑,刚好能实现你要的邮箱识别、编码需求。下面我给你一步步拆解实现方法,另外也补充几个Bolt生态里常用的防垃圾邮件抓取方案,供你参考:
Bolt的内容生命周期有一系列可监听的事件,其中content.preSave就是内容保存到数据库前的钩子,我们可以通过这个事件介入处理字段内容。
步骤1:创建自定义扩展的事件监听器
首先,你需要在Bolt的本地扩展目录(extensions/local/)里创建一个扩展(或者在现有自定义扩展里修改),在扩展的主文件(比如YourCustomExtension.php)里注册事件监听:
use Bolt\Event\ContentEvent; use Bolt\Extension\BaseExtension; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class YourCustomExtension extends BaseExtension implements EventSubscriberInterface { public function getName(): string { return 'your-custom-extension'; } public static function getSubscribedEvents() { return [ // 监听内容保存前的事件 'content.preSave' => 'processEmailBeforeSave', ]; } public function processEmailBeforeSave(ContentEvent $event) { $content = $event->getContent(); // 只处理你指定的内容类型和字段,比如"page"类型的"body"字段 $contentTypeSlug = $content->getContentType()->getSlug(); if ($contentTypeSlug !== 'page') { return; } $fieldValue = $content->get('body'); if (empty($fieldValue)) { return; } // 调用处理函数,替换邮箱为编码后的脚本 $processedContent = $this->encodeEmails($fieldValue); $content->set('body', $processedContent); } }
步骤2:实现邮箱识别与编码的核心逻辑
在同一个扩展类里,添加encodeEmails方法,完成正则匹配邮箱、base64编码、替换成目标脚本的逻辑:
private function encodeEmails(string $text): string { // 用正则匹配文本中的邮箱地址(这个正则是基础版,可根据需求调整) $emailRegex = '/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/'; // 遍历匹配到的邮箱,逐个替换 return preg_replace_callback($emailRegex, function ($matches) { $originalEmail = $matches[0]; $base64Encoded = base64_encode($originalEmail); // 替换成你需要的脚本格式 return '<script> document.write(window.atob("' . $base64Encoded . '")); </script>'; }, $text); }
步骤3:启用扩展
把这个扩展放到extensions/local/目录后,登录Bolt后台,进入「扩展」页面找到你的自定义扩展并启用。之后每次保存对应内容类型的项时,字段里的邮箱就会自动被处理后存入数据库。
如果你的核心需求只是防止垃圾邮件机器人抓取邮箱,不一定非要修改数据库内容,Bolt还有几个更省心的方案:
使用Twig内置的混淆过滤器:Bolt的模板引擎Twig自带
|obfuscate过滤器,能在前端渲染时自动混淆邮箱,不需要修改后台保存的内容。比如在模板里这么写:{{ page.body|obfuscate }}它会把邮箱转换成HTML实体或其他混淆形式,爬虫难以识别,但用户正常浏览时完全不受影响。
JS拼接邮箱链接:在模板里生成邮箱联系链接时,用JS动态拼接邮箱地址,避开静态文本抓取:
<a href="#" onclick="window.location.href = 'mailto:' + 'test' + '@' + 'test.com'">联系我们</a>用表单替代直接显示邮箱:Bolt有内置的表单功能,你可以创建一个联系表单,让用户通过表单发送消息,完全不暴露邮箱地址,这是最彻底的防爬方式。
内容的提问来源于stack exchange,提问作者T.O.M.

