Files
wp-go-form/go-form-plugin/go-form-plugin.php
2026-05-06 16:02:46 +02:00

314 lines
11 KiB
PHP

<?php
/**
* Plugin Name: Go Form Plugin
* Description: Form plugin for Go players
* Version: 0.02
* 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,
comment text DEFAULT NULL,
created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (id),
KEY form_id (form_id)
) $charset;");
// Add default form if none exist
$existing_forms = $wpdb->get_var("SELECT COUNT(*) FROM $forms");
if ($existing_forms == 0) {
$wpdb->insert($forms, ['name' => 'Default Form']);
}
}
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 ==========
$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_name($id) {
global $wpdb;
$form = $wpdb->get_row($wpdb->prepare("SELECT name FROM {$wpdb->prefix}go_form_forms WHERE id = %d", $id));
return $form ? $form->name : 'Unknown Form';
}
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)
{
global $ranks;
include "templates/table.php";
}
// ========== 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'] ?? ''),
'comment' => sanitize_textarea_field($_POST['comment'] ?? '')
];
if (empty($data['first_name']) || empty($data['last_name'])) {
wp_redirect($_SERVER['HTTP_REFERER']);
exit;
}
if ($data['rank'] < 0 || $data['rank'] > 47) {
wp_redirect($_SERVER['HTTP_REFERER']);
exit;
}
$wpdb->insert("{$wpdb->prefix}go_form_entries", $data);
wp_redirect($_SERVER['HTTP_REFERER']);
exit;
}
add_action('admin_post_go_form_submit', 'go_form_handle_submission');
// ========== Shortcode ==========
function go_form_shortcode($atts)
{
global $ranks;
$form_id = intval(shortcode_atts(['id' => 1], $atts)['id']);
ob_start();
include '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;
$entry = $wpdb->get_row($wpdb->prepare("SELECT form_id FROM {$wpdb->prefix}go_form_entries WHERE id = %d", intval($_POST['entry_id'])));
$form_id = $entry ? $entry->form_id : 0;
$wpdb->delete("{$wpdb->prefix}go_form_entries", ['id' => intval($_POST['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');
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['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]);
}
$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()
{
go_form_admin_action('export');
if (!isset($_POST['form_id'])) {
wp_redirect(admin_url('admin.php?page=go-form-settings'));
exit;
}
$form_id = intval($_POST['form_id']);
$form_name = go_form_get_form_name($form_id);
$entries = go_form_get_entries($form_id);
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="go-form-' . sanitize_title($form_name) . '-export.csv"');
$output = fopen('php://output', 'w');
fputcsv($output, ['ID', 'First Name', 'Last Name', 'Country', 'Club', 'Rank', 'Email', 'EGD Number', 'Comment', 'Date Added']);
foreach ($entries as $e) {
global $ranks;
fputcsv($output, [
$e->id,
$e->first_name,
$e->last_name,
$e->country,
$e->club,
$ranks[$e->rank] ?? '',
$e->email,
$e->egd_number,
$e->comment,
$e->created_at
]);
}
fclose($output);
exit;
}
add_action('admin_post_go_form_export', 'go_form_export');
// ========== 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.');
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>';
$selected_form_id = isset($_GET['form_id']) ? intval($_GET['form_id']) : 0;
if ($selected_form_id) {
$form_name = go_form_get_form_name($selected_form_id);
echo "<h3> $form_name Entries</h3>";
echo '<div style="margin-bottom:15px">';
echo '<form method="post" action="' . admin_url('admin-post.php') . '" style="display:inline-block;margin-right:10px">
' . 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($selected_form_id) . '">
<input type="submit" value="Delete Form" class="button delete" onclick="return confirm(\'Delete this form and ALL entries?\')">
</form>';
echo '<form method="post" action="' . admin_url('admin-post.php') . '" style="display:inline-block">
' . wp_nonce_field('go_form_export_action', 'go_form_export_nonce', true, false) . '
<input type="hidden" name="action" value="go_form_export">
<input type="hidden" name="form_id" value="' . esc_attr($selected_form_id) . '">
<input type="submit" value="Export to CSV" class="button button-primary">
</form>';
echo '</div>';
$entries = go_form_get_entries($selected_form_id);
go_form_render_entries_table($entries, true);
} else {
$forms = go_form_get_forms();
echo '<h3>Forms</h3><ul>';
foreach ($forms as $f) {
$url = add_query_arg(array('page' => 'go-form-settings', 'form_id' => $f->id), admin_url('admin.php'));
echo '<li><a href="' . esc_url($url) . '">' . esc_html($f->name) . '</a> <span style="color:#888">(ID: ' . esc_html($f->id) . ')</span> - <small>Shortcode: <code>[go_form id=' . esc_html($f->id) . ']</code></small></li>';
}
echo '</ul>';
}
echo '</div>';
}