'array', 'sanitize_callback' => [$this, 'sanitize_vouchers'], ]); } public function sanitize_vouchers($input) { if (!is_array($input)) { return []; } $sanitized = []; foreach ($input as $code => $voucher) { // Verwende den originalen Code (in Großbuchstaben) als Key $voucherCode = strtoupper(sanitize_text_field($voucher['code'] ?? '')); $sanitized[$voucherCode] = [ 'code' => $voucherCode, 'type' => in_array($voucher['type'] ?? '', ['percent', 'fixed']) ? $voucher['type'] : 'percent', 'value' => floatval($voucher['value'] ?? 0), 'expiry_date' => sanitize_text_field($voucher['expiry_date'] ?? ''), 'usage_limit' => intval($voucher['usage_limit'] ?? 0), 'usage_count' => intval($voucher['usage_count'] ?? 0), ]; } return $sanitized; } public function handle_add_voucher(): void { if (!current_user_can('manage_options')) { wp_die('Keine Berechtigung'); } check_admin_referer('sk_add_voucher'); $vouchers = get_option(self::OPTION_KEY, []); $code = strtoupper(sanitize_text_field($_POST['voucher_code'] ?? '')); if (empty($code)) { wp_redirect(add_query_arg(['page' => 'skrift-vouchers', 'error' => 'empty_code'], admin_url('options-general.php'))); exit; } if (isset($vouchers[$code])) { wp_redirect(add_query_arg(['page' => 'skrift-vouchers', 'error' => 'duplicate'], admin_url('options-general.php'))); exit; } $vouchers[$code] = [ 'code' => $code, 'type' => sanitize_text_field($_POST['voucher_type'] ?? 'percent'), 'value' => floatval($_POST['voucher_value'] ?? 0), 'expiry_date' => sanitize_text_field($_POST['voucher_expiry'] ?? ''), 'usage_limit' => intval($_POST['voucher_limit'] ?? 0), 'usage_count' => 0, ]; update_option(self::OPTION_KEY, $vouchers); wp_redirect(add_query_arg(['page' => 'skrift-vouchers', 'success' => 'added'], admin_url('options-general.php'))); exit; } public function handle_delete_voucher(): void { if (!current_user_can('manage_options')) { wp_die('Keine Berechtigung'); } check_admin_referer('sk_delete_voucher'); $code = sanitize_text_field($_GET['code'] ?? ''); $vouchers = get_option(self::OPTION_KEY, []); if (isset($vouchers[$code])) { unset($vouchers[$code]); update_option(self::OPTION_KEY, $vouchers); } wp_redirect(add_query_arg(['page' => 'skrift-vouchers', 'success' => 'deleted'], admin_url('options-general.php'))); exit; } public function render_vouchers_page(): void { if (!current_user_can('manage_options')) { return; } $vouchers = get_option(self::OPTION_KEY, []); ?>

Gutschein-Verwaltung

Neuen Gutschein erstellen

Code wird automatisch in Großbuchstaben umgewandelt

Bei Prozent: z.B. 10 für 10% | Bei Festbetrag: z.B. 5.00 für 5€

Leer lassen für unbegrenzte Gültigkeit

0 = Unbegrenzt oft einlösbar

Vorhandene Gutscheine

Noch keine Gutscheine vorhanden.

$voucher): $is_expired = !empty($voucher['expiry_date']) && strtotime($voucher['expiry_date']) < time(); $is_used_up = $voucher['usage_limit'] > 0 && $voucher['usage_count'] >= $voucher['usage_limit']; $is_active = !$is_expired && !$is_used_up; ?>
Code Typ Wert Ablaufdatum Limit Eingelöst Status Aktionen
0 ? $voucher['usage_limit'] : 'Unbegrenzt'; ?> ✓ Aktiv ✗ Abgelaufen ✗ Limit erreicht Löschen
false, 'error' => 'Gutschein nicht gefunden']; } $voucher = $vouchers[$code]; // Ablaufdatum prüfen if (!empty($voucher['expiry_date']) && strtotime($voucher['expiry_date']) < time()) { return ['valid' => false, 'error' => 'Gutschein ist abgelaufen']; } // Nutzungslimit prüfen if ($voucher['usage_limit'] > 0 && $voucher['usage_count'] >= $voucher['usage_limit']) { return ['valid' => false, 'error' => 'Gutschein wurde bereits zu oft eingelöst']; } return [ 'valid' => true, 'voucher' => $voucher ]; } /** * Markiert einen Gutschein als verwendet */ public static function use_voucher($code) { $vouchers = self::get_vouchers(); $code = strtoupper(trim($code)); if (isset($vouchers[$code])) { $vouchers[$code]['usage_count']++; update_option(self::OPTION_KEY, $vouchers); return true; } return false; } /** * REST API Routen registrieren */ public function register_rest_routes() { register_rest_route('skrift/v1', '/voucher/use', [ 'methods' => 'POST', 'callback' => [$this, 'rest_use_voucher'], 'permission_callback' => ['Skrift_Konfigurator_Admin_Settings', 'rest_api_key_permission'], ]); register_rest_route('skrift/v1', '/voucher/validate', [ 'methods' => 'POST', 'callback' => [$this, 'rest_validate_voucher'], 'permission_callback' => ['Skrift_Konfigurator_Admin_Settings', 'rest_api_key_permission'], ]); } /** * REST API Endpoint: Gutschein validieren */ public function rest_validate_voucher($request) { $code = $request->get_param('code'); if (empty($code)) { return new WP_Error('missing_code', 'Gutschein-Code fehlt', ['status' => 400]); } $result = self::validate_voucher($code); if ($result['valid']) { return [ 'valid' => true, 'voucher' => [ 'code' => $result['voucher']['code'], 'type' => $result['voucher']['type'], 'value' => $result['voucher']['value'], ] ]; } else { return [ 'valid' => false, 'error' => $result['error'] ]; } } /** * REST API Endpoint: Gutschein als verwendet markieren */ public function rest_use_voucher($request) { $code = $request->get_param('code'); if (empty($code)) { return new WP_Error('missing_code', 'Gutschein-Code fehlt', ['status' => 400]); } $result = self::use_voucher($code); if ($result) { return ['success' => true, 'message' => 'Gutschein wurde als verwendet markiert']; } else { return new WP_Error('invalid_code', 'Ungültiger Gutschein-Code', ['status' => 404]); } } } new Skrift_Konfigurator_Vouchers();