WordPress无插件实现发送邮件按钮短代码求助
解决WordPress短代码实现点击按钮给登录用户发邮件的问题
我看了你的两段代码,问题主要集中在这几个核心点:
- 没有用表单包裹提交按钮,导致点击按钮时根本不会触发POST请求
- 第二段代码把PHP逻辑当成字符串赋值,完全不会执行,只是输出文本
- 缺少WordPress必要的安全验证,也没检查用户是否登录状态
下面是修正后的完整代码,我会一步步拆解关键改动:
function boutoncode($atts, $content = null) { // 初始化操作提示信息 $message = ''; // 先处理表单提交逻辑(放在最前面,确保请求触发时优先执行) if (isset($_POST['envoyer_promo_code']) && wp_verify_nonce($_POST['promo_code_nonce'], 'send_promo_code_action')) { // 检查用户是否已登录 if (is_user_logged_in()) { $current_user = wp_get_current_user(); $user_email = $current_user->user_email; $user_name = $current_user->display_name; // 配置邮件内容 $subject = '你的专属促销码已送达'; $email_content = "嗨 {$user_name},\n\n这是你的专属促销码:XYZ-123\n\n感谢你的支持!"; $headers = array('Content-Type: text/plain; charset=UTF-8'); // 使用WordPress内置函数发送邮件 if (wp_mail($user_email, $subject, $email_content, $headers)) { $message = '<p style="color: green; margin: 10px 0;">邮件已成功发送到你的注册邮箱!</p>'; } else { $message = '<p style="color: red; margin: 10px 0;">邮件发送失败,请稍后重试或联系管理员。</p>'; } } else { $message = '<p style="color: orange; margin: 10px 0;">请先登录账户,才能获取专属促销码哦!</p>'; } } // 解析短代码自定义属性 extract(shortcode_atts(array( 'couleur' => 'bleu' ), $atts)); // 生成带表单的按钮HTML(添加安全验证字段) $button_html = ' <form method="post" action="" style="margin: 10px 0;"> ' . wp_nonce_field('send_promo_code_action', 'promo_code_nonce', true, false) . ' <input class="bouton ' . esc_attr($couleur) . '" type="submit" name="envoyer_promo_code" value="Cliquez ICI pour recevoir par Email le CODE PROMO" /> </form> '; // 返回提示信息+按钮HTML return $message . $button_html; } add_shortcode('boutoncode', 'boutoncode');
关键修正说明:
- 表单包裹按钮:给submit按钮添加了
<form>标签,method="post"确保点击时发送POST请求,action=""表示提交到当前页面 - 安全验证:用
wp_nonce_field生成CSRF验证字段,提交后用wp_verify_nonce验证请求合法性,避免恶意提交 - 登录状态检查:用
is_user_logged_in()确认用户已登录,避免给未登录用户发送无效邮件 - 安全获取用户信息:用
wp_get_current_user()获取当前登录用户的邮箱和昵称,比直接调用全局变量更安全 - 适配WordPress邮件系统:用
wp_mail()代替原生PHP mail函数,兼容WordPress的邮件配置(比如SMTP设置) - 操作反馈提示:添加了成功、失败、未登录三种状态的提示,用户能清晰知道操作结果
使用注意:
- 确保你的WordPress已正确配置邮件发送功能(比如设置SMTP,避免邮件被标记为垃圾邮件)
- 可以根据需求修改邮件主题、内容,或者按钮的样式类名
- 短代码支持自定义按钮类名,比如
[boutoncode couleur="rouge"]就能给按钮添加rouge类
内容的提问来源于stack exchange,提问作者Timama
相关产品推荐
相关产品推荐

