# WP Ingame Shop Pro – NO RCON & CUSTOM CURRENCY

Vollautomatischer, Minecraft-basierter Ingame-Shop für WordPress mit Warenkorb, Daily Deal, Kategorien, Gutscheinen und eigenem Währungssystem – komplett ohne RCON, ideal für Bungee-/Proxy-Setups mit externer Ingame-Bestätigung. 

## Features

- 🛒 **Warenkorb-System**: Spieler können mehrere Items gleichzeitig kaufen, alles wird als eine Bestellung in der Datenbank gespeichert. 
- 💾 **Saubere Order-Struktur**: Eine Bestellung = eine Zeile in `wp_wis_orders` mit JSON-Detaildaten (Items + Gutschein). 
- 📋 **Detail-Ansicht im Backend**: Übersicht wie „1x Diamant, 64x Stein“ inkl. Gutschein und Debug-JSON. 
- 💰 **Eigene Währung**: Frei konfigurierbarer Währungsname (z. B. Coins, Tokens) statt Euro. 
- 🖼️ **Auto-Itembilder**: Bilder werden automatisch aus einer Basis-URL + Item-ID (`minecraft:diamond` → `minecraft_diamond.png`) generiert. 
- 🔥 **Angebote & Sales**: Items können als Angebot markiert und mit eigenem Angebots-Preis versehen werden. 
- 🎁 **Daily Deal**: Automatisches „Angebot des Tages“ mit frei einstellbarem prozentualem Rabatt, gesteuert über Cron. 
- 🎫 **Smart Coupons**: Gutscheine als Festbetrag oder Prozent, optional keine Wirkung auf Angebot-Items (Sale). 
- 🏷️ **Kategorien**: Eigene Taxonomie `wis_category` mit Backend-Tabs/Filter im Shop-Frontend. 
- 🏆 **Top Spender**: Statistikseite mit Summe aller abgeschlossenen/cancelled Orders pro Spieler. 
- 🌐 **REST API**: Endpoints für Orders, Pending Orders, Ausführung, Abschluss, Storno, Gutscheinprüfung und Bulk-Import. 
- 📥 **Bulk-Import**: JSON-Import von Items (z. B. von `minecraft-ids.com`) in Batches inkl. Fortschrittsanzeige. 
- 🧹 **Bulk Delete**: Massenlöschung für Items, Server und Gutscheine mit Admin-Notice. 
- 🎮 **Ingame-Integration ready**: Orders werden über REST abgeholt und serverseitig (z. B. Plugin/Bot) bestätigt, kein RCON notwendig. 

## Installation

1. Plugin-Datei (`wp-ingame-shop-pro.php` o. ä.) in den Ordner `wp-content/plugins/wp-ingame-shop-pro` legen.   
2. Im WordPress-Backend unter „Plugins“ das Plugin **aktivieren**.  
3. Bei Aktivierung werden automatisch die Tabellen `wp_wis_orders` und `wp_wis_coupons` erstellt sowie Cron-Events für den Daily Deal registriert.  
4. Cron muss auf dem Server funktionieren (WP-Cron oder System-Cron, der `wp-cron.php` triggert). 

## Admin-Bereich

Nach der Aktivierung erscheint im Backend das Menü **„Ingame Shop“** mit mehreren Unterseiten. 

### Menüs

- **Ingame Shop (Übersicht)**  
  - Globale Einstellungen, Feature-Übersicht, Bulk-Import. 
- **Bestellungen**  
  - Liste aller Orders, Detailansicht, manuelles Löschen/Abschließen. 
- **Top Spender**  
  - Rangliste nach ausgegebenen Coins (inkl. Anzahl Bestellungen). 
- **Items** (CPT `wis_item`)  
  - Verwaltung der Shop-Items inkl. Preis, Serverzuordnung, Kategorie, Angebot, Daily Deal. 
- **Kategorien** (`wis_category`)  
  - Hierarchische Kategorien für Items (werden im Frontend als Tabs angezeigt). 
- **Servers** (CPT `wis_server`)  
  - Reine Serverdefinition (Name/Slug), dient zur Filterung und Zuordnung im Shop. 
- **Gutscheine** (CPT `wis_coupon`)  
  - Verwaltung von Gutscheincodes inkl. Typ, Wert, Limit, Ablaufdatum. 

### Globale Einstellungen

Zu finden unter **Ingame Shop → Ingame Shop (Übersicht)**. 

