434 lines
22 KiB
Markdown
434 lines
22 KiB
Markdown
# BreznGEO
|
||
|
||

|
||

|
||

|
||

|
||

|
||
|
||
🇬🇧 [English version → README.md](README.md)
|
||
|
||
**Website:** [brezngeo.com](https://brezngeo.com) · [How To](https://brezngeo.com/howto.html) · [FAQ](https://brezngeo.com/faq.html) · [Changelog](https://brezngeo.com/changelog.html)
|
||
|
||
---
|
||
|
||
BreznGEO ist ein schlankes SEO- & GEO-Plugin für WordPress. Es generiert KI-Metabeschreibungen, gibt Schema.org-Strukturdaten aus, erstellt GEO-Inhaltsblöcke für KI-Engines und verwaltet den Crawler-Zugriff über robots.txt und llms.txt — alles in einem Plugin, ohne dass etwas hinter einer Paywall versteckt wird.
|
||
|
||
Es funktioniert mit oder ohne KI-Key. Es integriert sich ohne Konflikte in Rank Math, Yoast, AIOSEO und SEOPress. Kein SaaS. Keine Telemetrie. Keine Upsells.
|
||
|
||
---
|
||
|
||
## Warum dieses Plugin existiert
|
||
|
||
Die meisten WordPress-SEO-Plugins haben sich in die gleiche Richtung entwickelt: aufgeblähte Feature-Sets, Dashboards voller Metriken, die niemand gebraucht hat, und ein Preismodell, das die nützlichen Funktionen hinter einem monatlichen Abo versteckt.
|
||
|
||
Die KI-Welle hat es schlimmer gemacht. Plugins fingen an, „KI-gestützte" Features anzubieten — aber als Proxy-Dienst. Man zahlt eine monatliche Gebühr, die Inhalte werden über deren Server geleitet, sie rufen die KI-API im eigenen Namen auf und schlagen eine Marge drauf.
|
||
|
||
BreznGEO verfolgt einen anderen Ansatz:
|
||
|
||
- **Direkter API-Zugriff.** Du hinterlegst deinen eigenen Key von OpenAI, Anthropic, Google oder xAI. BreznGEO ruft die API direkt auf. Kein Mittelsmann, keine Marge, keine Daten über Server Dritter.
|
||
- **Klarer Output, kein Lärm.** Metabeschreibungen, Strukturdaten, KI-Inhaltsblöcke für GEO, Bot-Steuerung. Keine Lesbarkeits-Scores, keine Keyword-Dichte-Meter, keine Upsell-Banner.
|
||
- **Keine Subscription.** GPL-2.0. Kostenlos auf beliebig vielen Sites nutzbar. Die einzigen Kosten sind die API-Nutzung — typischerweise Bruchteile eines Cents pro Beitrag.
|
||
- **Keine Telemetrie.** BreznGEO sendet keine Daten nach Hause. Kein Usage-Tracking, kein Remote-Logging, keine Analytics, die den eigenen Server verlassen.
|
||
- **Funktioniert ohne KI.** Kein API-Key? Der Fallback-Extraktor erzeugt eine brauchbare Metabeschreibung aus dem Artikelinhalt per Satzgrenzenerkennung. Jeder Beitrag bekommt eine Beschreibung.
|
||
|
||
Entwickelt in Passau, Bayern — für [Donau2Space](https://donau2space.de), einen persönlichen KI-Blog, für den ich genau das gebraucht habe — und nichts mehr.
|
||
|
||
---
|
||
|
||
## Inhaltsverzeichnis
|
||
|
||
- [Warum dieses Plugin existiert](#warum-dieses-plugin-existiert)
|
||
- [Verzeichnisstruktur](#verzeichnisstruktur)
|
||
- [Features](#features)
|
||
- [Datenspeicherung](#datenspeicherung)
|
||
- [Sicherheit](#sicherheit)
|
||
- [KI-Provider](#ki-provider)
|
||
- [Hooks & Erweiterbarkeit](#hooks--erweiterbarkeit)
|
||
- [AJAX-Schnittstellen](#ajax-schnittstellen)
|
||
- [Installation](#installation)
|
||
- [Technischer Stack](#technischer-stack)
|
||
- [Lizenz](#lizenz)
|
||
|
||
---
|
||
|
||
## Verzeichnisstruktur
|
||
|
||
```
|
||
brezngeo/
|
||
├── brezngeo.php # Plugin-Header, Konstanten (BREZNGEO_VERSION, BREZNGEO_DIR, BREZNGEO_URL)
|
||
├── uninstall.php # Aufräumen bei Plugin-Löschung
|
||
├── assets/
|
||
│ ├── admin.css # Gemeinsames Admin-Stylesheet
|
||
│ ├── admin.js # Provider-Selektor, Verbindungstest
|
||
│ ├── bulk.js # Bulk-Generator AJAX-Loop + Progress-UI
|
||
│ ├── editor-meta.js # Meta Editor Box: Live-Zähler, KI-Regen-Button
|
||
│ ├── geo-editor.js # GEO Block Editor: Generieren / Löschen Button
|
||
│ ├── geo-frontend.css # Minimales Stylesheet für .brezngeo-geo auf dem Frontend
|
||
│ ├── keyword-analysis.js # Keyword-Analyse: AJAX-Checks, Ergebnis-Rendering, KI-Handler
|
||
│ ├── link-suggest.js # Interne Link-Vorschläge: Trigger, UI, Apply (Gutenberg + Classic)
|
||
│ └── seo-widget.js # SEO Analyse Widget: Live-Auswertung im Editor
|
||
├── includes/
|
||
│ ├── Core.php # Singleton-Bootstrap, lädt alle Abhängigkeiten
|
||
│ ├── Admin/
|
||
│ │ ├── AdminMenu.php # Menüstruktur + Dashboard-Render
|
||
│ │ ├── BulkPage.php # Bulk Generator Admin-Seite
|
||
│ │ ├── GeoEditorBox.php # GEO Block Meta-Box im Post-Editor
|
||
│ │ ├── GeoPage.php # GEO Block Einstellungsseite
|
||
│ │ ├── KeywordMetaBox.php # Keyword-Analyse Meta-Box im Post-Editor
|
||
│ │ ├── KeywordPage.php # Keyword-Analyse Einstellungsseite
|
||
│ │ ├── LinkAnalysis.php # AJAX-Handler für Link-Analyse Dashboard
|
||
│ │ ├── LinkSuggestPage.php # Einstellungsseite für interne Link-Vorschläge
|
||
│ │ ├── MetaEditorBox.php # Meta Description Meta-Box im Post-Editor
|
||
│ │ ├── MetaPage.php # Meta Generator Einstellungsseite
|
||
│ │ ├── ProviderPage.php # AI Provider Einstellungsseite
|
||
│ │ ├── SchemaMetaBox.php # Schema.org per-Post Meta-Box
|
||
│ │ ├── TxtPage.php # TXT-Dateien-Seite: llms.txt + robots.txt (Tabs)
|
||
│ │ ├── SchemaPage.php # Schema.org Einstellungsseite
|
||
│ │ ├── SeoWidget.php # SEO Analyse Sidebar Widget
|
||
│ │ ├── SettingsPage.php # Zentrales getSettings() — mergt alle Option-Keys
|
||
│ │ └── views/ # PHP-Templates für alle Admin-Seiten
|
||
│ ├── Features/
|
||
│ │ ├── CrawlerLog.php # KI-Bot-Besuche loggen (eigene DB-Tabelle)
|
||
│ │ ├── GeoBlock.php # GEO Quick Overview Block (Frontend-Ausgabe)
|
||
│ │ ├── LlmsTxt.php # /llms.txt Endpunkt mit ETag/Cache
|
||
│ │ ├── LinkSuggest.php # Interne Link-Vorschläge: Matching-Engine + AJAX-Handler + Meta-Box
|
||
│ │ ├── KeywordAnalysis.php # Keyword-Analyse Engine: 10 SEO-Checks
|
||
│ │ ├── MetaGenerator.php # Kernlogik: KI-Aufruf, Speichern, Bulk, AJAX
|
||
│ │ ├── RobotsTxt.php # robots.txt Bot-Blocking via WP-Filter
|
||
│ │ └── SchemaEnhancer.php # JSON-LD Schema.org Ausgabe in wp_head
|
||
│ ├── Helpers/
|
||
│ │ ├── BulkQueue.php # Mutex-Lock für Bulk-Prozesse (Transient-basiert)
|
||
│ │ ├── FallbackMeta.php # Meta-Extraktion aus Post-Content ohne KI
|
||
│ │ ├── KeyVault.php # API-Key Verschleierung vor dem Schreiben in die DB
|
||
│ │ ├── KeywordVariants.php # Locale-basierte Keyword-Varianten (EN/DE)
|
||
│ │ └── TokenEstimator.php # Grobe Token-Schätzung für Kostenvorschau im Bulk
|
||
│ └── Providers/
|
||
│ ├── ProviderInterface.php # Interface: getId, getName, getModels, testConnection, generateText
|
||
│ ├── ProviderRegistry.php # Registry-Pattern: Provider registrieren und abrufen
|
||
│ ├── AnthropicProvider.php # Claude API (Messages API)
|
||
│ ├── GeminiProvider.php # Google Gemini (generateContent API)
|
||
│ ├── GrokProvider.php # xAI Grok (OpenAI-kompatibler Endpunkt)
|
||
│ └── OpenAIProvider.php # OpenAI GPT (Chat Completions API)
|
||
└── vendor/ # Composer-Abhängigkeiten (nur Produktionsstand)
|
||
```
|
||
|
||
---
|
||
|
||
## Features
|
||
|
||
### AI Meta Generator
|
||
|
||
Generiert SEO-optimierte Meta-Beschreibungen (150–160 Zeichen) automatisch beim Veröffentlichen eines Beitrags. Der Prompt ist vollständig anpassbar; unterstützte Platzhalter: `{title}`, `{content}`, `{excerpt}`, `{language}`.
|
||
|
||
**Spracherkennung:** Die Zielsprache wird automatisch aus Polylang, WPML oder dem WordPress-Locale ermittelt und im Prompt übergeben — ohne Konfiguration.
|
||
|
||
**SEO-Plugin-Integration:** Generierte Beschreibungen landen nicht nur in `_bre_meta_description`, sondern auch direkt im nativen Feld des aktiven SEO-Plugins:
|
||
|
||
| SEO-Plugin | Meta-Feld |
|
||
|---|---|
|
||
| Rank Math | `rank_math_description` |
|
||
| Yoast SEO | `_yoast_wpseo_metadesc` |
|
||
| AIOSEO | `_aioseo_description` |
|
||
| SEOPress | `_seopress_titles_desc` |
|
||
| (keins aktiv) | BreznGEO gibt `<meta name="description">` selbst aus |
|
||
|
||
**Token-Modus:** Wahlweise wird der gesamte Artikelinhalt gesendet (`full`) oder auf eine konfigurierbare Token-Anzahl (100–8000) gekürzt (`limit`). Das Kürzen erfolgt über `TokenEstimator` — eine wortbasierte Schätzung ohne externe Bibliothek.
|
||
|
||
**Fallback ohne KI:** `FallbackMeta::extract()` liefert immer eine brauchbare Beschreibung — auch ohne API-Key oder bei Fehlern. Vollständig multibyte-safe via `mb_substr` / `mb_strrpos`.
|
||
|
||
---
|
||
|
||
### GEO Block (Quick Overview)
|
||
|
||
Generiert KI-gestützte Inhaltsblöcke direkt im Artikeltext für Generative Engine Optimization:
|
||
|
||
- **Summary** — Kurzüberblick des Artikels
|
||
- **Key Points** — Stichpunktliste der wichtigsten Aussagen
|
||
- **FAQ** — Frage-Antwort-Paare (nur ab konfiguriertem Wort-Schwellenwert, Standard: 350 Wörter)
|
||
|
||
**Einfügeposition** (konfigurierbar): nach dem ersten Absatz (Standard), oben, unten.
|
||
|
||
**Ausgabe-Modi:**
|
||
|
||
| Modus | Verhalten |
|
||
|---|---|
|
||
| `details_collapsible` | Natives HTML `<details>` — zugeklappt, kein JavaScript nötig |
|
||
| `open_always` | Block immer sichtbar |
|
||
| `store_only_no_frontend` | Nur in DB speichern, keine Frontend-Ausgabe (z.B. für FAQPage-Schema) |
|
||
|
||
Alle Labels, Akzentfarbe, Farbschema (Auto/Hell/Dunkel) und Custom CSS sind über die Admin-Seite konfigurierbar — ohne Code.
|
||
|
||
---
|
||
|
||
### Schema.org Enhancer
|
||
|
||
Gibt JSON-LD-Strukturdaten und Meta-Tags in `<head>` aus. Einstellungen unter **BreznGEO → Schema.org**. Jeder Typ ist einzeln aktivierbar:
|
||
|
||
| Typ | Schema.org-Type | Hinweis |
|
||
|---|---|---|
|
||
| `organization` | `Organization` | Name, URL, Logo, `sameAs`-Links |
|
||
| `author` | `Person` | Autorenname, Profil-URL, optionaler Twitter-`sameAs` |
|
||
| `speakable` | `WebPage` + `SpeakableSpecification` | CSS-Selektoren auf H1 und ersten Absatz |
|
||
| `article_about` | `Article` | Headline, Publish/Modified, Description, Publisher |
|
||
| `breadcrumb` | `BreadcrumbList` | Automatisch unterdrückt wenn Rank Math oder Yoast aktiv |
|
||
| `ai_meta_tags` | — | `<meta name="robots">` mit `max-snippet:-1` |
|
||
| `faq_schema` | `FAQPage` | Automatisch aus GEO Block Daten befüllt |
|
||
| `blog_posting` | `BlogPosting` / `Article` | Mit eingebettetem `author` und Featured Image |
|
||
| `image_object` | `ImageObject` | Featured Image mit Dimensionen und Caption |
|
||
| `video_object` | `VideoObject` | YouTube/Vimeo wird automatisch erkannt |
|
||
| `howto` | `HowTo` | Schrittweise Anleitung — Daten per Metabox |
|
||
| `review` | `Review` | Bewertung mit `ratingValue` — Daten per Metabox |
|
||
| `recipe` | `Recipe` | Zutaten, Zeiten, Nährwerte — Daten per Metabox |
|
||
| `event` | `Event` | Datum, Ort, Veranstalter — Daten per Metabox |
|
||
|
||
---
|
||
|
||
### llms.txt
|
||
|
||
Bedient `/llms.txt` und paginierte Folgedateien über einen `parse_request`-Hook mit Priorität 1 — vor WordPress-Routing, kein Rewrite-Rule-Flush nötig.
|
||
|
||
**HTTP-Caching:** ETag, Last-Modified, Cache-Control. Transient-Cache wird bei jeder Einstellungsänderung automatisch invalidiert.
|
||
|
||
**Rank Math Konfliktwarnung:** Falls Rank Math ebenfalls eine llms.txt ausliefern will, zeigt BreznGEO einen Admin-Hinweis an — BreznGEO hat wegen Priorität 1 automatisch Vorrang.
|
||
|
||
---
|
||
|
||
### robots.txt Manager
|
||
|
||
Hängt `Disallow`-Blöcke über den WordPress-Filter `robots_txt` an — die WordPress-eigene robots.txt bleibt erhalten. 13 KI-Bots einzeln steuerbar: GPTBot, ClaudeBot, Google-Extended, PerplexityBot, CCBot, Applebot-Extended, Bytespider, DataForSeoBot, ImagesiftBot, omgili, Diffbot, FacebookBot, Amazonbot.
|
||
|
||
---
|
||
|
||
### Bulk Generator
|
||
|
||
Batch-Verarbeitung aller veröffentlichten Beiträge ohne Meta-Beschreibung. Läuft als AJAX-Request im Browser — kein WP-Cron, keine CLI nötig. 1–20 Beiträge pro Batch, 6s Delay, bis zu 3 Versuche je Post, Mutex-Lock via Transient.
|
||
|
||
---
|
||
|
||
### Keyword-Analyse
|
||
|
||
Meta-Box im Post-Editor, die die Keyword-Nutzung über zehn On-Page-SEO-Checks analysiert:
|
||
|
||
| Check | Was geprüft wird |
|
||
|---|---|
|
||
| Titel | Keyword im Beitragstitel vorhanden |
|
||
| Überschriften | Keyword in mindestens einer H2–H6 |
|
||
| Dichte | Keyword-Dichte im Zielbereich (Standard 0,5 %–2,5 %) |
|
||
| Bild-Alt | Mindestens ein Bild hat das Keyword im `alt`-Attribut |
|
||
| Meta Description | Keyword in der Meta-Beschreibung |
|
||
| Slug | Keyword in der URL |
|
||
| Erster Absatz | Keyword im ersten Absatz |
|
||
| Letzter Absatz | Keyword im letzten Absatz |
|
||
| Bild-Titel/Caption | Keyword in mindestens einem Bild-`title` oder `<figcaption>` |
|
||
| Excerpt | Keyword im Beitragsauszug |
|
||
|
||
**Primär- + Sekundär-Keywords:** Das Hauptkeyword wird mit strengeren Schwellenwerten geprüft, Sekundär-Keywords mit gelockerten Minimums.
|
||
|
||
**Update-Modi:** `live` (debounced beim Tippen), `manual` (Button-Klick) oder `save` (beim Speichern).
|
||
|
||
**Locale-basierte Varianten:** `KeywordVariants` generiert Compound-Formen (Leerzeichen ↔ Bindestrich), Trailing-s und sprachspezifische Suffixe (EN: -es, -ing, -ed; DE: -er, -en, -e).
|
||
|
||
**Optionale KI-Features** (bei konfiguriertem API-Key):
|
||
- **Suggest** — KI-generierte Keyword-Vorschläge basierend auf dem Artikelinhalt
|
||
- **Optimize** — Content-Optimierungstipps für das aktuelle Keyword
|
||
- **Semantic** — verwandte semantische Keywords für breitere Themenabdeckung
|
||
|
||
---
|
||
|
||
### Crawler Log
|
||
|
||
Loggt Besuche bekannter KI-Bots in der Tabelle `{prefix}brezngeo_crawler_log` (bot_name, ip_hash SHA-256, url, visited_at). Einträge älter als 90 Tage werden automatisch bereinigt. Dashboard zeigt 30-Tage-Zusammenfassung.
|
||
|
||
---
|
||
|
||
## Datenspeicherung
|
||
|
||
### WordPress Options (wp_options)
|
||
|
||
| Option-Key | Inhalt |
|
||
|---|---|
|
||
| `brezngeo_settings` | Aktiver Provider, API-Keys (verschleiert), Modell-Auswahl, Token-Kosten, `ai_enabled`-Flag |
|
||
| `brezngeo_meta_settings` | Meta Generator: Auto-Modus, Post-Types, Token-Modus, Prompt |
|
||
| `brezngeo_schema_settings` | Schema.org: aktivierte Typen, Organization sameAs-URLs |
|
||
| `brezngeo_geo_settings` | GEO Block: Modus, Position, Labels, CSS, Prompt, Farbschema |
|
||
| `brezngeo_robots_settings` | robots.txt: blockierte Bots |
|
||
| `brezngeo_llms_settings` | llms.txt: Titel, Beschreibung, Featured-Links, Footer, Seitenanzahl |
|
||
| `brezngeo_keyword_settings` | Keyword-Analyse: Update-Modus, Zieldichte, Min. Vorkommen, Post-Types, Debounce |
|
||
| `brezngeo_usage_stats` | Akkumulierte Token-Nutzung: `tokens_in`, `tokens_out`, `count` |
|
||
| `brezngeo_first_activated` | Unix-Timestamp der Erstaktivierung (für Welcome Notice) |
|
||
|
||
### Post Meta (wp_postmeta)
|
||
|
||
| Meta-Key | Inhalt |
|
||
|---|---|
|
||
| `_bre_meta_description` | Generierte Meta-Beschreibung |
|
||
| `_bre_meta_source` | Quelle: `ai` / `fallback` / `manual` |
|
||
| `_bre_bulk_failed` | Letzter Fehler beim Bulk-Versuch |
|
||
| `_bre_geo_summary` | GEO Block Summary |
|
||
| `_bre_geo_bullets` | GEO Block Key Points (JSON-Array) |
|
||
| `_bre_geo_faq` | GEO Block FAQ (JSON-Array) |
|
||
| `_brezngeo_keyword_main` | Primäres Keyword |
|
||
| `_brezngeo_keyword_secondary` | Sekundäre Keywords (kommagetrennt) |
|
||
| `_brezngeo_keyword_results` | Gecachte Analyse-Ergebnisse (JSON) |
|
||
|
||
### Transients
|
||
|
||
| Transient | TTL | Zweck |
|
||
|---|---|---|
|
||
| `brezngeo_llms_cache_{n}` | 1 Stunde | Gecachter llms.txt Inhalt je Seite |
|
||
| `brezngeo_link_analysis` | 1 Stunde | Dashboard Link-Analyse Ergebnis |
|
||
| `brezngeo_bulk_running` | 15 Minuten | Mutex-Lock für den Bulk Generator |
|
||
| `brezngeo_meta_stats` | 5 Minuten | Dashboard Meta-Coverage-Abfrage |
|
||
| `brezngeo_crawler_summary` | 5 Minuten | Dashboard Crawler-Zusammenfassung (letzte 30 Tage) |
|
||
|
||
> **Uninstall:** `uninstall.php` löscht `brezngeo_settings`, `brezngeo_keyword_settings` und die Post-Meta-Keys `_brezngeo_meta_description`, `_brezngeo_keyword_main`, `_brezngeo_keyword_secondary`, `_brezngeo_keyword_results` für alle Posts. Die übrigen Option-Keys und die `brezngeo_crawler_log`-Tabelle müssen manuell gelöscht werden.
|
||
|
||
---
|
||
|
||
## Sicherheit
|
||
|
||
### API-Key Verschleierung (KeyVault)
|
||
|
||
```
|
||
Klartextkey → XOR(key, sha256(AUTH_KEY . SECURE_AUTH_KEY)) → base64 → "bre1:<base64>"
|
||
```
|
||
|
||
Kein `openssl_*` oder externe Extension nötig — läuft auf jeder PHP 8.0+ Installation. Das Präfix `bre1:` ermöglicht spätere Migration ohne Breaking Change.
|
||
|
||
**Sicherheitsgrenzen:** XOR mit statischem Salt ist Verschleierung, keine kryptografische Verschlüsselung. Für maximale Sicherheit können Keys als `wp-config.php`-Konstanten definiert werden:
|
||
|
||
```php
|
||
define( 'BREZNGEO_OPENAI_KEY', 'sk-...' );
|
||
define( 'BREZNGEO_ANTHROPIC_KEY', 'sk-ant-...' );
|
||
define( 'BREZNGEO_GEMINI_KEY', 'AI...' );
|
||
define( 'BREZNGEO_GROK_KEY', 'xai-...' );
|
||
```
|
||
|
||
### CSRF-Schutz und Capability Checks
|
||
|
||
Jeder AJAX-Handler ohne Ausnahme:
|
||
|
||
```php
|
||
check_ajax_referer( 'brezngeo_admin', 'nonce' );
|
||
if ( ! current_user_can( 'manage_options' ) ) {
|
||
wp_send_json_error( 'Unauthorized', 403 );
|
||
}
|
||
```
|
||
|
||
Kein `wp_ajax_nopriv_`-Handler — alle Endpunkte erfordern `manage_options`.
|
||
|
||
### CSS-Sanitierung (GEO Block)
|
||
|
||
Das Custom-CSS-Feld des GEO-Blocks wird durch `Helpers\Css::sanitize_declarations()` bereinigt — entfernt Kommentare, geschweifte Klammern, At-Regeln (`@import`, `@media` usw.), `url()`, `expression()` und `javascript:`, bevor die Ausgabe über `wp_add_inline_style()` injiziert wird.
|
||
|
||
### Datenschutz (DSGVO)
|
||
|
||
CrawlerLog speichert IPs ausschließlich als SHA-256-Hash. Originalwert wird nie persistiert. Einträge nach 90 Tagen automatisch gelöscht.
|
||
|
||
---
|
||
|
||
## KI-Provider
|
||
|
||
| Provider | Klasse | API-Basis-URL |
|
||
|---|---|---|
|
||
| OpenAI | `OpenAIProvider` | `https://api.openai.com/v1/chat/completions` |
|
||
| Anthropic | `AnthropicProvider` | `https://api.anthropic.com/v1/messages` |
|
||
| Google Gemini | `GeminiProvider` | `https://generativelanguage.googleapis.com/...` |
|
||
| xAI Grok | `GrokProvider` | `https://api.x.ai/v1/chat/completions` |
|
||
|
||
Neuen Provider hinzufügen: `ProviderInterface` implementieren, in `Core.php` via `$registry->register()` eintragen — erscheint automatisch in allen Dropdowns.
|
||
|
||
---
|
||
|
||
## Hooks & Erweiterbarkeit
|
||
|
||
### `brezngeo_prompt` (Filter)
|
||
|
||
```php
|
||
add_filter( 'brezngeo_prompt', function( string $prompt, WP_Post $post ): string {
|
||
$keyword = get_post_meta( $post->ID, 'focus_keyword', true );
|
||
return $keyword ? $prompt . "\nFokus-Keyword: {$keyword}" : $prompt;
|
||
}, 10, 2 );
|
||
```
|
||
|
||
### `brezngeo_meta_saved` (Action)
|
||
|
||
```php
|
||
add_action( 'brezngeo_meta_saved', function( int $post_id, string $description ): void {
|
||
my_cdn_purge( get_permalink( $post_id ) );
|
||
}, 10, 2 );
|
||
```
|
||
|
||
---
|
||
|
||
## AJAX-Schnittstellen
|
||
|
||
Alle Endpunkte erfordern `manage_options` (kein `nopriv`).
|
||
|
||
| Action | Handler | Beschreibung |
|
||
|---|---|---|
|
||
| `brezngeo_regen_meta` | `MetaEditorBox::ajax_regen` | Meta-Beschreibung für einzelnen Post neu generieren |
|
||
| `brezngeo_test_connection` | `ProviderPage::ajax_test_connection` | API-Key und Verbindung testen |
|
||
| `brezngeo_get_default_prompt` | `ProviderPage::ajax_get_default_prompt` | Standard-Prompt zurücksetzen |
|
||
| `brezngeo_link_analysis` | `LinkAnalysis::ajax_analyse` | Link-Analyse ausführen |
|
||
| `brezngeo_link_suggestions` | `LinkSuggest::ajax_suggest` | Top-10 interne Link-Vorschläge für aktuellen Beitrag zurückgeben |
|
||
| `brezngeo_geo_generate` | `GeoEditorBox::ajax_generate` | GEO Block generieren |
|
||
| `brezngeo_geo_clear` | `GeoEditorBox::ajax_clear` | GEO Block löschen |
|
||
| `brezngeo_llms_clear_cache` | `TxtPage::ajax_clear_cache` | llms.txt Cache leeren |
|
||
| `brezngeo_dismiss_llms_notice` | `LlmsTxt::ajax_dismiss_notice` | Rank-Math-Hinweis ausblenden |
|
||
| `brezngeo_dismiss_welcome` | `AdminMenu::ajax_dismiss_welcome` | Welcome Notice per User ausblenden |
|
||
| `brezngeo_bulk_generate` | `MetaGenerator::ajaxBulkGenerate` | Nächsten Batch verarbeiten |
|
||
| `brezngeo_bulk_stats` | `MetaGenerator::ajaxBulkStats` | Fortschritt abrufen |
|
||
| `brezngeo_bulk_release` | `MetaGenerator::ajaxBulkRelease` | Mutex-Lock manuell freigeben |
|
||
| `brezngeo_bulk_status` | `MetaGenerator::ajaxBulkStatus` | Lock-Status prüfen |
|
||
| `brezngeo_keyword_analyze` | `KeywordMetaBox::ajax_analyze` | Keyword-Analyse für einen Post ausführen |
|
||
| `brezngeo_keyword_ai_suggest` | `KeywordMetaBox::ajax_ai_suggest` | KI-Keyword-Vorschläge |
|
||
| `brezngeo_keyword_ai_optimize` | `KeywordMetaBox::ajax_ai_optimize` | KI-Content-Optimierungstipps |
|
||
| `brezngeo_keyword_ai_semantic` | `KeywordMetaBox::ajax_ai_semantic` | KI-semantische Keyword-Analyse |
|
||
|
||
---
|
||
|
||
## Installation
|
||
|
||
**Via GitHub Release (empfohlen):**
|
||
1. `brezngeo.zip` vom [neuesten Release](https://github.com/noschmarrn/brezngeo/releases/latest) herunterladen
|
||
2. In WordPress unter *Plugins → Installieren → Plugin hochladen* einspielen
|
||
|
||
**Manuell (clone):**
|
||
```bash
|
||
cd /path/to/wordpress/wp-content/plugins/
|
||
git clone https://github.com/noschmarrn/brezngeo.git brezngeo
|
||
wp plugin activate brezngeo
|
||
```
|
||
|
||
**Nach der Aktivierung:**
|
||
1. *BreznGEO → AI Provider* — Provider wählen, API-Key hinterlegen, Verbindungstest
|
||
2. *Meta Generator* — Auto-Modus aktivieren, Post-Types auswählen
|
||
|
||
Kein JavaScript-Build-Step. Alle Assets unter `assets/` sind direkte JS/CSS-Dateien.
|
||
|
||
---
|
||
|
||
## Technischer Stack
|
||
|
||
| Komponente | Technologie |
|
||
|---|---|
|
||
| Backend | PHP 8.0+, WordPress Plugin API |
|
||
| Namespace | `BreznGEO\` |
|
||
| Architektur | Singleton-Core, Registry-Pattern (Provider), Feature-Klassen mit `register()` |
|
||
| Datenbank | WordPress Options API, `wpdb` (eigene Tabelle für CrawlerLog) |
|
||
| Caching | WordPress Transients |
|
||
| Frontend | Vanilla JS + jQuery (WordPress-integriert), kein Build-Step |
|
||
| I18n | `.pot`-File, Text-Domain `brezngeo` |
|
||
| Tests | PHPUnit (158 Tests, 301 Assertions) |
|
||
| Coding Standard | WordPress PHPCS |
|
||
| Lizenz | GPL-2.0-or-later |
|
||
|
||
---
|
||
|
||
## Lizenz
|
||
|
||
GPL-2.0-or-later — [https://www.gnu.org/licenses/gpl-2.0.html](https://www.gnu.org/licenses/gpl-2.0.html)
|
||
|
||
Copyright (c) 2025–2026 [Donau2Space](https://donau2space.de)
|