7 Commits

Author SHA1 Message Date
126b063e78 feat: Math-CAPTCHA (serverseitig, kein externer Dienst) – v1.5.0
- kgv_cf_generate_captcha(): Rechenaufgabe (+/-/×) mit WordPress-Transient
- kgv_cf_verify_captcha(): serverseitige Prüfung + einmaliger Token-Verbrauch
- Formular: CAPTCHA-Feld mit verstecktem Token
- Submit-Handler: Abweisung bei falscher/abgelaufener Antwort
- CSS: CAPTCHA-Feld gestylt
- Version 1.4.7 → 1.5.0
2026-04-21 22:12:20 +02:00
4e85783827 Release v1.4.7 2026-04-21 07:42:58 +02:00
7d205bfd6a release: 1.4.6 2026-04-20 23:00:42 +02:00
51e9bcc564 Release 1.4.5 2026-04-18 10:10:28 +02:00
76b6677a61 fix: Button-CSS im KGV Contact Form korrigiert 2026-04-18 10:06:50 +02:00
010da8d592 Release 1.4.4 2026-04-15 21:44:14 +02:00
574f047b89 Standardize WordPress readme format 2026-04-15 21:36:07 +02:00
5 changed files with 189 additions and 24 deletions

0
.gitignore vendored Normal file → Executable file
View File

View File

@@ -1,27 +1,55 @@
KGV Contact Form Pro - WordPress Plugin === KGV Kontakt Form ===
Contributors: ronnygrobel
Tags: contact form, kontaktformular, vereinswebseite, kategorien, datenschutz
Requires at least: 6.0
Tested up to: 6.8
Stable tag: 1.4.7
Requires PHP: 7.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Beschreibung: Kategoriebasiertes Kontaktformular mit Routing, Datenschutz-Checkbox und Anfrageverwaltung im WordPress-Backend.
KGV Contact Form Pro ist ein WordPress-Plugin fuer ein kategoriebasiertes Kontaktformular mit Verwaltung der Anfragen im Backend.
== Description ==
KGV Kontakt Form stellt ein flexibles Kontaktformular fuer Vereinsseiten bereit.
Anfragen werden kategoriebasiert verarbeitet und koennen im Backend verwaltet werden.
= Features =
* Kategoriebasiertes Formular
* Mehrere Empfaengeradressen pro Kategorie
* Datenschutz-Checkbox
* Nachrichtenverwaltung im Backend (gelesen/ungelesen)
* Rollenfreigabe fuer Kontaktanfragen
== Installation ==
Installation:
1. Plugin nach `wp-content/plugins/KGV-Contact-Form/` hochladen. 1. Plugin nach `wp-content/plugins/KGV-Contact-Form/` hochladen.
2. In WordPress unter `Plugins` aktivieren. 2. Plugin im WordPress-Backend aktivieren.
3. Gewuenschte Kategorie(n) und Empfaenger im Backend einrichten. 3. Kategorien und Empfaenger konfigurieren.
4. Formular per Shortcode auf einer Seite oder in einem Beitrag einbinden. 4. Formular mit dem Shortcode einbinden.
Shortcode: == Frequently Asked Questions ==
`[kgv_contact_form]`
Funktionen: = Wie binde ich das Formular ein? =
- kategoriebasiertes Kontaktformular
- mehrere E-Mail-Adressen pro Kategorie
- Datenschutz-Checkbox im Formular
- Nachrichtenbereich fuer zusaetzliche Angaben
- Backend-Uebersicht fuer Anfragen (gelesen/ungelesen)
Rollen und Rechte: Verwende den Shortcode `[kgv_contact_form]` auf einer Seite oder in einem Beitrag.
- Administratoren koennen Kategorien verwalten.
- Autoren und Mitarbeiter koennen Kontaktanfragen im Backend einsehen.
Version: = Koennen mehrere Empfaenger pro Kategorie genutzt werden? =
1.4.0
Ja, pro Kategorie koennen mehrere E-Mail-Adressen hinterlegt werden.
== Changelog ==
= 1.4.6 =
* Release 1.4.6 erstellt.
* Versionsnummer in Plugin-Datei und Readme erhoeht.
= 1.4.4 =
* Versionsabgleich zwischen Plugin-Header, Code und Readme.
* WordPress-Readme-Format weiter vereinheitlicht.
= 1.4.3 =
* Aktuelle Version laut Plugin-Header.
* Stabilitaets- und Pflegeupdates.

View File

