多个页面共享一个contact form 7表单,希望每个页面表单的收件人根据页面信息而定,比如从custom field里读取一个email地址,可以使用下面的方法实现,代码放入主题的functions.php。

创建contact表单

创建表单没什么特殊的地方,平时怎么写现在还怎么写,收件人地址写一个固定的邮箱作为备用地址,当某个页面无法找到一个有效的收件人地址时,则发信到该邮箱。

插入contact表单

插入表单时,为了容易识别,给表单加一个html id,shortcode类似下面这样

[contact-form-7 id="1478" title="Contact form 1" html_id="contact-form-1478"]

用javascript添加收件人地址

用jquery创建一个隐藏字段,存储收件人地址

// 保证加载jquery
function load_jquery(){
    wp_enqueue_script( 'jquery' );
}
add_action( 'wp_enqueue_script', 'load_jquery' );

// 在footer打印待执行脚本,创建隐藏字段
function print_script(){
	?>
	<script type="text/javascript">
	jQuery(document).ready(function($){
		// 这个收件人地址用jquery从html dom某个元素抓取也好
		// 用WordPressd get_post_meta函数获取也没问题,不管怎样搞个地址过来
		var to_email = 'xxxx@gmail.com';

		// 创建隐藏字段
		$('#contact-form-1478').append('<input type="hidden" name="to-email" value="'+to_email+'"> ');
	})
	</script>
	<?php
}
add_action( 'wp_footer', 'print_script');

用php动态更改收件人地址

add_action("wpcf7_before_send_mail", "wpcf7_custom_email_template");
function wpcf7_custom_email_template(&$wpcf7_data) {
    // 只处理id为1478的表单,1478是刚才创建的表单的id
    if ($wpcf7_data->id == 1478) {

    	// “to-email” 是input字段的name
        $to = $wpcf7_data->posted_data['to-email'];

        if( !empty($to) && is_email($to) ){
        	// 如果email地址合法,更改表单的收件人地址
        	$wpcf7_data->mail['recipient'] = $to;
        } else {
        	// 没找到email,或者email不合法,在信息里加上点说明
        	$wpcf7_data->mail['body'] .= "\n No recipient found";
        }
    }
}

这样就可以动态更改收件人地址了。

另外一种方法是,直接在form模版里创建收件人这个字段,to地址用shortcode写,在用js动态更改收件人字段的内容。只是这样没法设置备用地址,如果js被禁用,就什么也发不出去了。

5条留言

  1. 请问如何将选择的结果 传输到thanks页面。比如:感谢“李四”的咨询。。。。你的电话是xxxxx

    1. 假设填写”李四”的字段名称是[your-name],填写电话的是[your-phone]
      那么你可以到表单编辑页面message选项卡下,把Sender’s message was sent successfully的值改为“感谢[your-name]的咨询。。。。你的电话是[your-phone]”

  2. Hi Sola,
    我只想在有使用contact form 7这个插件的页面调用这个插件的js和css,这个怎么做?
    我的网站使用了几个免费插件,激活后会整站都输出了它们的js和css,导致页面内容过多加载有点慢
    期待你的回复
    谢谢!

    1. 我的办法是使用一个叫做“ Plugin Organizer‘的插件,可以设置wp的某些插件只在指定的页面加载或者不加载。

评论功能已关闭