Wordpress 联系表格7:仅在提交特定表格时调用功能

Wordpress 联系表格7:仅在提交特定表格时调用功能,wordpress,plugins,contact-form-7,Wordpress,Plugins,Contact Form 7,我正在编写我的第一个插件。它有点像一个主题的插件,为它添加有用的东西。 其中之一是,我收集食物的数据,这就是为什么我允许用户通过联系表单添加不同的食物。表单本身是非常标准的,我正在使用save_posted_数据钩子创建food post(作为自定义post类型) 看起来是这样的: function save_posted_data( $posted_data ) { $form_id = $contact_form->id(); if( $form_id == 1903 ) {

我正在编写我的第一个插件。它有点像一个主题的插件,为它添加有用的东西。 其中之一是,我收集食物的数据,这就是为什么我允许用户通过联系表单添加不同的食物。表单本身是非常标准的,我正在使用save_posted_数据钩子创建food 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' );
我的问题是:当检查表单时,应该只在所选表单是用户使用的表单时创建帖子。但这在这里不起作用,因为当单击submit时,其他每一个CF 7表单都会在一个无限循环中结束。只有表单1903起作用(创建带有所需元字段的帖子)。其他的都不行


有人知道我在这里遗漏了什么吗?

在发送邮件之前,你可以在
上抓取提交的内容,并检查你的字段名以退出

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
    }
}
您还可以使用字段
\u wpcf7
,该字段包含表单ID
$posted\u data[''u wpcf7']

所以你的“如果”是这样的:

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
}

首先:非常感谢你的帮助。我尝试了第一个版本,这似乎有效。据我所知。。。在这里,您可以检查特定表单字段是否存在,对吧:if(空($posted_data['food-name']))| |!isset($posted_data['food-name'])return;对于第二个版本,我不知道如何构建它。我刚刚用你的替换了if行,并删除了末尾的括号,但循环仍然有效。如果是表单ID,则应该有效,但如果第一个有效,则再次使用它。谢谢。我只是更喜欢第二个版本,因为它对我来说更容易阅读。现在,两个人都工作了:)非常感谢。我已经找了好几天了还有一个问题:)对不起。是否可以将代码更改为:当使用表格1时,保存post类型MyCPT1,当使用表格2时,保存post类型MyCPT2?。。。如果我理解正确,那么“return”离开函数。这意味着,另一个表单的相同代码将不起作用,因为函数已经在左边了,对吗?我已经更新了一些。。。是
return
退出该功能。