我正在编写我的第一个插件。它就像是主题的插件,可以为主题添加有用的东西。其中之一是,我收集食物数据,这就是为什么我允许用户通过联系表添加不同食物的原因。表单本身是非常标准的,我正在使用save_posted_data钩子创建食物帖子(作为自定义帖子类型)。
看起来像:
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' );
我的问题是:检查表单时,该部分仅应在所选表单是用户使用的表单时创建一个帖子。但这在这里不起作用,因为单击提交时,所有其他CF 7表单都会陷入无限循环。仅表单1903做某事(创建带有所需元字段的帖子)。其他所有都不起作用。
有人知道我在这里想念的吗?
您可以在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 _wpcf7
的字段$posted_data['_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
}