prefix . 'kgv_cf_messages'; } function kgv_cf_categories_table() { global $wpdb; return $wpdb->prefix . 'kgv_cf_categories'; } function kgv_cf_activate() { kgv_cf_run_schema_update(); kgv_cf_add_caps(); update_option('kgv_cf_db_version', KGV_CF_VERSION); } function kgv_cf_maybe_upgrade() { $installed = get_option('kgv_cf_db_version', ''); if ($installed !== KGV_CF_VERSION) { kgv_cf_run_schema_update(); kgv_cf_add_caps(); update_option('kgv_cf_db_version', KGV_CF_VERSION); } } function kgv_cf_add_caps() { $roles = ['administrator', 'editor', 'author', 'contributor']; foreach ($roles as $role_name) { $role = get_role($role_name); if ($role && !$role->has_cap(KGV_CF_VIEW_CAP)) { $role->add_cap(KGV_CF_VIEW_CAP); } } } function kgv_cf_run_schema_update() { global $wpdb; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; $charset_collate = $wpdb->get_charset_collate(); $messages = kgv_cf_messages_table(); $categories = kgv_cf_categories_table(); $sql_messages = "CREATE TABLE $messages ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, created_at DATETIME NOT NULL, category_id BIGINT UNSIGNED NULL, category_name VARCHAR(190) NOT NULL DEFAULT '', recipient_email TEXT NULL, sender_name VARCHAR(190) NOT NULL DEFAULT '', sender_email VARCHAR(190) NOT NULL DEFAULT '', subject VARCHAR(255) NOT NULL DEFAULT '', message LONGTEXT NOT NULL, privacy_accepted TINYINT(1) NOT NULL DEFAULT 0, is_read TINYINT(1) NOT NULL DEFAULT 0, ip_address VARCHAR(100) NOT NULL DEFAULT '', user_agent TEXT NULL, is_sent TINYINT(1) NOT NULL DEFAULT 0, PRIMARY KEY (id) ) $charset_collate;"; $sql_categories = "CREATE TABLE $categories ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(190) NOT NULL, recipient_email TEXT NULL, sort_order INT NOT NULL DEFAULT 0, is_active TINYINT(1) NOT NULL DEFAULT 1, PRIMARY KEY (id) ) $charset_collate;"; dbDelta($sql_messages); dbDelta($sql_categories); $count = (int) $wpdb->get_var("SELECT COUNT(*) FROM $categories"); if ($count === 0) { $wpdb->insert($categories, [ 'name' => 'Allgemein', 'recipient_email' => get_option('admin_email'), 'sort_order' => 10, 'is_active' => 1, ], ['%s', '%s', '%d', '%d']); } } function kgv_cf_enqueue_assets() { wp_enqueue_style( 'kgv-contact-form-style', plugin_dir_url(__FILE__) . 'assets/kgv-contact-form.css', [], KGV_CF_VERSION ); } function kgv_cf_get_categories($only_active = false) { global $wpdb; $table = kgv_cf_categories_table(); $where = $only_active ? "WHERE is_active = 1" : ""; return $wpdb->get_results("SELECT * FROM $table $where ORDER BY sort_order ASC, name ASC"); } function kgv_cf_get_category($id) { global $wpdb; $table = kgv_cf_categories_table(); return $wpdb->get_row($wpdb->prepare("SELECT * FROM $table WHERE id = %d", $id)); } function kgv_cf_parse_recipient_emails($raw) { $parts = array_map('trim', explode(',', (string) $raw)); $parts = array_filter($parts, function($email) { return is_email($email); }); if (empty($parts)) { $parts = [get_option('admin_email')]; } return array_values(array_unique($parts)); } function kgv_cf_admin_menu() { add_menu_page( 'Kontaktformular', 'Kontaktformular', KGV_CF_VIEW_CAP, 'kgv-contact-form', 'kgv_cf_render_messages_page', 'dashicons-email-alt', 26 ); add_submenu_page( 'kgv-contact-form', 'Nachrichten', 'Nachrichten', KGV_CF_VIEW_CAP, 'kgv-contact-form', 'kgv_cf_render_messages_page' ); add_submenu_page( 'kgv-contact-form', 'Kategorien', 'Kategorien', KGV_CF_MANAGE_CAP, 'kgv-contact-form-categories', 'kgv_cf_render_categories_page' ); } function kgv_cf_handle_admin_actions() { if (!is_admin()) { return; } global $wpdb; if (isset($_POST['kgv_cf_save_category'])) { if (!current_user_can(KGV_CF_MANAGE_CAP)) { wp_die('Keine Berechtigung.'); } check_admin_referer('kgv_cf_save_category'); $table = kgv_cf_categories_table(); $id = isset($_POST['category_id']) ? absint($_POST['category_id']) : 0; $name = sanitize_text_field($_POST['name'] ?? ''); $recipient_email = sanitize_textarea_field($_POST['recipient_email'] ?? ''); $sort_order = isset($_POST['sort_order']) ? intval($_POST['sort_order']) : 0; $is_active = !empty($_POST['is_active']) ? 1 : 0; $parsed_emails = kgv_cf_parse_recipient_emails($recipient_email); if ($name && !empty($parsed_emails)) { $data = [ 'name' => $name, 'recipient_email' => implode(', ', $parsed_emails), 'sort_order' => $sort_order, 'is_active' => $is_active, ]; if ($id) { $wpdb->update($table, $data, ['id' => $id], ['%s', '%s', '%d', '%d'], ['%d']); } else { $wpdb->insert($table, $data, ['%s', '%s', '%d', '%d']); } wp_safe_redirect(admin_url('admin.php?page=kgv-contact-form-categories&saved=1')); exit; } wp_safe_redirect(admin_url('admin.php?page=kgv-contact-form-categories&error=1')); exit; } if (isset($_GET['kgv_cf_delete_category'])) { if (!current_user_can(KGV_CF_MANAGE_CAP)) { wp_die('Keine Berechtigung.'); } check_admin_referer('kgv_cf_delete_category'); $id = absint($_GET['kgv_cf_delete_category']); if ($id) { $wpdb->delete(kgv_cf_categories_table(), ['id' => $id], ['%d']); } wp_safe_redirect(admin_url('admin.php?page=kgv-contact-form-categories&deleted=1')); exit; } if (isset($_GET['kgv_cf_delete_message'])) { if (!current_user_can(KGV_CF_VIEW_CAP)) { wp_die('Keine Berechtigung.'); } check_admin_referer('kgv_cf_delete_message'); $id = absint($_GET['kgv_cf_delete_message']); if ($id) { $wpdb->delete(kgv_cf_messages_table(), ['id' => $id], ['%d']); } wp_safe_redirect(admin_url('admin.php?page=kgv-contact-form&deleted=1')); exit; } if (isset($_GET['kgv_cf_toggle_read'])) { if (!current_user_can(KGV_CF_VIEW_CAP)) { wp_die('Keine Berechtigung.'); } check_admin_referer('kgv_cf_toggle_read'); $id = absint($_GET['kgv_cf_toggle_read']); $message = $wpdb->get_row($wpdb->prepare( "SELECT id, is_read FROM " . kgv_cf_messages_table() . " WHERE id = %d", $id )); if ($message) { $new_value = ((int) $message->is_read === 1) ? 0 : 1; $wpdb->update( kgv_cf_messages_table(), ['is_read' => $new_value], ['id' => $id], ['%d'], ['%d'] ); } wp_safe_redirect(admin_url('admin.php?page=kgv-contact-form&updated=1')); exit; } } function kgv_cf_render_form() { $categories = kgv_cf_get_categories(true); ob_start(); if (isset($_GET['kgv_sent']) && $_GET['kgv_sent'] === '1') { echo '
Nachricht gelöscht.
Status aktualisiert.
Ungelesene Nachrichten: ' . esc_html($unread_count) . '
'; if (empty($messages)) { echo 'Noch keine Nachrichten vorhanden.
'; echo '| Status | '; echo 'Datum | '; echo 'Kategorie | '; echo 'Von | '; echo 'Betreff | '; echo 'Datenschutz | '; echo 'Weitergeleitet an | '; echo 'Mailstatus | '; echo 'Aktion | '; echo '
|---|---|---|---|---|---|---|---|---|
| ' . $status_badge . ' | '; echo '' . esc_html(mysql2date('d.m.Y H:i', $msg->created_at)) . ' | '; echo '' . esc_html($msg->category_name) . ' | '; echo '' . esc_html($msg->sender_name) . ' ' . esc_html($msg->sender_email) . ' | ';
echo '' . esc_html($msg->subject) . ' ' . nl2br(esc_html(wp_trim_words($msg->message, 24, '…'))) . ' | ';
echo '' . (((int)$msg->privacy_accepted === 1) ? 'Ja' : 'Nein') . ' | '; echo '' . esc_html($msg->recipient_email) . ' | '; echo '' . (((int)$msg->is_sent === 1) ? 'Gesendet' : 'Fehler') . ' | '; echo ''; echo '' . (((int)$msg->is_read === 1) ? 'Als ungelesen markieren' : 'Als gelesen markieren') . ''; echo ' | Anzeigen'; echo ' | Löschen'; echo ''; echo ' | '; echo '
Kategorie gespeichert.
Kategorie gelöscht.
Bitte einen Namen und mindestens eine gültige E-Mail-Adresse eintragen.
| Name | Sortierung | Status | Aktion | |
|---|---|---|---|---|
| Keine Kategorien vorhanden. | ||||
| ' . esc_html($category->name) . ' | '; echo '' . esc_html($category->recipient_email) . ' | '; echo '' . esc_html($category->sort_order) . ' | '; echo '' . ((int)$category->is_active === 1 ? 'Aktiv' : 'Inaktiv') . ' | '; echo 'Bearbeiten | Löschen | '; echo '
Dieses Plugin gibt automatisch folgenden Rollen Leserechte auf die Kontaktanfragen:
'; echo 'Kategorien verwalten bleibt absichtlich nur für Administratoren freigeschaltet.
'; echo 'Shortcode: [kgv_contact_form]