- **Shop Header Text**  
  - Text im grünen Info-Balken im Frontend, leer = kein Balken. 
- **Währungsname**  
  - Anzeigeeinheit für Preise, z. B. „Coins“. 
- **Bilder Basis-URL**  
  - Basis-URL, an die `ITEM_ID.png` angehängt wird, z. B. `https://assets.minecraft-ids.com/1_21_10/`. 
- **Gutscheine bei Angeboten ausschließen**  
  - Wenn aktiviert, wirken Gutscheine nur auf normale Items, nicht auf als Angebot markierte Items. 
- **Daily Deal aktivieren + Rabatt (%)**  
  - Aktiviert den täglichen Cron, der ein zufälliges Item (mit Preis > 0, bisher kein Daily Deal) auswählt und rabattiert. 

## Custom Post Types & Metaboxen

### Shop Items (`wis_item`)

Unter **Ingame Shop → Items**. 

Metabox **„Item Einstellungen“**: 

- **Status-Anzeige**  
  - Zeigt an, ob das Item aktiv im Shop ist (publish + Preis > 0) oder inaktiv. 
- **Preis (Coins)**  
  - Integer > 0 macht das Item automatisch aktiv (Status publish), 0 schaltet auf Entwurf. 
- **Item ID (z. B. `minecraft:diamond`)**  
  - Wird für die Bild-URL und das JSON-Payload (Ingame-Give) verwendet. 
- **Kategorie(n)**  
  - Checkbox-Liste aller `wis_category`-Terms, beeinflusst die Tabs im Frontend. 
- **Daily Deal (Angebot des Tages)**  
  - Option „manuell als Angebot des Tages setzen“, überschreibt die Automatik bis Mitternacht. 
- **Angebot / Sale**  
  - Checkbox „Als Angebot markieren 🔥“ + optionaler Angebots-Preis. 
  - Angebots-Preis wird angezeigt, normaler Preis durchgestrichen. 
- **Beschreibung**  
  - Langtext, der im Frontend unter dem Titel angezeigt wird. 
- **Server zuweisen**  
  - Checkbox-Liste aller definierten `wis_server`, steuert Sichtbarkeit und Kaufbarkeit pro Server. 

Zusätzlich existiert eine Auto-Status-Logik, die beim Speichern `publish/draft` abhängig vom Preis setzt. 

### Server (`wis_server`)

Metabox „Server Einstellungen“ zeigt nur einen Hinweis, dass keine RCON-Daten notwendig sind. 

- Der **Post-Slug** des Servers wird als Server-ID im Frontend/REST verwendet. 

### Gutscheine (`wis_coupon`)

Metabox **„Gutschein Einstellungen“**: 

- **Gutschein Code** (wird automatisch in Großbuchstaben gespeichert). 
- **Rabattart**: „Festbetrag“ oder „Prozentual“. 
- **Wert**: Coins oder Prozent, abhängig vom Typ. 
- **Nutzungslimit**: Wie oft der Gutschein eingelöst werden darf. 
- **Ablaufdatum** (optional). 
- Hinweis, wenn global eingestellt ist, dass Gutscheine bei Angeboten nicht gelten. 

Beim Speichern werden die Daten zusätzlich in der Tabelle `wp_wis_coupons` gespiegelt und `used_count` synchronisiert. 

Beim Löschen eines Gutschein-Posts wird der Eintrag aus `wp_wis_coupons` wieder entfernt. 

## REST API

Alle Routen liegen unter `wis/v1/…`. 

- `POST /wis/v1/order`  
  - Erstellt eine neue Bestellung.   
  - Request-Body: `{ player, cart: [{id, quantity}], server, coupon_code? }`.   
  - Validiert Items (Preis > 0, Serverzuordnung, Angebot/Normal, Gutscheinlogik) und speichert Order inkl. JSON mit realen Item-IDs und ggf. Gutschein-Rabatt. 
- `GET /wis/v1/pending_orders?player=Name`  
  - Liefert bis zu 10 offene Bestellungen (`status = pending`) eines Spielers. 
- `POST /wis/v1/execute_order`  
  - Setzt Status einer Bestellung auf `processing` (z. B. wenn der Ingame-Executor mit der Ausgabe beginnt). 
- `POST /wis/v1/complete_order`  
  - Setzt Status auf `completed`. 
- `POST /wis/v1/cancel_order`  
  - Setzt Status auf `cancelled`. 
