WordPress eCards 的底层模块拆分:卡片数据、渲染与投递
WordPress eCards 的底层模块拆分:卡片数据、渲染与投递
WordPress eCards 类插件本质是一个“可视化卡片生成 + 表单收集 + 邮件/链接投递”的流程系统。底层通常拆为三层:卡片模板数据层、前端个性化渲染层、投递与追踪层。
数据层最常见的做法是注册一个自定义文章类型(CPT)来存放 eCard 模板,例如 ecard_template,模板包含背景图、默认文案、字体/配色、可编辑字段配置等。这样模板可被后台维护、分组、排序,并能在多主题环境下稳定复用。
渲染层负责把模板 +用户输入合成为最终卡片。实现上一般有两条路线:
- 前端 Canvas/Gutenberg/Elementor 小组件即时预览:用 JS 把文字叠加到背景图上预览;
- 服务端生成最终图像:使用 GD 或 Imagick 根据用户输入生成可分享图片(避免用户篡改前端结果)。
投递层则接手“把卡片发出去”。常见设计是:生成一条
ecard_send记录(自定义表更合理),记录发送者、接收者邮箱、message、模板 ID、生成图 URL、状态(pending/sent/failed)、追踪 token、过期时间。投递阶段用wp_mail()或第三方 SMTP,在成功后写回状态,同时提供一个带 token 的访问页用于查看/下载卡片。为了防刷和隐私,token 通常是hash_hmac(template_id + time + receiver_email)生成,查询时只用 token,不暴露原始邮箱。
关键代码骨架:模板 CPT、发送表单、服务端合成与邮件投递
下面是一个贴近 eCards 插件结构的简化底层骨架(关键点与实际插件一致):
// 1) eCard 模板 CPT
add_action('init', function () {
register_post_type('ecard_template', [
'label' => 'eCard Templates',
'public' => false,
'show_ui' => true,
'supports' => ['title','thumbnail','custom-fields'],
]);
});
// 2) 前端短代码:发送表单
add_shortcode('ecard_send_form', function(){
ob_start(); ?>
<form method="post">
&lt;input name="tpl_id" placeholder="Template ID" required&gt;
&lt;input name="to_email" type="email" placeholder="Receiver Email" required&gt;
&lt;input name="from_name" placeholder="Your Name" required&gt;
&lt;textarea name="message" placeholder="Write something..." required&gt;&lt;/textarea&gt;
&lt;button type="submit" name="ecard_submit"&gt;Send eCard&lt;/button&gt;
</form>
$tpl_id,'to'=>$to_email,'from'=>$from_name,
'msg'=>$message,'img'=>$img_path,'token'=>$token,'status'=>'pending'
];
add_option('ecard_'.$token, $record);
// 3.4 邮件投递
$view_url = home_url('/ecard-view?token='.$token);
$subject = "You've got an eCard from {$from_name}";
$body = "Message:\n{$message}\n\nView your card:\n{$view_url}";
$sent = wp_mail($to_email, $subject, $body);
$record['status'] = $sent ? 'sent' : 'failed';
update_option('ecard_'.$token, $record);
});
// 4) 生成图片函数(极简示意)
function ecard_render_image($bg_url, $from, $msg){
$bg_data = file_get_contents($bg_url);
$im = imagecreatefromstring($bg_data);
$black = imagecolorallocate($im, 0,0,0);
imagestring($im, 5, 30, 30, "From: ".$from, $black);
imagestring($im, 4, 30, 70, $msg, $black);
$out = WP_CONTENT_DIR.'/uploads/ecard-'.uniqid().'.png';
imagepng($im, $out); imagedestroy($im);
return $out;
}
这个骨架体现 eCards 插件最关键的底层点:
- 模板 CPT 负责可维护的卡片库,避免模板散落在短代码里;
- 前端只是采集与预览,最终图像必须服务端生成,保证一致性与防篡改;
- 发送记录要结构化存储并带 token,方便查看、追踪、重发与过期控制;
- 邮件投递与状态更新分离,便于后续加入队列、失败重试、限流(防刷)。
如果你要二开 WordPress eCards,重点不是 UI 花哨,而是把“模板 → 合成 → 投递 → 追踪”的链路做成稳定、可扩展、可审计的消息系统。
评论 0