WordPress eCards 的底层模块拆分:卡片数据、渲染与投递

WordPress eCards 的底层模块拆分:卡片数据、渲染与投递

WordPress eCards 类插件本质是一个“可视化卡片生成 + 表单收集 + 邮件/链接投递”的流程系统。底层通常拆为三层:卡片模板数据层前端个性化渲染层投递与追踪层。 数据层最常见的做法是注册一个自定义文章类型(CPT)来存放 eCard 模板,例如 ecard_template,模板包含背景图、默认文案、字体/配色、可编辑字段配置等。这样模板可被后台维护、分组、排序,并能在多主题环境下稳定复用。 渲染层负责把模板 +用户输入合成为最终卡片。实现上一般有两条路线:

  1. 前端 Canvas/Gutenberg/Elementor 小组件即时预览:用 JS 把文字叠加到背景图上预览;
  2. 服务端生成最终图像:使用 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">

<input name="tpl_id" placeholder="Template ID" required>
<input name="to_email" type="email" placeholder="Receiver Email" required>
<input name="from_name" placeholder="Your Name" required>
<textarea name="message" placeholder="Write something..." required></textarea>
<button type="submit" name="ecard_submit">Send eCard</button>

</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