- `POST /wis/v1/validate_coupon`  
  - Prüft einen Gutschein gegen aktuelle Cart-Daten (inkl. „nur normale Items“ Logik) und liefert Typ, Wert und Message. 
- `POST /wis/v1/fetch_remote_data`  
  - Lädt JSON von externer URL (z. B. `https://minecraft-ids.com/data/1.21.10.json`) und gibt eine normalisierte Items-Liste zurück. 
- `POST /wis/v1/import_batch`  
  - Importiert ein Items-Array als `wis_item`-Posts (draft, `_wis_item_id`, `_wis_price` = 0), überspringt Duplikate. 

Alle REST-Endpunkte sind aktuell ohne Authentifizierung (`permission_callback => __return_true`), für öffentliche Nutzung sollte gegebenenfalls Absicherung ergänzt werden. 

## Frontend Shortcode

Der Shop wird per Shortcode eingebunden: 

```text
[ingame_shop_form]
```

## Layout & Funktionen

- Modernes Grid mit Karten (Bild, Name, Preis, Server, Badges, Menge).  
- Filter: Suche, „Nur Angebote“, Server-Auswahl und Kategorie-Tabs.  
- Badges:  
  - „🔥 Angebot“ für Sale-Items.  
  - „🎁 Angebot des Tages“ für den aktiven Daily Deal.  
- Mengensteuerung je Item (Buttons + Input).  
- Warenkorb-Button (Badge mit Gesamtanzahl der Items) öffnet ein Modal.  
- Gutscheincode-Feld im Checkout mit Live-Validierung via `validate_coupon`.  
- Dynamische Berechnung:  
  - Normaler Teil des Warenkorbs, ggf. rabattiert.  
  - Angebots-Items, die optional von Gutscheinen ausgenommen sind.  
- Validierung:  
  - Alle ausgewählten Items müssen für den gewählten Server freigeschaltet sein.  
  - Spielername und Server sind Pflichtfelder.  
- Beim Abschließen des Kaufs wird `POST /wis/v1/order` aufgerufen, die Antwort wird im Modal angezeigt und der Warenkorb geleert.  

## Datenbank-Struktur

### Tabelle `wp_wis_orders`

- `id` – Auto-Increment.  
- `player_name` – Spielername.  
- `server` – Server-Slug (`wis_server` Postname).  
- `item_id` – Hier für den Warenkorb pauschal `multi_item_cart`.  
- `item_title` – Lesbare Zusammenfassung (z. B. „Warenkorb: 1x Diamant, 64x Stein…“).  
- `price` – Endpreis nach Rabatt.  
- `quantity` – Anzahl der unterschiedlichen Items im Warenkorb.  
- `status` – `pending`, `processing`, `completed`, `cancelled`, `failed`.  
- `response` – JSON mit `items` (real Item IDs + Mengen) und optionalem `coupon`.  
- `created_at` – Timestamp.  

### Tabelle `wp_wis_coupons`

- `id` – Auto-Increment.  
- `code` – Gutschein-Code (unique).  
- `value` – Wert (Coins oder Prozent).  
- `type` – `fixed` oder `percent`.  
- `usage_limit` – Maximal verwendbar.  
- `used_count` – Bisherige Verwendung.  
- `expiry` – Ablaufdatum.  
- `created_at` – Timestamp.  

## Cron & Daily Deal

- Beim Aktivieren wird ein tägliches Event `wis_daily_deal_event` registriert.  
- Callback `WIS_Activator::run_daily_deal()`:  
  - Deaktiviert das aktuelle Daily-Deal-Item (`_wis_daily_deal` → 0).  
  - Wählt ein random `wis_item` mit `_wis_price > 0` und ohne `_wis_daily_deal`-Meta.  
  - Berechnet den Rabatt basierend auf `wis_daily_deal_discount` und setzt `_wis_is_offer` + `_wis_offer_price`.  

## Bulk Import

- Im Admin-Overview vorhanden.  
- Eingabefeld für die Import-URL (Default: `https://minecraft-ids.com/data/1.21.10.json`).  
- Button „Daten laden“ → lädt via REST `fetch_remote_data` und zeigt Anzahl Items an.  
- Button „Import starten“ → ruft wiederholt `import_batch` mit Batches von 20 Items auf und zeigt Fortschritt an.  
- Vorhandene Items (gleiche `_wis_item_id`) werden übersprungen, neue Items als Draft mit Preis 0 angelegt.  
