联系表格 7:仅在提交特定表格时调用功能
Contact Form 7: Call function only on submit of specific form
我正在编写我的第一个插件。它有点像主题的插件,向其中添加有用的东西。
其中之一是,我收集食物数据,这就是为什么我允许用户通过联系表添加不同的食物。表单本身非常标准,我正在使用 save_posted_data 钩子来创建食物 post(作为自定义 post 类型)。
看起来是这样的:
function save_posted_data( $posted_data ) {
$form_id = $contact_form->id();
if( $form_id == 1903 ) {
$args = array(
'post_type' => 'np-food',
'post_status'=>'draft',
'post_title'=>$posted_data['food-name'],
'post_content'=>$posted_data['food-desc'],
);
$post_id = wp_insert_post($args);
if(!is_wp_error($post_id)){
if( isset($posted_data['food-name']) ){
update_post_meta($post_id, 'food-name', $posted_data['food-name']);
}
// and so on
}
}
return $posted_data;
}
add_filter( 'wpcf7_posted_data', 'save_posted_data' );
我的问题是:检查表单的部分应该只在所选表单是用户使用的表单时创建 post。但这在这里不起作用,导致每个其他 CF 7 表单在单击提交时都以无限循环结束。只有表单 1903 会做一些事情(创建一个带有所需元字段的 post)。所有其他的都不起作用。
有人知道我在这里遗漏了什么吗?
您可以在 before_send_mail
上获取提交并检查您的字段名称以退出。
add_action( 'wpcf7_before_send_mail', 'save_posted_data' );
function save_posted_data( $contact_form ) {
$submission = WPCF7_Submission::get_instance();
if ( $submission ) {
$posted_data = $submission->get_posted_data();
}
// This checks for the form tag [food-name]
if (empty($posted_data['food-name']) || !isset($posted_data['food-name'])) return;
// Or use this to check for form by ID (remove previous if)
// if ($posted_data['_wpcf7'] !== '{your_form_id}') return;
$args = array(
'post_type' => 'np-food',
'post_status'=>'draft',
'post_title'=>$posted_data['food-name'],
'post_content'=>$posted_data['food-desc'],
);
$post_id = wp_insert_post($args);
if(!is_wp_error($post_id)){
if( isset($posted_data['food-name']) ){
update_post_meta($post_id, 'food-name', $posted_data['food-name']);
}
// and so on
}
}
您还可以使用包含表单 ID $posted_data['_wpcf7']
的字段 _wpcf7
所以你的 "IF" 会是这样的:
if ($posted_data['_wpcf7'] !== '1903') return;
对于多个表单提交和功能,您可以这样做:
if ($posted_data['_wpcf7'] == '{your_form_id}') {
// do stuff when form id = first
} else if ($posted_data['_wpcf7'] == 'second_form_id') {
// do more stuff
}
我正在编写我的第一个插件。它有点像主题的插件,向其中添加有用的东西。 其中之一是,我收集食物数据,这就是为什么我允许用户通过联系表添加不同的食物。表单本身非常标准,我正在使用 save_posted_data 钩子来创建食物 post(作为自定义 post 类型)。
看起来是这样的:
function save_posted_data( $posted_data ) {
$form_id = $contact_form->id();
if( $form_id == 1903 ) {
$args = array(
'post_type' => 'np-food',
'post_status'=>'draft',
'post_title'=>$posted_data['food-name'],
'post_content'=>$posted_data['food-desc'],
);
$post_id = wp_insert_post($args);
if(!is_wp_error($post_id)){
if( isset($posted_data['food-name']) ){
update_post_meta($post_id, 'food-name', $posted_data['food-name']);
}
// and so on
}
}
return $posted_data;
}
add_filter( 'wpcf7_posted_data', 'save_posted_data' );
我的问题是:检查表单的部分应该只在所选表单是用户使用的表单时创建 post。但这在这里不起作用,导致每个其他 CF 7 表单在单击提交时都以无限循环结束。只有表单 1903 会做一些事情(创建一个带有所需元字段的 post)。所有其他的都不起作用。
有人知道我在这里遗漏了什么吗?
您可以在 before_send_mail
上获取提交并检查您的字段名称以退出。
add_action( 'wpcf7_before_send_mail', 'save_posted_data' );
function save_posted_data( $contact_form ) {
$submission = WPCF7_Submission::get_instance();
if ( $submission ) {
$posted_data = $submission->get_posted_data();
}
// This checks for the form tag [food-name]
if (empty($posted_data['food-name']) || !isset($posted_data['food-name'])) return;
// Or use this to check for form by ID (remove previous if)
// if ($posted_data['_wpcf7'] !== '{your_form_id}') return;
$args = array(
'post_type' => 'np-food',
'post_status'=>'draft',
'post_title'=>$posted_data['food-name'],
'post_content'=>$posted_data['food-desc'],
);
$post_id = wp_insert_post($args);
if(!is_wp_error($post_id)){
if( isset($posted_data['food-name']) ){
update_post_meta($post_id, 'food-name', $posted_data['food-name']);
}
// and so on
}
}
您还可以使用包含表单 ID $posted_data['_wpcf7']
_wpcf7
所以你的 "IF" 会是这样的:
if ($posted_data['_wpcf7'] !== '1903') return;
对于多个表单提交和功能,您可以这样做:
if ($posted_data['_wpcf7'] == '{your_form_id}') {
// do stuff when form id = first
} else if ($posted_data['_wpcf7'] == 'second_form_id') {
// do more stuff
}