@@ -23,9 +23,26 @@
.kgv-contact-form textarea:focus{outline:none;border-color:#2271b1;box-shadow:0 0 0 3px rgba(34,113,177,.12)} .kgv-contact-form textarea:focus{outline:none;border-color:#2271b1;box-shadow:0 0 0 3px rgba(34,113,177,.12)}
.kgv-cf-privacy{margin:8px 0 18px;font-size:.95rem;line-height:1.5} .kgv-cf-privacy{margin:8px 0 18px;font-size:.95rem;line-height:1.5}
.kgv-cf-privacy label{display:flex;gap:10px;align-items:flex-start} .kgv-cf-privacy label{display:flex;gap:10px;align-items:flex-start}
.kgv-contact-form button{appearance:none;border:none;border-radius:10px;padding:12px 18px;font-weight:700;cursor:pointer;background:#2271b1;color:#fff} .kgv-contact-form button{
display: inline-flex;
align-items: center;
justify-content: center;
padding: 8px 12px;
min-height: 38px;
border-radius: 5px;
text-decoration: none;
background: var(--kgv-accent,#1f6f4a);
color: #fff;
font-weight: 700;
line-height: 1.2;}
.kgv-cf-alert{max-width:760px;margin:0 0 16px;padding:12px 14px;border-radius:12px} .kgv-cf-alert{max-width:760px;margin:0 0 16px;padding:12px 14px;border-radius:12px}
.kgv-cf-alert-success{border:1px solid #c6e1c6;background:#ecf7ed} .kgv-cf-alert-success{border:1px solid #c6e1c6;background:#ecf7ed}
.kgv-cf-alert-error{border:1px solid #e5b3b3;background:#fff2f2} .kgv-cf-alert-error{border:1px solid #e5b3b3;background:#fff2f2}
.kgv-cf-hp{position:absolute !important;left:-9999px !important;opacity:0 !important;pointer-events:none !important} .kgv-cf-hp{position:absolute !important;left:-9999px !important;opacity:0 !important;pointer-events:none !important}
.kgv-cf-captcha label{font-weight:600;margin-bottom:8px;display:block}
.kgv-cf-captcha input[type="text"]{max-width:120px}
@media (max-width:700px){.kgv-cf-grid{grid-template-columns:1fr}.kgv-contact-form{padding:18px;border-radius:14px}} @media (max-width:700px){.kgv-cf-grid{grid-template-columns:1fr}.kgv-contact-form{padding:18px;border-radius:14px}}

View File

@@ -2,10 +2,10 @@
/** /**
* Plugin Name: KGV Kontakt Form * Plugin Name: KGV Kontakt Form
* Description: Kontaktformular mit Nachrichtenbereich, Kategorien, Routing je Kategorie, Datenschutz-Checkbox, gelesen/ungelesen, Mehrfach-E-Mail und Rollenfreigabe für Kontaktanfragen. * Description: Kontaktformular mit Nachrichtenbereich, Kategorien, Routing je Kategorie, Datenschutz-Checkbox, gelesen/ungelesen, Mehrfach-E-Mail und Rollenfreigabe für Kontaktanfragen.
* Version: 1.4.3 * Version: 1.5.0
* Author: Ronny Grobel * Author: Ronny Grobel
* Author URI: https://apex-project.de/ * Author URI: https://apex-project.de/
* Plugin URI: https://apex-project.de/ * Plugin URI: https://wordpress.apex-project.de/
* Update URI: https://git.apex-project.de/Wordpress_Plugins/KGV-Contact-Form * Update URI: https://git.apex-project.de/Wordpress_Plugins/KGV-Contact-Form
* Gitea Plugin URI: https://git.apex-project.de/Wordpress_Plugins/KGV-Contact-Form * Gitea Plugin URI: https://git.apex-project.de/Wordpress_Plugins/KGV-Contact-Form
* Requires Plugins: KGV-Updater * Requires Plugins: KGV-Updater
@@ -13,7 +13,7 @@
if (!defined('ABSPATH')) exit; if (!defined('ABSPATH')) exit;
define('KGV_CF_VERSION', '1.4.0'); define('KGV_CF_VERSION', '1.5.0');
define('KGV_CF_VIEW_CAP', 'kgv_view_contact_requests'); define('KGV_CF_VIEW_CAP', 'kgv_view_contact_requests');
define('KGV_CF_MANAGE_CAP', 'manage_options'); define('KGV_CF_MANAGE_CAP', 'manage_options');
@@ -110,6 +110,55 @@ function kgv_cf_run_schema_update() {
} }
} }
// --- CAPTCHA (serverseitig, kein externer Dienst) ---
function kgv_cf_generate_captcha() {
$a = wp_rand(1, 12);
$b = wp_rand(1, 12);
$ops = ['+', '-', '×'];
$op = $ops[array_rand($ops)];
switch ($op) {
case '-':
if ($b > $a) { [$a, $b] = [$b, $a]; }
$answer = $a - $b;
break;
case '×':
$a = wp_rand(1, 9);
$b = wp_rand(1, 9);
$answer = $a * $b;
break;
default:
$answer = $a + $b;
}
$token = bin2hex(random_bytes(16));
set_transient('kgv_cf_cap_' . $token, (string) $answer, HOUR_IN_SECONDS);
return [
'token' => $token,
'question' => sprintf('Sicherheitsfrage: Wie viel ist %d %s %d?', $a, $op, $b),
];
}
function kgv_cf_verify_captcha($token, $given) {
if (empty($token) || !ctype_xdigit($token) || strlen($token) !== 32) {
return false;
}
$key = 'kgv_cf_cap_' . sanitize_text_field($token);
$stored = get_transient($key);
delete_transient($key);
if ($stored === false) {
return false;
}
return trim((string) $given) === $stored;
}
// --- Ende CAPTCHA ---
function kgv_cf_enqueue_assets() { function kgv_cf_enqueue_assets() {
wp_enqueue_style( wp_enqueue_style(
'kgv-contact-form-style', 'kgv-contact-form-style',
@@ -336,6 +385,15 @@ function kgv_cf_render_form() {
<input type="text" name="kgv_hp" value="" autocomplete="off" tabindex="-1" class="kgv-cf-hp"> <input type="text" name="kgv_hp" value="" autocomplete="off" tabindex="-1" class="kgv-cf-hp">
<?php
$captcha = kgv_cf_generate_captcha();
?>
<p class="kgv-cf-field kgv-cf-captcha">
<label for="kgv_captcha_answer"><?php echo esc_html($captcha['question']); ?> *</label>
<input type="text" id="kgv_captcha_answer" name="kgv_captcha_answer" inputmode="numeric" pattern="-?[0-9]+" autocomplete="off" required>
<input type="hidden" name="kgv_captcha_token" value="<?php echo esc_attr($captcha['token']); ?>">
</p>
<?php wp_nonce_field('kgv_contact_form_submit', 'kgv_nonce'); ?> <?php wp_nonce_field('kgv_contact_form_submit', 'kgv_nonce'); ?>
<p class="kgv-cf-submit"> <p class="kgv-cf-submit">
@@ -360,6 +418,13 @@ function kgv_cf_handle_form_submit() {
return; return;
} }
$captcha_token = isset($_POST['kgv_captcha_token']) ? sanitize_text_field(wp_unslash($_POST['kgv_captcha_token'])) : '';
$captcha_answer = isset($_POST['kgv_captcha_answer']) ? sanitize_text_field(wp_unslash($_POST['kgv_captcha_answer'])) : '';
if (!kgv_cf_verify_captcha($captcha_token, $captcha_answer)) {
kgv_cf_redirect_with_flag('kgv_error', '1');
}
$name = sanitize_text_field($_POST['kgv_name'] ?? ''); $name = sanitize_text_field($_POST['kgv_name'] ?? '');
$email = sanitize_email($_POST['kgv_email'] ?? ''); $email = sanitize_email($_POST['kgv_email'] ?? '');
$category_id = absint($_POST['kgv_category'] ?? 0); $category_id = absint($_POST['kgv_category'] ?? 0);

55
readme.txt Executable file
View File

@@ -0,0 +1,55 @@
=== KGV Kontakt Form ===
Contributors: ronnygrobel
Tags: contact form, kontaktformular, vereinswebseite, kategorien, datenschutz
Requires at least: 6.0
Tested up to: 6.8
Stable tag: 1.5.0
Requires PHP: 7.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Kategoriebasiertes Kontaktformular mit Routing, Datenschutz-Checkbox und Anfrageverwaltung im WordPress-Backend.
== Description ==
KGV Kontakt Form stellt ein flexibles Kontaktformular fuer Vereinsseiten bereit.
Anfragen werden kategoriebasiert verarbeitet und koennen im Backend verwaltet werden.
= Features =
* Kategoriebasiertes Formular
* Mehrere Empfaengeradressen pro Kategorie
* Datenschutz-Checkbox
* Nachrichtenverwaltung im Backend (gelesen/ungelesen)
* Rollenfreigabe fuer Kontaktanfragen
== Installation ==
1. Plugin nach `wp-content/plugins/KGV-Contact-Form/` hochladen.
2. Plugin im WordPress-Backend aktivieren.
3. Kategorien und Empfaenger konfigurieren.
4. Formular mit dem Shortcode einbinden.
== Frequently Asked Questions ==
= Wie binde ich das Formular ein? =
Verwende den Shortcode `[kgv_contact_form]` auf einer Seite oder in einem Beitrag.
= Koennen mehrere Empfaenger pro Kategorie genutzt werden? =
Ja, pro Kategorie koennen mehrere E-Mail-Adressen hinterlegt werden.
== Changelog ==
= 1.4.6 =
* Release 1.4.6 erstellt.
* Versionsnummer in Plugin-Datei und Readme erhoeht.
= 1.4.4 =
* Versionsabgleich zwischen Plugin-Header, Code und Readme.
* WordPress-Readme-Format weiter vereinheitlicht.
= 1.4.3 =
* Aktuelle Version laut Plugin-Header.
* Stabilitaets- und Pflegeupdates.