联系表格 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
}