261 lines
10 KiB
PHP
261 lines
10 KiB
PHP
<?php
|
|
/**
|
|
* Plugin Name: Go Form Plugin
|
|
* Description: Form plugin for Go players
|
|
* Version: 0.01
|
|
* Author: Nikola Petrov
|
|
*/
|
|
|
|
if (!defined('ABSPATH')) exit;
|
|
|
|
// ========== Database ==========
|
|
function go_form_activate() {
|
|
global $wpdb;
|
|
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
|
$charset = $wpdb->get_charset_collate();
|
|
$forms = $wpdb->prefix . 'go_form_forms';
|
|
$entries = $wpdb->prefix . 'go_form_entries';
|
|
|
|
dbDelta("CREATE TABLE $forms (
|
|
id mediumint(9) 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 mediumint(9) NOT NULL AUTO_INCREMENT,
|
|
form_id mediumint(9) 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,
|
|
email varchar(255) DEFAULT NULL,
|
|
egd_number varchar(50) DEFAULT NULL,
|
|
created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
|
PRIMARY KEY (id),
|
|
KEY form_id (form_id)
|
|
) $charset;");
|
|
}
|
|
register_activation_hook(__FILE__, 'go_form_activate');
|
|
|
|
function go_form_uninstall() {
|
|
global $wpdb;
|
|
$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}go_form_entries");
|
|
$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}go_form_forms");
|
|
}
|
|
register_uninstall_hook(__FILE__, 'go_form_uninstall');
|
|
|
|
// ========== Helpers ==========
|
|
function go_form_get_rank_dropdown($selected = 0) {
|
|
$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'
|
|
];
|
|
|
|
$html = '<select name="rank" id="rank">\n';
|
|
foreach ($ranks as $value => $label) {
|
|
$selected_attr = selected($value, $selected, false);
|
|
$html .= " <option value='{$value}'{$selected_attr}>{$label}</option>\n";
|
|
}
|
|
$html .= "</select>";
|
|
echo $html;
|
|
}
|
|
|
|
function go_form_get_forms() {
|
|
global $wpdb;
|
|
return $wpdb->get_results("SELECT * FROM {$wpdb->prefix}go_form_forms ORDER BY name ASC");
|
|
}
|
|
|
|
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 created_at DESC",
|
|
$form_id
|
|
));
|
|
}
|
|
|
|
function go_form_render_entries_table($entries, $show_delete = false) {
|
|
if (empty($entries)) {
|
|
echo '<p>No entries yet.</p>';
|
|
return;
|
|
}
|
|
|
|
$headers = ['ID', 'First Name', 'Last Name', 'Country', 'Club', 'Rank', 'Email', 'EGD Number', 'Date Added'];
|
|
if ($show_delete) $headers[] = 'Action';
|
|
|
|
echo '<table class="'.($show_delete ? 'wp-list-table widefat fixed striped' : 'go-entries-table').'">
|
|
<thead><tr><th>'.implode('</th><th>', $headers).'</th></tr></thead><tbody>';
|
|
|
|
foreach ($entries as $e) {
|
|
echo '<tr><td>'.esc_html($e->id).'</td><td>'.esc_html($e->first_name).'</td><td>'.esc_html($e->last_name).'</td>
|
|
<td>'.esc_html($e->country).'</td><td>'.esc_html($e->club).'</td><td>'.esc_html($e->rank).'</td>
|
|
<td>'.esc_html($e->email).'</td><td>'.esc_html($e->egd_number).'</td><td>'.esc_html($e->created_at).'</td>';
|
|
|
|
if ($show_delete) {
|
|
echo '<td><form method="post" action="'.admin_url('admin-post.php').'">
|
|
'.wp_nonce_field('go_form_delete_action', 'go_form_delete_nonce', true, false).'
|
|
<input type="hidden" name="action" value="go_form_delete_entry">
|
|
<input type="hidden" name="entry_id" value="'.esc_attr($e->id).'">
|
|
<input type="submit" value="Delete" class="button delete" onclick="return confirm(\'Delete this entry?\')">
|
|
</form></td>';
|
|
}
|
|
echo '</tr>';
|
|
}
|
|
echo '</tbody></table>';
|
|
}
|
|
|
|
// ========== 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;
|
|
$data = [
|
|
'form_id' => isset($_POST['form_id']) ? intval($_POST['form_id']) : 1,
|
|
'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' => intval($_POST['rank']),
|
|
'email' => sanitize_email($_POST['email'] ?? ''),
|
|
'egd_number' => sanitize_text_field($_POST['egd_number'] ?? '')
|
|
];
|
|
|
|
if (empty($data['first_name']) || empty($data['last_name'])) {
|
|
wp_redirect($_SERVER['HTTP_REFERER'] . '?form_error=1#form'); exit;
|
|
}
|
|
if ($data['rank'] < 0 || $data['rank'] > 47) {
|
|
wp_redirect($_SERVER['HTTP_REFERER'] . '?form_error=rank#form'); exit;
|
|
}
|
|
if (!empty($data['email']) && !is_email($data['email'])) {
|
|
wp_redirect($_SERVER['HTTP_REFERER'] . '?form_error=email#form'); exit;
|
|
}
|
|
|
|
$wpdb->insert("{$wpdb->prefix}go_form_entries", $data);
|
|
wp_redirect($_SERVER['HTTP_REFERER'] . '?form_success=1#form');
|
|
exit;
|
|
}
|
|
add_action('admin_post_go_form_submit', 'go_form_handle_submission');
|
|
add_action('admin_post_nopriv_go_form_submit', 'go_form_handle_submission');
|
|
|
|
// ========== Shortcode ==========
|
|
function go_form_shortcode($atts) {
|
|
$form_id = intval(shortcode_atts(['id' => 1], $atts)['id']);
|
|
|
|
$msg = '';
|
|
if (isset($_GET['form_success']) && $_GET['form_success'] == 1)
|
|
$msg = '<div class="go-form-success">Entry added successfully!</div>';
|
|
elseif (isset($_GET['form_error'])) {
|
|
$errors = ['1' => 'Please fill in all required fields.', 'rank' => 'Rank must be 0-40.', 'email' => 'Please enter a valid email.'];
|
|
$msg = '<div class="go-form-error">'.esc_html($errors[$_GET['form_error']] ?? $errors['1']).'</div>';
|
|
}
|
|
|
|
ob_start();
|
|
echo $msg;
|
|
include plugin_dir_path(__FILE__) . 'templates/form-shortcode.php';
|
|
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');
|
|
if (isset($_POST['entry_id'])) {
|
|
global $wpdb;
|
|
$wpdb->delete("{$wpdb->prefix}go_form_entries", ['id' => intval($_POST['entry_id'])]);
|
|
}
|
|
wp_redirect(admin_url('admin.php?page=go-form-settings&deleted=1'));
|
|
exit;
|
|
}
|
|
add_action('admin_post_go_form_delete_entry', 'go_form_delete_entry');
|
|
|
|
function go_form_create_form() {
|
|
go_form_admin_action('create');
|
|
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'])]);
|
|
}
|
|
wp_redirect(admin_url('admin.php?page=go-form-settings&created=1'));
|
|
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['form_id'])) {
|
|
global $wpdb;
|
|
$id = intval($_POST['form_id']);
|
|
$wpdb->delete("{$wpdb->prefix}go_form_entries", ['form_id' => $id]);
|
|
$wpdb->delete("{$wpdb->prefix}go_form_forms", ['id' => $id]);
|
|
}
|
|
wp_redirect(admin_url('admin.php?page=go-form-settings&deleted=1'));
|
|
exit;
|
|
}
|
|
add_action('admin_post_go_form_delete_form', 'go_form_delete_form');
|
|
|
|
// ========== 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 go_form_settings_page() {
|
|
if (!current_user_can('manage_options')) wp_die('No access.');
|
|
|
|
$forms = go_form_get_forms();
|
|
$entries_by_form = [];
|
|
foreach ($forms as $f) $entries_by_form[$f->id] = go_form_get_entries($f->id);
|
|
|
|
if (isset($_GET['deleted'])) echo '<div class="notice notice-success"><p>Deleted!</p></div>';
|
|
if (isset($_GET['created'])) echo '<div class="notice notice-success"><p>Form created!</p></div>';
|
|
|
|
echo '<div class="wrap"><h1>Go Form Settings</h1>
|
|
|
|
<h2>Create New Form</h2>
|
|
<form method="post" action="'.admin_url('admin-post.php').'">
|
|
'.wp_nonce_field('go_form_create_action', 'go_form_create_nonce', true, false).'
|
|
<input type="hidden" name="action" value="go_form_create_form">
|
|
<table class="form-table">
|
|
<tr><th><label for="form_name">Form Name:</label></th><td><input type="text" name="form_name" id="form_name" required></td></tr>
|
|
</table>
|
|
<p class="submit"><input type="submit" class="button button-primary" value="Create Form"></p>
|
|
</form>
|
|
|
|
<h2>Manage Forms & Entries</h2>';
|
|
if (empty($forms)) { echo '<p>No forms yet.</p>'; return; }
|
|
|
|
foreach ($forms as $f) {
|
|
$entries = $entries_by_form[$f->id] ?? [];
|
|
echo '<div style="margin-bottom:20px">
|
|
<h3>'.esc_html($f->name).' <span style="color:#888">(ID: '.esc_html($f->id).')</span></h3>
|
|
<p><small>Shortcode: <code>[go_form id='.esc_html($f->id).']</code></small></p>
|
|
|
|
<form method="post" action="'.admin_url('admin-post.php').'" style="margin-bottom:15px">
|
|
'.wp_nonce_field('go_form_delete_form_action', 'go_form_delete_form_nonce', true, false).'
|
|
<input type="hidden" name="action" value="go_form_delete_form">
|
|
<input type="hidden" name="form_id" value="'.esc_attr($f->id).'">
|
|
<input type="submit" value="Delete Form" class="button delete" onclick="return confirm(\'Delete this form and ALL entries?\')">
|
|
</form>';
|
|
|
|
go_form_render_entries_table($entries, true);
|
|
echo '</div>';
|
|
}
|
|
echo '</div>';
|
|
}
|