get_charset_collate(); $forms = $wpdb->prefix . 'go_form_forms'; $entries = $wpdb->prefix . 'go_form_entries'; $custom_fields = $wpdb->prefix . 'go_form_custom_fields'; $custom_values = $wpdb->prefix . 'go_form_entry_custom_values'; dbDelta("CREATE TABLE $forms ( id int NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY (id) ) $charset;"); dbDelta("CREATE TABLE $entries ( id int NOT NULL AUTO_INCREMENT, form_id int DEFAULT 1, first_name varchar(100) NOT NULL, last_name varchar(100) NOT NULL, country varchar(100) DEFAULT NULL, club varchar(100) DEFAULT NULL, rank tinyint(2) DEFAULT 0, rating smallint(5) DEFAULT 0, egd_number varchar(20) DEFAULT NULL, created_at date DEFAULT CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY (id), FOREIGN KEY (form_id) REFERENCES $forms(id) ON DELETE CASCADE, INDEX (form_id) ) $charset;"); dbDelta("CREATE TABLE $custom_fields ( id int NOT NULL AUTO_INCREMENT, form_id int NOT NULL, field_name varchar(100) NOT NULL, field_type enum('select','text','checkbox', 'email') NOT NULL DEFAULT 'text', field_options text, is_public tinyint(1) NOT NULL DEFAULT 0, is_required tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (id), FOREIGN KEY (form_id) REFERENCES $forms(id) ON DELETE CASCADE, INDEX (form_id) ) $charset;"); dbDelta("CREATE TABLE $custom_values ( id int NOT NULL AUTO_INCREMENT, entry_id int NOT NULL, field_id int NOT NULL, value text, PRIMARY KEY (id), FOREIGN KEY (entry_id) REFERENCES $entries(id) ON DELETE CASCADE, FOREIGN KEY (field_id) REFERENCES $custom_fields(id) ON DELETE CASCADE, INDEX (entry_id), INDEX (field_id) ) $charset;"); } function go_form_uninstall() { global $wpdb; $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}go_form_entry_custom_values"); $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}go_form_custom_fields"); $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}go_form_entries"); $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}go_form_forms"); } // ========== Helpers ========== $ranks = [ 0 => '30k', 1 => '29k', 2 => '28k', 3 => '27k', 4 => '26k', 5 => '25k', 6 => '24k', 7 => '23k', 8 => '22k', 9 => '21k', 10 => '20k', 11 => '19k', 12 => '18k', 13 => '17k', 14 => '16k', 15 => '15k', 16 => '14k', 17 => '13k', 18 => '12k', 19 => '11k', 20 => '10k', 21 => '9k', 22 => '8k', 23 => '7k', 24 => '6k', 25 => '5k', 26 => '4k', 27 => '3k', 28 => '2k', 29 => '1k', 30 => '1d', 31 => '2d', 32 => '3d', 33 => '4d', 34 => '5d', 35 => '6d', 36 => '7d', 37 => '8d', 38 => '9d', 39 => '1p', 40 => '2p', 41 => '3p', 42 => '4p', 43 => '5p', 44 => '6p', 45 => '7p', 46 => '8p', 47 => '9p' ]; function go_form_get_forms() { global $wpdb; return $wpdb->get_results("SELECT * FROM {$wpdb->prefix}go_form_forms ORDER BY created_at DESC"); } function go_form_get_form_by_id($id) { global $wpdb; return $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}go_form_forms WHERE id = %d", intval($id))); } function go_form_get_entries($form_id) { global $wpdb; return $wpdb->get_results($wpdb->prepare( "SELECT * FROM {$wpdb->prefix}go_form_entries WHERE form_id = %d ORDER BY rank DESC", $form_id )); } function go_form_render_entries_table($entries, $show_admin = false, $custom_fields = [], $form_id = 0) { global $ranks; include "templates/table.php"; } // ========== Custom Fields Helpers ========== function go_form_get_custom_fields($form_id) { global $wpdb; return $wpdb->get_results($wpdb->prepare( "SELECT * FROM {$wpdb->prefix}go_form_custom_fields WHERE form_id = %d ORDER BY id ASC", $form_id )); } function go_form_get_custom_field_by_id($field_id) { global $wpdb; return $wpdb->get_row($wpdb->prepare( "SELECT * FROM {$wpdb->prefix}go_form_custom_fields WHERE id = %d", $field_id )); } function go_form_get_custom_values($entry_id) { global $wpdb; return $wpdb->get_results($wpdb->prepare( "SELECT cf.*, cv.value FROM {$wpdb->prefix}go_form_custom_fields cf JOIN {$wpdb->prefix}go_form_entry_custom_values cv ON cf.id = cv.field_id WHERE cv.entry_id = %d", $entry_id )); } function go_form_get_custom_value($entry_id, $field_id) { global $wpdb; return $wpdb->get_var($wpdb->prepare( "SELECT value FROM {$wpdb->prefix}go_form_entry_custom_values WHERE entry_id = %d AND field_id = %d", $entry_id, $field_id )); } function go_form_get_entry_by_id($entry_id) { global $wpdb; return $wpdb->get_row($wpdb->prepare( "SELECT * FROM {$wpdb->prefix}go_form_entries WHERE id = %d", $entry_id )); } // ========== Form Handling ========== function go_form_handle_submission() { if (!isset($_POST['go_form_nonce']) || !wp_verify_nonce($_POST['go_form_nonce'], 'go_form_action')) wp_die('Security check failed'); global $wpdb; if (isset($_POST['form_id'])) { $form_id = intval($_POST['form_id']); } else { wp_redirect($_SERVER['HTTP_REFERER']); exit; } $rating = intval($_POST['rating']); $rank = intval($_POST['rank']); if ($rating < -900) { $rating = ($rank * 100) - 900; } $data = [ 'form_id' => $form_id, 'first_name' => sanitize_text_field($_POST['first_name']), 'last_name' => sanitize_text_field($_POST['last_name']), 'country' => sanitize_text_field($_POST['country'] ?? ''), 'club' => sanitize_text_field($_POST['club'] ?? ''), 'rank' => $rank, 'rating' => $rating, 'egd_number' => sanitize_text_field($_POST['egd_number'] ?? ''), ]; if (empty($data['first_name']) || empty($data['last_name'])) { wp_redirect($_SERVER['HTTP_REFERER']); exit; } $wpdb->insert("{$wpdb->prefix}go_form_entries", $data); $entry_id = $wpdb->insert_id; // Save custom field values $custom_fields = go_form_get_custom_fields($form_id); foreach ($custom_fields as $field) { $field_name = 'custom_field_' . $field->id; if (isset($_POST[$field_name])) { $value = $_POST[$field_name]; if ($field->field_type === 'checkbox') { $value = isset($_POST[$field_name]) ? '1' : '0'; } elseif (is_array($value)) { $value = implode(',', array_map('sanitize_text_field', $value)); } else { $value = sanitize_text_field($value); } $wpdb->insert("{$wpdb->prefix}go_form_entry_custom_values", [ 'entry_id' => $entry_id, 'field_id' => $field->id, 'value' => $value ]); } elseif ($field->is_required) { // If required field is missing, delete the entry and redirect back $wpdb->delete("{$wpdb->prefix}go_form_entries", ['id' => $entry_id]); wp_redirect($_SERVER['HTTP_REFERER']); exit; } } wp_redirect($_SERVER['HTTP_REFERER']); exit; } add_action('admin_post_go_form_handle_submission', 'go_form_handle_submission'); // ========== Shortcode ========== function go_form_shortcode($atts) { global $ranks; $form_id = intval($atts['id']); $form = go_form_get_form_by_id($form_id); ob_start(); if ($form) { include 'templates/form-shortcode.php'; } else { echo '

