Simplenews邮件开发:如何将GDPR链接插入正文而非尾部?
解决Simplenews邮件中插入GDPR链接的问题
你说得没错,模板里做str_replace确实太晚了——因为render($build)输出的是已经完成渲染的内容,这时候替换占位符自然不会生效。要把GDPR链接插入到邮件正文指定位置,得在邮件内容构建的早期阶段动手,下面给你两个可行的方案:
方案1:使用hook_simplenews_mail_alter钩子(推荐)
这个钩子会在邮件准备发送前触发,正好可以在内容还没被最终渲染前替换占位符,同时支持处理HTML和纯文本两种邮件版本。
在你的自定义模块里添加以下代码:
/** * Implements hook_simplenews_mail_alter(). */ function YOUR_CUSTOM_MODULE_simplenews_mail_alter(&$message, $context) { // 先确认是你要处理的新闻通讯类型(比如检查节点类型) if (isset($context['node']) && $context['node']->type == 'your_newsletter_content_type') { // 获取Scald图片的GDPR链接(这里替换成你实际的获取逻辑) $rgpd_url = ''; if (!empty($context['node']->field_scald_image)) { $scald_id = $context['node']->field_scald_image[LANGUAGE_NONE][0]['sid']; $scald_entity = scald_load($scald_id); $rgpd_url = file_create_url($scald_entity->file->uri); } // 替换HTML邮件里的占位符(比如你在Simplenews HTML版里写的[[GDPR_LINK]]) $message['body'] = str_replace('[[GDPR_LINK]]', '<a href="' . $rgpd_url . '">查看GDPR合规详情</a>', $message['body']); // 别忘了处理纯文本版本的邮件 $message['plain'] = str_replace('[[GDPR_LINK]]', $rgpd_url, $message['plain']); } }
方案2:使用hook_preprocess_simplenews_mail预处理函数
如果你习惯用模板预处理的思路,这个钩子可以在邮件模板渲染前修改内容变量:
/** * Implements hook_preprocess_simplenews_mail(). */ function YOUR_CUSTOM_MODULE_preprocess_simplenews_mail(&$variables) { // 同样先获取Scald图片的GDPR链接 $rgpd_url = ''; if (!empty($variables['node']->field_scald_image)) { $scald_id = $variables['node']->field_scald_image[LANGUAGE_NONE][0]['sid']; $scald_entity = scald_load($scald_id); $rgpd_url = file_create_url($scald_entity->file->uri); } // 替换正文里的占位符 $variables['body'] = str_replace('[[GDPR_LINK]]', '<a href="' . $rgpd_url . '">查看GDPR合规详情</a>', $variables['body']); }
最后一步:在Simplenews编辑器里添加占位符
打开你的Simplenews HTML版编辑界面,在你想要插入GDPR链接的位置写上[[GDPR_LINK]]就行,剩下的就交给钩子来替换成实际链接了。
内容的提问来源于stack exchange,提问作者Bryan Shinra
相关产品推荐
相关产品推荐

