简而言之,不要将所有数据与表单一起发送。
您知道表单包含哪些数据,并且电子邮件必须从服务器发送,因此没有理由让这些数据往返于浏览器和服务器。
设置某种类型的唯一标识符,并使用该标识符获取需要发送的任何数据,无论该数据是否附加到当前页面、当前登录用户等。。
这里有一个概念的快速证明。
首先,输出表单的短代码。在这里,我们展示了两种可能的识别表单的方法,一种是与短代码一起提供的ID,另一种是当前页面ID。我们还检查用户是否登录,以及是否显示表单或显示刚刚提交的消息。
function wpd_form_shortcode( $atts ){
$a = shortcode_atts( array(
\'form_id\' => 0,
), $atts );
if( is_user_logged_in() ){
if( isset( $_GET[\'sent\'] ) ){
$form = \'form submitted\';
} else {
$form = \'<form method="post" action="\' . admin_url( \'admin-post.php\' ) . \'">\';
$form .= \'<input type="hidden" name="action" value="wpd_send_form">\';
$form .= \'<input type="hidden" name="form_id" value="\' . $a[\'form_id\'] . \'">\';
$form .= \'<input type="hidden" name="post_id" value="\' . get_the_ID() . \'">\';
$form .= \'<input type="submit" value="Submit">\';
$form .= \'</form>\';
}
} else {
$form = \'You must be logged in\';
}
return $form;
}
add_shortcode( \'wpd_form\', \'wpd_form_shortcode\' );
现在,动作连接到
admin_post
上述表格所指。这里我们展示了如何获取传递的值、获取当前登录的用户以及发送电子邮件。您应该在这里获取这些post-id,无论是来自post-meta、user-meta等,然后迭代每个post-id来构建电子邮件。
function wpd_send_form_function() {
// get the form ID or post ID
// use these to get whatever data you need, get_post_meta, etc.
$form_id = $_POST[\'form_id\'];
$post_id = $_POST[\'post_id\'];
// get the current logged in user info
$current_user = wp_get_current_user();
// put the data in the content of the email and send it
$to = \'you@example.com\';
$subject = \'Email from \' . $current_user->user_login;
$body = \'Email from post_id \' . $post_id;
wp_mail( $to, $subject, $body );
// redirect back to the page that contained the form we just submitted
wp_safe_redirect( $_SERVER[\'HTTP_REFERER\'] . \'?sent=true\', 303 );
exit;
}
add_action( \'admin_post_wpd_send_form\', \'wpd_send_form_function\' );
// uncomment next line if you want to allow users who aren\'t logged in
// add_action( \'admin_post_nopriv_wpd_send_form\', \'wpd_send_form_function\' );
您还应该研究在表单中使用nonce,以及进行一些基本检查,以确保您拥有有效的帖子ID,用户有权访问该帖子的数据,等等。。