【问题标题】:Contact Form 7: Call function only on submit of specific form联系表格 7:仅在提交特定表格时调用功能
【发布时间】:2020-02-21 19:02:41
【问题描述】:

我正在编写我的第一个插件。它就像一个主题的插件,为它添加有用的东西。 其中之一是,我收集食物数据,这就是为什么我允许用户通过联系表格添加不同的食物。表单本身非常标准,我正在使用 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 做一些事情(创建一个带有所需元字段的帖子)。所有其他都不起作用。

有人知道我在这里缺少什么吗?

【问题讨论】:

    标签: wordpress plugins contact-form-7


    【解决方案1】:

    您可以在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 ($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 (empty($posted_data['food-name']) || !isset($posted_data['food-name']) ) 返回;对于第二个版本,我不确定如何构建它。我只是用你的替换了 if 行并删除了最后的括号,但循环仍然存在。
    • 如果那是表单 ID 应该可以工作,但如果第一个可以工作,那么就使用它
    • 再次感谢。我只是更喜欢第二个版本,因为它对我来说更容易阅读。现在,两者都有效:) 非常感谢。我找了几天这样的答案
    • 还有一个问题 :) 抱歉。是否可以将代码更改为:使用 FORM 1 时,保存帖子类型 MyCPT1,使用 FORM 2 时,保存帖子类型 MyCPT2?...如果我理解正确,则“返回”会离开该功能。这意味着,另一个表单的相同代码将不起作用,原因函数已经离开了,对吧?
    • 我已经更新了一些...是的 return 退出了函数。
    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多