/*
Plugin Name: OPO Ortspokal
Description: Verwaltung von Schützen, Mannschaften und Ergebnissen für den Ortspokal.
Version: 1.0
Author: Felix
*/
/*
// Admin-Menü hinzufügen
add_action('admin_menu', function() {
add_menu_page(
'Ortspokal', // Titel der Seite
'Ortspokal', // Menüname
'manage_options', // Berechtigung
'opo-ortspokal', // Slug
'opo_ortspokal_dashboard', // Callback-Funktion
'dashicons-awards', // Icon
3 // Position
);
});
// Inhalt der Hauptseite
function opo_ortspokal_dashboard() {
echo '
Ergebnisse
';
// ---------------------------------------------------
// ERGEBNIS LÖSCHEN
// ---------------------------------------------------
if (isset($_GET['delete'])) {
$id = intval($_GET['delete']);
$wpdb->delete($table_e, ['id' => $id]);
echo '
';
}
// ---------------------------------------------------
// EINZEL-ERGEBNIS SPEICHERN
// ---------------------------------------------------
if (isset($_POST['opo_new_result_single'])) {
$schuetze_id = intval($_POST['schuetze_id']);
$disziplin_id = intval($_POST['disziplin_id']);
$jahr = intval($_POST['jahr']);
$ergebnis = floatval(str_replace(',', '.', $_POST['ergebnis']));
$wpdb->insert($table_e, [
'schuetze_id' => $schuetze_id,
'mannschaft_id' => null,
'disziplin_id' => $disziplin_id,
'ergebnis' => $ergebnis,
'jahr' => $jahr
]);
echo '
Einzel-Ergebnis gespeichert.
';
}
// ---------------------------------------------------
// MANNSCHAFTS-ERGEBNIS SPEICHERN
// ---------------------------------------------------
if (isset($_POST['opo_new_result_team'])) {
$mannschaft_id = intval($_POST['mannschaft_id']);
$ergebnis1 = floatval(str_replace(',', '.', $_POST['ergebnis1']));
$ergebnis2 = floatval(str_replace(',', '.', $_POST['ergebnis2']));
$ergebnis3 = floatval(str_replace(',', '.', $_POST['ergebnis3']));
// Mannschaft laden
$team = $wpdb->get_row("SELECT * FROM $table_m WHERE id = $mannschaft_id");
$jahr = $team->jahr;
$disziplin_id = $team->disziplin_id;
// Schützen der Mannschaft laden
$schuetzen = $wpdb->get_results("
SELECT schuetze_id
FROM {$wpdb->prefix}opo_mannschafts_schuetzen
WHERE mannschaft_id = $mannschaft_id
ORDER BY position ASC
");
// Falls du die Schützen direkt in der Mannschaftstabelle gespeichert hast:
// $schuetzen = [$team->s1, $team->s2, $team->s3];
$ergebnisse = [$ergebnis1, $ergebnis2, $ergebnis3];
$i = 0;
foreach ($schuetzen as $s) {
$wpdb->insert($table_e, [
'schuetze_id' => $s->schuetze_id,
'mannschaft_id' => $mannschaft_id,
'disziplin_id' => $disziplin_id,
'ergebnis' => $ergebnisse[$i],
'jahr' => $jahr
]);
$i++;
}
echo '
Mannschafts-Ergebnisse gespeichert.
';
}
// ---------------------------------------------------
// FORMULAR: EINZEL-ERGEBNIS
// ---------------------------------------------------
$schuetzen = $wpdb->get_results("SELECT * FROM $table_s ORDER BY nachname ASC");
$disziplinen_einzel = $wpdb->get_results("SELECT * FROM $table_d WHERE id IN (11,14,15)");
echo '
Einzel-Ergebnis erfassen
';
echo '
';
// ---------------------------------------------------
// MANNSCHAFTS-ERGEBNIS SPEICHERN + AUTOMATISCHE EINZELWERTUNG
// ---------------------------------------------------
if (isset($_POST['opo_new_result_team'])) {
$mannschaft_id = intval($_POST['mannschaft_id']);
$ergebnis1 = floatval(str_replace(',', '.', $_POST['ergebnis1']));
$ergebnis2 = floatval(str_replace(',', '.', $_POST['ergebnis2']));
$ergebnis3 = floatval(str_replace(',', '.', $_POST['ergebnis3']));
// Mannschaft laden
$team = $wpdb->get_row("SELECT * FROM $table_m WHERE id = $mannschaft_id");
$jahr = $team->jahr;
$disziplin_id = $team->disziplin_id;
// Schützen der Mannschaft laden
$team_schuetzen = $wpdb->get_results("
SELECT schuetze_id
FROM {$wpdb->prefix}opo_mannschafts_schuetzen
WHERE mannschaft_id = $mannschaft_id
ORDER BY position ASC
");
$ergebnisse = [$ergebnis1, $ergebnis2, $ergebnis3];
// 1) Mannschaftsergebnisse speichern
$i = 0;
foreach ($team_schuetzen as $s) {
// Mannschaftsergebnis
$wpdb->insert($table_e, [
'schuetze_id' => $s->schuetze_id,
'mannschaft_id' => $mannschaft_id,
'disziplin_id' => $disziplin_id,
'ergebnis' => $ergebnisse[$i],
'jahr' => $jahr
]);
// 2) AUTOMATISCHE EINZELWERTUNG
$wpdb->insert($table_e, [
'schuetze_id' => $s->schuetze_id,
'mannschaft_id' => null, // wichtig!
'disziplin_id' => ($disziplin_id == 110 ? 11 : 14), // LG Mannschaft → LG Einzel, KK Mannschaft → KK Einzel
'ergebnis' => $ergebnisse[$i],
'jahr' => $jahr
]);
$i++;
}
echo '
Mannschafts- und Einzel-Ergebnisse gespeichert.
';
}
}
function opo_auswertung_page() {
global $wpdb;
$table_e = $wpdb->prefix . 'opo_ergebnisse';
$table_s = $wpdb->prefix . 'opo_schuetzen';
$table_m = $wpdb->prefix . 'opo_mannschaften';
$table_d = $wpdb->prefix . 'opo_disziplinen';
echo '
Auswertung
';
// ---------------------------------------------------
// Jahr auswählen
// ---------------------------------------------------
$jahre = $wpdb->get_col("SELECT DISTINCT jahr FROM $table_e ORDER BY jahr DESC");
$jahr = $_GET['jahr'] ?? ($jahre[0] ?? date('Y'));
echo '
';
// ---------------------------------------------------
// EINZELWERTUNG
// ---------------------------------------------------
echo '
Einzelwertung
';
$einzel = $wpdb->get_results("
SELECT e.*, s.nachname, s.vorname, s.klasse, d.name_kurz
FROM $table_e e
LEFT JOIN $table_s s ON e.schuetze_id = s.id
LEFT JOIN $table_d d ON e.disziplin_id = d.id
WHERE e.jahr = $jahr
AND e.mannschaft_id IS NULL
ORDER BY d.id ASC, e.ergebnis DESC
");
echo '
';
echo '
| Schütze |
Klasse |
Disziplin |
Ergebnis |
';
foreach ($einzel as $e) {
echo '';
echo '| '.$e->nachname.', '.$e->vorname.' | ';
echo ''.$e->klasse.' | ';
echo ''.$e->name_kurz.' | ';
echo ''.$e->ergebnis.' | ';
echo '
';
}
echo '
';
// ---------------------------------------------------
// MANNSCHAFTSWERTUNG
// ---------------------------------------------------
echo '
Mannschaftswertung
';
$mannschaften = $wpdb->get_results("
SELECT m.*, d.name_kurz
FROM $table_m m
LEFT JOIN $table_d d ON m.disziplin_id = d.id
WHERE m.jahr = $jahr
ORDER BY m.disziplin_id ASC, m.name ASC
");
echo '
';
echo '
| Mannschaft |
Disziplin |
Summe |
Schütze 1 |
Schütze 2 |
Schütze 3 |
';
foreach ($mannschaften as $m) {
// Ergebnisse der Mannschaft laden
$erg = $wpdb->get_results("
SELECT e.*, s.nachname, s.vorname
FROM $table_e e
LEFT JOIN $table_s s ON e.schuetze_id = s.id
WHERE e.mannschaft_id = $m->id
ORDER BY e.ergebnis DESC
");
// Summe berechnen
$summe = 0;
foreach ($erg as $e) {
$summe += $e->ergebnis;
}
echo '';
echo '| '.$m->name.' | ';
echo ''.$m->name_kurz.' | ';
echo ''.$summe.' | ';
// Schützen anzeigen
for ($i = 0; $i < 3; $i++) {
if (isset($erg[$i])) {
echo ''.$erg[$i]->nachname.', '.$erg[$i]->vorname.' ('.$erg[$i]->ergebnis.') | ';
} else {
echo '- | ';
}
}
echo '
';
}
echo '
';
echo '
';
}
// ---------------------------------------------------
// SHORTCODE: EINZELWERTUNG
// ---------------------------------------------------
function opo_shortcode_einzel($atts) {
global $wpdb;
$table_e = $wpdb->prefix . 'opo_ergebnisse';
$table_s = $wpdb->prefix . 'opo_schuetzen';
$table_d = $wpdb->prefix . 'opo_disziplinen';
// Jahr bestimmen
$jahr = isset($atts['jahr']) ? intval($atts['jahr']) : date('Y');
// Einzel-Ergebnisse laden
$einzel = $wpdb->get_results("
SELECT e.*, s.nachname, s.vorname, s.klasse, d.name_kurz
FROM $table_e e
LEFT JOIN $table_s s ON e.schuetze_id = s.id
LEFT JOIN $table_d d ON e.disziplin_id = d.id
WHERE e.jahr = $jahr
AND e.mannschaft_id IS NULL
ORDER BY d.id ASC, e.ergebnis DESC
");
// HTML-Ausgabe
$html = "
Einzelwertung $jahr
";
$html .= "
| Schütze |
Klasse |
Disziplin |
Ergebnis |
";
foreach ($einzel as $e) {
$html .= "
| {$e->nachname}, {$e->vorname} |
{$e->klasse} |
{$e->name_kurz} |
{$e->ergebnis} |
";
}
$html .= "
";
return $html;
}
add_shortcode('opo_einzel', 'opo_shortcode_einzel');
// ---------------------------------------------------
// SHORTCODE: MANNSCHAFTSWERTUNG
// ---------------------------------------------------
function opo_shortcode_mannschaft($atts) {
global $wpdb;
$table_e = $wpdb->prefix . 'opo_ergebnisse';
$table_m = $wpdb->prefix . 'opo_mannschaften';
$table_s = $wpdb->prefix . 'opo_schuetzen';
$table_d = $wpdb->prefix . 'opo_disziplinen';
// Jahr bestimmen
$jahr = isset($atts['jahr']) ? intval($atts['jahr']) : date('Y');
// Mannschaften laden
$mannschaften = $wpdb->get_results("
SELECT m.*, d.name_kurz
FROM $table_m m
LEFT JOIN $table_d d ON m.disziplin_id = d.id
WHERE m.jahr = $jahr
ORDER BY m.disziplin_id ASC, m.name ASC
");
// HTML-Ausgabe
$html = "
Mannschaftswertung $jahr
";
$html .= "
| Mannschaft |
Disziplin |
Summe |
Schütze 1 |
Schütze 2 |
Schütze 3 |
";
foreach ($mannschaften as $m) {
// Ergebnisse der Mannschaft laden
$erg = $wpdb->get_results("
SELECT e.*, s.nachname, s.vorname
FROM $table_e e
LEFT JOIN $table_s s ON e.schuetze_id = s.id
WHERE e.mannschaft_id = $m->id
ORDER BY e.ergebnis DESC
");
// Summe berechnen
$summe = 0;
foreach ($erg as $e) {
$summe += $e->ergebnis;
}
// Tabellenzeile
$html .= "
| {$m->name} |
{$m->name_kurz} |
$summe | ";
// Schützen
for ($i = 0; $i < 3; $i++) {
if (isset($erg[$i])) {
$html .= "{$erg[$i]->nachname}, {$erg[$i]->vorname} ({$erg[$i]->ergebnis}) | ";
} else {
$html .= "- | ";
}
}
$html .= "
";
}
$html .= "
";
return $html;
}
add_shortcode('opo_mannschaft', 'opo_shortcode_mannschaft');
// ---------------------------------------------------
// CSS für Tabellen (Frontend)
// ---------------------------------------------------
function opo_public_css() {
echo "
";
}
add_action('wp_head', 'opo_public_css');
// ---------------------------------------------------
// SHORTCODE: KOMPLETTE ÖFFENTLICHE ERGEBNISANZEIGE
// ---------------------------------------------------
function opo_shortcode_public() {
global $wpdb;
$table_e = $wpdb->prefix . 'opo_ergebnisse';
$table_s = $wpdb->prefix . 'opo_schuetzen';
$table_m = $wpdb->prefix . 'opo_mannschaften';
$table_d = $wpdb->prefix . 'opo_disziplinen';
// Jahr bestimmen
$jahr = isset($_GET['jahr']) ? intval($_GET['jahr']) : date('Y');
// Disziplin bestimmen
$d = $_GET['d'] ?? 'einzel_herren_lg';
// Navigation links
$nav = [
'einzel_herren_lg' => 'Einzel Herren LG',
'einzel_damen_lg' => 'Einzel Damen LG',
'einzel_jugend_lg' => 'Einzel Jugend LG',
'mann_herren_lg' => 'Mannschaften Herren LG',
'mann_damen_lg' => 'Mannschaften Damen LG',
'mann_jugend_lg' => 'Mannschaften Jugend LG',
'mann_kk' => 'Mannschaften KK 50m',
'einzel_damen_kk' => 'Einzel Damen KK 50m',
'einzel_herren_kk' => 'Einzel Herren KK 50m',
'einzel_lg_frei' => 'Einzel LG Frei'
];
// HTML Start
$html = "
";
// -------------------------
// Navigation links
// -------------------------
$html .= "
";
foreach ($nav as $key => $label) {
$active = ($key == $d) ? "class='active'" : "";
$html .= "- $label
";
}
$html .= "
";
// -------------------------
// Jahr Dropdown
// -------------------------
$jahre = $wpdb->get_col("SELECT DISTINCT jahr FROM $table_e ORDER BY jahr DESC");
$html .= "
";
$html .= "
";
$html .= "
";
// -------------------------
// Tabelle laden
// -------------------------
$html .= opo_public_render_table($d, $jahr);
$html .= "
";
return $html;
}
add_shortcode('opo_public', 'opo_shortcode_public');
// ---------------------------------------------------
// RENDER-FUNKTION FÜR TABELLEN
// ---------------------------------------------------
function opo_public_render_table($d, $jahr) {
global $wpdb;
$table_e = $wpdb->prefix . 'opo_ergebnisse';
$table_s = $wpdb->prefix . 'opo_schuetzen';
$table_m = $wpdb->prefix . 'opo_mannschaften';
$html = "";
// Hilfsfunktion für Einzel
$render_einzel = function($title, $disziplin_id, $klasse) use ($wpdb, $table_e, $table_s, $jahr) {
$erg = $wpdb->get_results("
SELECT e.*, s.nachname, s.vorname
FROM $table_e e
LEFT JOIN $table_s s ON e.schuetze_id = s.id
WHERE e.jahr = $jahr
AND e.mannschaft_id IS NULL
AND e.disziplin_id = $disziplin_id
AND s.klasse = '$klasse'
ORDER BY e.ergebnis DESC
");
$html = "
$title $jahr
";
$html .= "
| Platz | Name | Ergebnis |
";
$platz = 1;
foreach ($erg as $e) {
$html .= "
| $platz |
{$e->nachname}, {$e->vorname} |
{$e->ergebnis} |
";
$platz++;
}
$html .= "
";
return $html;
};
// Hilfsfunktion für Mannschaft
$render_mannschaft = function($title, $disziplin_id, $klasse_filter) use ($wpdb, $table_e, $table_m, $table_s, $jahr) {
// Filter für LG (H/D/J)
$klasse_sql = "";
if ($klasse_filter !== null) {
$klasse_sql = "AND klasse = '$klasse_filter'";
}
// Mannschaften laden
$mannschaften = $wpdb->get_results("
SELECT * FROM $table_m
WHERE jahr = $jahr
AND disziplin_id = $disziplin_id
$klasse_sql
ORDER BY name ASC
");
$html = "
$title $jahr
";
$html .= "
| Platz |
Mannschaft |
Summe |
Schütze 1 |
Schütze 2 |
Schütze 3 |
";
// Mannschaften + Summe berechnen
$rows = [];
foreach ($mannschaften as $m) {
$erg = $wpdb->get_results("
SELECT e.*, s.nachname, s.vorname
FROM $table_e e
LEFT JOIN $table_s s ON e.schuetze_id = s.id
WHERE e.mannschaft_id = $m->id
ORDER BY e.ergebnis DESC
");
$summe = 0;
foreach ($erg as $e) {
$summe += $e->ergebnis;
}
$rows[] = [
'name' => $m->name,
'summe' => $summe,
'erg' => $erg
];
}
// Sortieren nach Summe
usort($rows, fn($a, $b) => $b['summe'] <=> $a['summe']);
// Ausgabe
$platz = 1;
foreach ($rows as $r) {
$html .= "
| $platz |
{$r['name']} |
{$r['summe']} | ";
for ($i = 0; $i < 3; $i++) {
if (isset($r['erg'][$i])) {
$html .= "{$r['erg'][$i]->nachname}, {$r['erg'][$i]->vorname} ({$r['erg'][$i]->ergebnis}) | ";
} else {
$html .= "- | ";
}
}
$html .= "
";
$platz++;
}
$html .= "
";
return $html;
};
// ---------------------------------------------------
// Disziplinen zuordnen
// ---------------------------------------------------
switch ($d) {
case 'einzel_herren_lg':
return $render_einzel("Einzel Herren LG", 11, 'H');
case 'einzel_damen_lg':
return $render_einzel("Einzel Damen LG", 11, 'D');
case 'einzel_jugend_lg':
return $render_einzel("Einzel Jugend LG", 11, 'J');
case 'einzel_herren_kk':
return $render_einzel("Einzel Herren KK", 14, 'H');
case 'einzel_damen_kk':
return $render_einzel("Einzel Damen KK", 14, 'D');
case 'einzel_lg_frei':
return $render_einzel("Einzel LG Frei", 15, 'H');
case 'mann_herren_lg':
return $render_mannschaft("Mannschaften Herren LG", 110);
case 'mann_damen_lg':
return $render_mannschaft("Mannschaften Damen LG", 110);
case 'mann_jugend_lg':
return $render_mannschaft("Mannschaften Jugend LG", 110);
case 'mann_kk':
return $render_mannschaft("Mannschaften KK 50m", 120);
}
return "
Keine Daten.
";
}
add_action('wp_head', function() {
echo "
";
});
function opo_archiv_page() {
echo '
Archiv
Hier werden alte Jahre angezeigt.
';
}
*/