首页 > 解决方案 > 如何在数据库中保存多个用户元数据?

问题描述

我正在尝试借助免费插件创建一个注册表单(此处)。注册表中有很多元素。在管理面板中,可以为插件界面中的每个元素分配元键。于是就有了这样的机会。我试图利用这种可能性在同一个元键上收集许多元素。在这个方向上,我为我创建的元素赋予了公共元键值。例如: info_about_register 到目前为止一切都很好。但是,如果表单已发布,我只能获取 usermeta 表中的最后一个条目。所以插件没有序列化相同的元键数据。不会出现数组。

有许多表单元素。我想稍后将这些拉到管理面板。因此,我认为为每个元素定义单独的行会使系统非常疲惫。我就这个问题联系了插件开发人员。但是,大约 1.5 周没有反应。我试图自己解决这个问题,并找到了采取行动的代码。我对这些进行了一些更改。然而,我没有成功。如果你指导我,我会很高兴。

.../includes/class-frontend.php

 /*
     * Called after submission save
     * Registers new user into WordPress.
     * Also map field values to user meta (If configured)
     */
public function after_submission_insertion($errors, $submission, $data) {
    $sub_model = erforms()->submission;
    $form_model = erforms()->form;
    $form = $form_model->get_form($submission['form_id']);
    
    // Copy attachment values in data from submission (as $data does not have any uploaded file values)
    if(!empty($submission['attachments'])){
        foreach($submission['attachments'] as $attachment){
            if(!isset($data[$attachment['f_name']])){
                $data[$attachment['f_name']]= $attachment['f_val'];
            }
        }
    }
 if ($form['type'] == "reg") { // Handling of registration forms
            $user = 0;
            $id = 0;
            // Get mapping for user meta fields if any
            $user_field_map = erforms_filter_user_fields($form['id'], $submission['fields_data']);
            // Avoid user registration process if user already logged in
            if (!is_user_logged_in()) {
                $email_or_username = $user_field_map['user_email'];

                if (isset($user_field_map['password'])) {
                    // Silently creates user  
                    $username = isset($user_field_map['username']) ? $data[$user_field_map['username']] : $data[$email_or_username];
                    do_action('erf_before_user_creation',$submission);
                    $id = wp_create_user($username, $data[$user_field_map['password']], $data[$email_or_username]);
                } else {
                    // Register user and sends random password via email notification
                    do_action('erf_before_user_creation',$submission);
                    $id = register_new_user($data[$email_or_username], $data[$email_or_username]);
                }

                if (is_wp_error($id)) {
                    // In case something goes wrong delete the submission
                    wp_delete_post($submission['id'], true);
                    $error_code = $id->get_error_code();
                    if ($error_code == 'existing_user_login') {
                        $email_or_username = 'username_error';
                    }

                    $errors[] = array($email_or_username, $id->get_error_message($id->get_error_code()));
                    return $errors;
                } else {
                    $selected_role = erforms_get_selected_role($submission['form_id'], $data);
                    if (!empty($selected_role)) { // Means user has selected any role
                        $user_model = erforms()->user;
                        $selected_role= apply_filters('erf_before_setting_user_role',$selected_role,$id,$form, $submission);
                        $user_model->set_user_role($id, $selected_role);
                    }
                    foreach ($user_field_map as $req_key => $meta_key) {
                        $is_primary_key = in_array($meta_key, erforms_primary_field_types());
                        if (isset($data[$req_key]) && !$is_primary_key) {
                            $m_keys= explode(',',$meta_key);
                            foreach($m_keys as $m_key){
                                if(!empty($m_key)){
                                    $status = erforms_update_user_meta($id, $m_key, $data[$req_key]);
                                    do_action('erf_user_meta_updated',$m_key,$id,$data[$req_key],$status);
                                }
                            }
                        }
                    }
                    do_action('erf_user_created', $id, $form['id'], $submission['id']);
                }
            } else {
                // Get user details
                $user = wp_get_current_user();
                $id = $user->ID;
                
                foreach ($user_field_map as $req_key => $meta_key) {
                    $is_primary_key = in_array($meta_key, erforms_primary_field_types());
                    if (isset($data[$req_key]) && !$is_primary_key) {
                        $m_keys= explode(',',$meta_key);
                        foreach($m_keys as $m_key){
                            if(!empty($m_key)){
                                $status= erforms_update_user_meta($id,$m_key,$data[$req_key]);
                                do_action('erf_user_meta_updated',$m_key,$id,$data[$req_key],$status);
                            }
                        }
                    }
                }

//...

     // User meta,URL params or default values should be prefilled only when we are not loading submission data
        if(empty($submission)){
            $user_meta = erforms()->user->frontend_localize_user_meta($form);
            $filtered_url_params = array();
            foreach ($_GET as $key => $val) {
                $filtered_url_params[urldecode(strtolower(wp_unslash($key)))] = sanitize_text_field(wp_unslash($val));
            }

            $url_keys = array_keys($filtered_url_params);
            foreach ($form['fields'] as $field) {
                $label = !empty($field['label']) ? strtolower(str_replace(' ', '_', $field['label'])) : '';
                $label = str_replace('&', 'and', $label); // Cause URL params do not allow & 
                if (!empty($field['name']) && !empty($label) && in_array($label, $url_keys)) {
                    if (!isset($user_meta[$field['name']]) && !empty($filtered_url_params[$label])) {
                        $user_meta[$field['name']] = stristr($filtered_url_params[$label], '|') ? explode('|', $filtered_url_params[$label]) : $filtered_url_params[$label];
                    }
                }
                if(!empty($field['name']) && empty($user_meta[$field['name']]) && !empty($field['value'])){
                    $user_meta[$field['name']] = $field['value'];
                }
                
            }

            if (!empty($user_meta)) {
                $data['user_meta'] = $user_meta;
            }
        }
        $data= apply_filters('erf_form_localize_data',$data,$form);
        return $data;
    }

.../includes/functions.php

/**
 * Wrapper to call update_user_meta function. 
 * This simply calls wordpress meta function and does not add any special prefix. 
 * Checks for any special meta key to update user table data. 
 * For example: display_name : updates user's display name. Instead of adding display_name usermeta
 */
function erforms_update_user_meta($user_id, $m_key, $m_val) {
    switch ($m_key) {
        case 'display_name' : $status = wp_update_user(array('ID' => $user_id, $m_key => $m_val));
            return is_wp_error($status) ? false : true;
    }
    return update_user_meta($user_id, $m_key, $m_val);
}

标签: wordpressformsplugins

解决方案


更新:

数据可以存储为具有如下定义的数组。此外,键值 ($all_meta_value[$req_key]) 等于插件自动分配给 HTML 元素的 id、名称值。使用它,可以编写不同的条件状态。

以下代码必须在子主题的function.php文件中定义:

add_action('erf_user_meta_updated','for_new_user_meta_uptated',10);
    function for_new_user_meta_uptated($data){
    //if the defined meta key (info_about_register) matches 
    if($m_key == 'info_about_register'){
        $all_meta_value[$req_key] = $data;
        }
    }
add_action('erf_user_created', 'for_new_user_created',10);
function for_new_user_created($id){
    //Save the values as a new user meta
    add_user_meta($id, 'new_info_about_register', $get_meta_value);
    
    //Remove saved single element user meta. 
    delete_user_meta($id, 'info_about_register');
}

推荐阅读