WRONG FORM ID

'; } return ob_get_clean(); } add_shortcode('go_form', 'go_form_shortcode'); // ========== Admin Actions ========== function go_form_admin_action($type) { if (!isset($_POST["go_form_{$type}_nonce"]) || !wp_verify_nonce($_POST["go_form_{$type}_nonce"], "go_form_{$type}_action")) wp_die('Security check failed'); if (!current_user_can('manage_options')) wp_die('Insufficient permissions.'); } function go_form_delete_entry() { go_form_admin_action('delete_entry'); if (isset($_POST['value_one'])) { global $wpdb; $entry_id = intval($_POST['value_one']); $entry = $wpdb->get_row($wpdb->prepare("SELECT form_id FROM {$wpdb->prefix}go_form_entries WHERE id = %d", $entry_id)); $form_id = $entry ? $entry->form_id : 0; $wpdb->delete("{$wpdb->prefix}go_form_entries", ['id' => $entry_id]); $redirect_url = add_query_arg(array('page' => 'go-form-settings', 'form_id' => $form_id, 'deleted' => 1), admin_url('admin.php')); wp_redirect($redirect_url); exit; } $redirect_url = add_query_arg(array('page' => 'go-form-settings', 'deleted' => 1), admin_url('admin.php')); wp_redirect($redirect_url); exit; } add_action('admin_post_go_form_delete_entry', 'go_form_delete_entry'); function go_form_create_form() { go_form_admin_action('create_form'); if (isset($_POST['form_name']) && !empty($_POST['form_name'])) { global $wpdb; $wpdb->insert("{$wpdb->prefix}go_form_forms", ['name' => sanitize_text_field($_POST['form_name'])]); $new_form_id = $wpdb->insert_id; $redirect_url = add_query_arg(array('page' => 'go-form-settings', 'form_id' => $new_form_id, 'created' => 1), admin_url('admin.php')); wp_redirect($redirect_url); exit; } $redirect_url = add_query_arg(array('page' => 'go-form-settings'), admin_url('admin.php')); wp_redirect($redirect_url); exit; } add_action('admin_post_go_form_create_form', 'go_form_create_form'); function go_form_delete_form() { go_form_admin_action('delete_form'); if (isset($_POST['value_one'])) { global $wpdb; $id = intval($_POST['value_one']); $wpdb->delete("{$wpdb->prefix}go_form_forms", ['id' => $id]); } $redirect_url = add_query_arg(array('page' => 'go-form-settings', 'deleted' => 1), admin_url('admin.php')); wp_redirect($redirect_url); exit; } add_action('admin_post_go_form_delete_form', 'go_form_delete_form'); function go_form_export_csv() { include_once 'export/csv.php'; exit; } add_action('admin_post_go_form_export_csv', 'go_form_export_csv'); function go_form_export_pairgoth() { include_once 'export/pairgoth.php'; exit; } add_action('admin_post_go_form_export_pairgoth', 'go_form_export_pairgoth'); function go_form_export_opengotha() { global $ranks; include_once 'export/opengotha.php'; exit; } add_action('admin_post_go_form_export_opengotha', 'go_form_export_opengotha'); function go_form_export_mcmahon() { global $ranks; include_once 'export/mcmahon.php'; exit; } add_action('admin_post_go_form_export_mcmahon', 'go_form_export_mcmahon'); // ========== Custom Field Admin Actions ========== function go_form_create_custom_field() { go_form_admin_action('create_custom_field'); if (isset($_POST['form_id']) && isset($_POST['field_name']) && isset($_POST['field_type'])) { global $wpdb; $form_id = intval($_POST['form_id']); $field_name = sanitize_text_field($_POST['field_name']); $field_type = sanitize_text_field($_POST['field_type']); $field_options = isset($_POST['field_options']) ? sanitize_textarea_field($_POST['field_options']) : ''; $is_public = isset($_POST['is_public']) ? 1 : 0; $is_required = isset($_POST['is_required']) ? 1 : 0; $wpdb->insert("{$wpdb->prefix}go_form_custom_fields", [ 'form_id' => $form_id, 'field_name' => $field_name, 'field_type' => $field_type, 'field_options' => $field_options, 'is_public' => $is_public, 'is_required' => $is_required ]); } $redirect_url = add_query_arg(array('page' => 'go-form-settings', 'form_id' => $_POST['form_id'], 'created_field' => 1), admin_url('admin.php')); wp_redirect($redirect_url); exit; } add_action('admin_post_go_form_create_custom_field', 'go_form_create_custom_field'); function go_form_update_custom_field() { go_form_admin_action('update_custom_field'); if (isset($_POST['field_id']) && isset($_POST['field_name']) && isset($_POST['field_type'])) { global $wpdb; $field_id = intval($_POST['field_id']); $field_name = sanitize_text_field($_POST['field_name']); $field_type = sanitize_text_field($_POST['field_type']); $field_options = isset($_POST['field_options']) ? sanitize_textarea_field($_POST['field_options']) : ''; $is_public = isset($_POST['is_public']) ? 1 : 0; $is_required = isset($_POST['is_required']) ? 1 : 0; $wpdb->update("{$wpdb->prefix}go_form_custom_fields", [ 'field_name' => $field_name, 'field_type' => $field_type, 'field_options' => $field_options, 'is_public' => $is_public, 'is_required' => $is_required ], ['id' => $field_id]); } $redirect_url = add_query_arg(array('page' => 'go-form-settings', 'form_id' => $_POST['form_id'], 'updated_field' => 1), admin_url('admin.php')); wp_redirect($redirect_url); exit; } add_action('admin_post_go_form_update_custom_field', 'go_form_update_custom_field'); function go_form_delete_custom_field() { go_form_admin_action('delete_custom_field'); if (isset($_POST['field_id'])) { global $wpdb; $field_id = intval($_POST['field_id']); $field = go_form_get_custom_field_by_id($field_id); $form_id = $field ? $field->form_id : 0; $wpdb->delete("{$wpdb->prefix}go_form_custom_fields", ['id' => $field_id]); $redirect_url = add_query_arg(array('page' => 'go-form-settings', 'form_id' => $form_id, 'deleted_field' => 1), admin_url('admin.php')); wp_redirect($redirect_url); exit; } $redirect_url = add_query_arg(array('page' => 'go-form-settings'), admin_url('admin.php')); wp_redirect($redirect_url); exit; } add_action('admin_post_go_form_delete_custom_field', 'go_form_delete_custom_field'); // ========== Entry Edit Admin Action ========== function go_form_update_entry() { go_form_admin_action('update_entry'); if (!isset($_POST['entry_id']) || !isset($_POST['form_id'])) { wp_redirect(admin_url('admin.php?page=go-form-settings')); exit; } global $wpdb; $entry_id = intval($_POST['entry_id']); $form_id = intval($_POST['form_id']); $rating = intval($_POST['rating']); $rank = intval($_POST['rank']); if ($rating < -900) { $rating = ($rank * 100) - 900; } $data = [ 'first_name' => sanitize_text_field($_POST['first_name']), 'last_name' => sanitize_text_field($_POST['last_name']), 'country' => sanitize_text_field($_POST['country'] ?? ''), 'club' => sanitize_text_field($_POST['club'] ?? ''), 'rank' => $rank, 'rating' => $rating, 'egd_number' => sanitize_text_field($_POST['egd_number'] ?? ''), ]; if (empty($data['first_name']) || empty($data['last_name'])) { $redirect_url = add_query_arg(array('page' => 'go-form-settings', 'form_id' => $form_id, 'edit_entry' => $entry_id, 'error' => 'missing_required'), admin_url('admin.php')); wp_redirect($redirect_url); exit; } $wpdb->update("{$wpdb->prefix}go_form_entries", $data, ['id' => $entry_id]); // Update custom field values $custom_fields = go_form_get_custom_fields($form_id); foreach ($custom_fields as $field) { $field_name = 'custom_field_' . $field->id; if (isset($_POST[$field_name])) { $value = $_POST[$field_name]; if ($field->field_type === 'checkbox') { $value = isset($_POST[$field_name]) ? '1' : '0'; } elseif (is_array($value)) { $value = implode(',', array_map('sanitize_text_field', $value)); } else { $value = sanitize_text_field($value); } // Check if custom value exists $existing = go_form_get_custom_value($entry_id, $field->id); if ($existing !== null) { $wpdb->update("{$wpdb->prefix}go_form_entry_custom_values", ['value' => $value], ['entry_id' => $entry_id, 'field_id' => $field->id]); } else { $wpdb->insert("{$wpdb->prefix}go_form_entry_custom_values", [ 'entry_id' => $entry_id, 'field_id' => $field->id, 'value' => $value ]); } } elseif ($field->is_required) { // If required field is missing, redirect back with error $redirect_url = add_query_arg(array('page' => 'go-form-settings', 'form_id' => $form_id, 'edit_entry' => $entry_id, 'error' => 'missing_required_field'), admin_url('admin.php')); wp_redirect($redirect_url); exit; } } $redirect_url = add_query_arg(array('page' => 'go-form-settings', 'form_id' => $form_id, 'updated_entry' => 1), admin_url('admin.php')); wp_redirect($redirect_url); exit; } add_action('admin_post_go_form_update_entry', 'go_form_update_entry'); // ========== Admin Page ==================== function go_form_admin_menu() { add_menu_page('Go Form Settings', 'Go Form', 'manage_options', 'go-form-settings', 'go_form_settings_page', 'dashicons-admin-generic'); } add_action('admin_menu', 'go_form_admin_menu'); function action_button($action, $name, $confirm_massage, $value_one) { echo '
' . wp_nonce_field("{$action}_action", "{$action}_nonce", true, false) . '
'; } function go_form_settings_page() { include_once 'templates/settings-page.php'; }