=== 2fox4 WP Blog Agent ===
Contributors: 2fox4oliver
Donate link: https://www.paypal.com/paypalme/oliverdeppe/5
Tags: blog, ai, content, seo, automation
Requires at least: 6.4
Tested up to: 6.7
Stable tag: 1.3.14
Requires PHP: 8.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

AI-powered blog content automation with topic research, SEO optimization, and WordPress publishing.

== Description ==

Von Oliver Deppe von [2FOX4](https://www.2fox4.de/automatischer-ki-wordpress-blog-agent/).

2fox4 WP Blog Agent automates your entire blog content workflow. It analyzes your existing posts, researches trending topics in your niche, writes fully formatted and SEO-optimized articles, and publishes them as WordPress drafts — ready for your review.

**Key Features:**

* **Topic Scout** — Analyzes existing posts and competitor blogs to suggest new topics with priority scoring
* **Blog Writer** — Creates complete, publish-ready articles following your configured format (headings, FAQ, CTAs, related posts)
* **SEO Integration** — Automatically fills RankMath, Yoast, or SEOPress meta fields (focus keyword, meta title, meta description)
* **Image Prompts** — Generates AI image prompts for featured images and illustrations
* **Scheduling** — Configure automatic content generation on specific days and times via WP-Cron
* **Fully Configurable** — Set your niche, brand voice, article structure, word count, CTA design, and more

**How It Works:**

1. Configure your blog settings (niche, brand, structure, SEO preferences)
2. Enter your Claude API key from Anthropic
3. Run the Topic Scout to get prioritized topic suggestions
4. Approve the topics you like
5. Let the Blog Writer create complete draft posts
6. Review and publish

== Installation ==

1. Upload the plugin folder to the `/wp-content/plugins/` directory, or install the plugin through the WordPress plugins screen directly.
2. Activate the plugin through the 'Plugins' screen in WordPress.
3. Go to 'Blog Agent' in the admin menu to configure your settings.
4. Enter your Claude API key (get one at https://console.anthropic.com).
5. Configure your niche, brand identity, and article structure.
6. Start generating topics and blog posts.

== Frequently Asked Questions ==

= Do I need an API key? =

Yes, you need a Claude API key from Anthropic (console.anthropic.com). The plugin uses the Claude AI to generate topics and write blog posts. API usage is billed by Anthropic based on token usage.

= Which SEO plugins are supported? =

RankMath, Yoast SEO, and SEOPress are fully supported. The plugin automatically fills the appropriate meta fields for your active SEO plugin.

= Can I customize the article format? =

Yes, everything is configurable: word count range, number of FAQ items, CTA text and color, number of related posts, table of contents, and more.

= Are posts published automatically? =

No, posts are always created as drafts. You review and publish them manually. This ensures quality control.

= Can I use this for any language? =

Yes, the plugin supports German, English, French, Spanish, and Italian. You can also choose between formal and informal address.

== Screenshots ==

1. Plugin settings page with branded header
2. Topic Scout results with priority scoring
3. Generated blog post draft in WordPress editor

== External services ==

This plugin connects to the Anthropic Claude API (api.anthropic.com) to generate blog topics, write articles, create SEO metadata, and generate image prompts. Data sent includes: your configured blog settings (niche, brand name, structure preferences) and existing post titles for context. The API key is stored locally in your WordPress database and transmitted securely via HTTPS.

* Service provider: Anthropic, PBC, 548 Market St, PMB 90375, San Francisco, CA 94104, USA
* [Anthropic Terms of Service](https://www.anthropic.com/terms)
* [Anthropic Privacy Policy](https://www.anthropic.com/privacy)

This plugin fetches competitor blog pages (if configured) using standard HTTP requests to analyze their content for topic gap analysis. Only publicly available page content (titles, headings) is read. No data is sent to any third party during this process.

This plugin displays an admin notice after 7 days that contains a link to the plugin's review page on WordPress.org (wordpress.org). No data is transmitted automatically. No connection to WordPress.org is made unless the site administrator clicks the link themselves.

* Service provider: Automattic Inc., 60 29th Street #343, San Francisco, CA 94110, USA
* [WordPress.org Privacy Policy](https://automattic.com/privacy/)

This plugin includes a voluntary donation link that points to PayPal (paypal.com). The link is displayed on the plugin settings page and does not transmit any data automatically. No connection to PayPal is made unless the site administrator clicks the link themselves.

* Service provider: PayPal (Europe) S.a r.l. et Cie, S.C.A.
* [PayPal Terms of Service](https://www.paypal.com/de/webapps/mpp/ua/useragreement-full)
* [PayPal Privacy Policy](https://www.paypal.com/de/webapps/mpp/ua/privacy-full)

== Changelog ==

= 1.3.14 =
* New: Vorschau-Modal direkt nach dem Schreiben eines Beitrags. Du kannst den fertigen Artikel (Titel, Beitragsbild, Fließtext) lesen bevor du in den WordPress-Editor gehst.
* New: Eingabemaske für Änderungswünsche im Vorschau-Modal. Beschreibe in natürlicher Sprache, was geändert werden soll ("Einleitung lockerer", "FAQ kürzen", "Abschnitt XY hinzufügen") — Claude überarbeitet den Artikel direkt. Kann beliebig oft wiederholt werden.
* New: Neue AJAX-Endpunkte `wbag_preview_post` und `wbag_revise_post`. Der Revisions-Endpunkt berücksichtigt das gespeicherte Fokus-Keyword und erhält HTML-Struktur, Länge und Stil.
* New: Revisions-Zähler als Post-Meta (`_wbag_revision_count`, `_wbag_last_revision_at`) zur Diagnose.
* UX: Das Vorschau-Modal öffnet sich automatisch nach erfolgreichem Schreiben. Keyboard-Shortcut Ctrl/Cmd+Enter zum Abschicken einer Überarbeitung, ESC zum Schließen.
* UX: In den Erfolgs-Karten gibt es einen neuen Primary-Button "Vorschau & überarbeiten" zusätzlich zu den bisherigen "Beitrag ansehen" / "Im Editor öffnen"-Buttons.

= 1.3.13 =
* Update: Plugin-URI und Autor-URI zeigen jetzt auf die neue Homepage https://www.2fox4.de/automatischer-ki-wordpress-blog-agent/.

= 1.3.12 =
* UX: Nur noch der per Radio-Button ausgewählte Stilvorlagen-Slot wird als Textarea angezeigt. Wechselst du die aktive Variante, wird automatisch der passende Slot eingeblendet und die anderen ausgeblendet. Deutlich übersichtlicher als alle vier Slots untereinander.

= 1.3.11 =
* New: Vier Stilvorlagen-Slots statt nur einer. Neben der automatisch erkannten Stilvorlage (`reference_style`) gibt es jetzt drei weitere frei editierbare Slots (`custom_style_1`, `custom_style_2`, `custom_style_3`) — jeweils mit eigenem Namen.
* New: Radio-Auswahl "Aktive Stilvorlage für den Blog Writer" zur Umschaltung zwischen den vier Varianten. Ideal für A/B/C/D-Tests verschiedener Schreibstile.
* New: Live-Highlight der aktiven Stilvorlage und Live-Synchronisation der Slot-Namen mit den Auswahl-Chips per JS.
* New: Helper `resolve_active_style()` — wählt beim Generieren automatisch die aktive Variante, mit Fallback auf die erkannte Stilvorlage, falls der ausgewählte Slot leer ist.

= 1.3.10 =
* Bugfix: Die erkannte (oder manuell eingegebene) Stilvorlage (`reference_style`) sowie alle anderen Einstellungen bleiben jetzt zuverlässig erhalten, auch wenn beim Speichern einzelne Felder aus irgendeinem Grund nicht im POST-Request enthalten sind (z. B. nach einem Plugin-Update, bei Größen-Limits oder geänderten Form-Strukturen). Der Sanitize-Callback startet jetzt vom bereits gespeicherten Optionswert und überschreibt nur explizit übermittelte Felder.
* Improvement: Checkbox-Felder (`include_toc`, `schedule_enabled`) und die Schedule-Tage werden weiterhin korrekt auf "aus" bzw. leer gesetzt, wenn sie deaktiviert werden — der defensive Merge ist diese Sonderfälle sauber.

= 1.3.9 =
* Improvement: Interne Link-Kandidaten werden jetzt topic-aware ausgewählt statt nur die aktuellsten Beiträge zu verwenden. Drei-Strategien-Ansatz: (1) Keyword-Suche per `WP_Query` mit dem Fokus-Keyword in Titel und Content, (2) Titel-basierte Suche mit den ersten Wörtern des neuen Themas, (3) gleiche Kategorie (falls konfiguriert), (4) Fallback auf aktuelle Beiträge.
* Improvement: Jeder Kandidat wird mit einem Relevanz-Hinweis (Keyword-Match / Titel-Match / Gleiche Kategorie / Aktuell) an Claude übergeben, damit thematisch passende Beiträge bevorzugt verlinkt werden.
* Improvement: Claude wird im Prompt explizit angewiesen, bevorzugt Keyword- und Titel-Matches zu verlinken und thematisch unpassende Kandidaten zu überspringen.
* Improvement: Kandidatenzahl von 8 auf 12 erhöht, damit Claude eine bessere Auswahl hat.
* New: Neue Helper-Signatur `get_internal_link_candidates( $topic, $settings, $exclude_id, $limit )` mit interner Dedupe-Logik.

= 1.3.8 =
* UX: Vereinfachter Flow für die Themen-Warteschlange. Jedes Thema hat jetzt direkt einen „Beitrag schreiben"-Button — der zusätzliche „Genehmigen"-Zwischenschritt entfällt komplett.
* UX: Der globale „Beitrag schreiben"-Button oben wurde entfernt. Er war redundant, seit Beiträge pro Thema geschrieben werden können.
* UX: Der Bereich „Genehmigte Themen" entfällt ebenfalls — es gibt nur noch eine Warteschlange, direkt bearbeitbar.
* New: `ajax_run_blog_writer` akzeptiert jetzt einen optionalen `topic_index`-Parameter und schreibt gezielt dieses Thema aus der Warteschlange. Der alte Flow (nächstes approved-Topic) bleibt als Fallback kompatibel.
* UX: Während des Schreibens wird das jeweilige Queue-Item in-place durch den Progress-Widget ersetzt, danach kurz die Erfolgsmeldung, und dann sauber aus der Liste entfernt.

= 1.3.7 =
* Fix: Bereits genehmigte Themen tauchten nach dem Schreiben weiterhin in der Warteschlange auf, weil die JS den dimmed-Eintrag nicht aus dem DOM entfernt hat. Nach „Genehmigen" wird der Eintrag jetzt sauber aus der Warteschlange entfernt.
* Fix: Die `data-index`-Attribute der verbleibenden Themen werden nach Genehmigen/Löschen im Frontend neu gesetzt, damit sie mit dem reindexierten Backend-Array übereinstimmen. Das verhindert, dass spätere Aktionen auf das falsche Thema wirken.
* New: Neuer Bereich „Genehmigte Themen (warten auf Beitragserstellung)" über der Warteschlange — listet alle bereits genehmigten, aber noch nicht geschriebenen Themen mit Anzahl-Badge und Entfernen-Button.
* New: Neuer AJAX-Handler `wbag_remove_approved_topic`, um genehmigte Themen wieder zu entfernen (falls man den Plan ändert).
* Improvement: CSS für den neuen Bereich in grüner Akzentfarbe (passend zum Status „genehmigt").

= 1.3.6 =
* Fix: RankMath-Warnung „URL ist zu lang" behoben — der Post-Slug wird jetzt hart auf maximal 45 Zeichen gekürzt und basiert primär auf dem Fokus-Keyword (nicht mehr auf Keyword+Titel).
* Fix: RankMath-Warnung „Keine internen Links im Inhalt gefunden" behoben — der Blog-Writer bekommt jetzt bis zu 8 bereits veröffentlichte Beiträge als Vorschlag für interne Verlinkung und wird per Prompt angewiesen, 2–4 davon als natürliche, thematisch passende Links in den Fließtext einzubauen (dofollow, beschreibende Ankertexte).
* Improvement: Neue Helper-Methode `get_internal_link_candidates()` fragt die aktuellsten veröffentlichten Beiträge ab und übergibt sie strukturiert an Claude.

= 1.3.5 =
* Fix: RankMath SEO-Fehler „Fokus-Schlüsselwort nicht in URL / nicht am Anfang des Inhalts / nicht im Inhalt" behoben.
* New: Fokus-Keyword wird jetzt VOR der Beitragserstellung bestimmt und als harte Pflicht-Regel in den Blog-Writer-Prompt eingebaut (wörtlich in H1, erstem Satz, mindestens einer H2, 4–8 Mal im Fließtext).
* New: Nach der Beitragserstellung wird der Post-Slug automatisch so angepasst, dass er das Fokus-Keyword enthält — auch dann, wenn WordPress den Slug aus dem Titel ableitet.
* Improvement: `generate_seo_metadata_for_post` behandelt das übergebene Hint-Keyword jetzt als fest vorgegeben (nicht mehr als optionalen Vorschlag), sodass focus_keyword, SEO-Titel und Meta-Description garantiert dasselbe Keyword verwenden.
* Improvement: Neue Helper-Methoden `determine_focus_keyword()` und `ensure_keyword_in_slug()` für saubere, wiederverwendbare Keyword-Behandlung.

= 1.3.4 =
* Fix: Die Buttons „Themen finden" und „Beitrag schreiben" reagierten nach dem Laden nicht — der JS-Selektor `.wbag-action-button` passte nicht auf die tatsächliche HTML-Klasse `wbag-action-btn`. Selektor korrigiert und auf `data-action` eingeschränkt, damit der Custom-Topic-Button nicht mitgefangen wird.

= 1.3.3 =
* New: Animierter Fortschrittsbalken mit Phasenanzeige während der Beitragserstellung — der Nutzer sieht jederzeit, was gerade passiert.
* New: Phasen-Statusmeldungen: „Blog-Text wird geschrieben" → „SEO-Metadaten werden analysiert" → „Bilder werden erstellt".
* New: Live-Zeitanzeige (verstrichene Zeit) und Prozentanzeige mit sanftem Easing.
* New: Abschlusszustand (grün) und Fehlerzustand (rot) als visuelles Feedback.
* Improvement: Hinweis auf Affiliate-Link-Integration wird während der Verarbeitung angezeigt.
* Improvement: JS-Widget `wbagStartProgress` als wiederverwendbarer Helper.

= 1.3.2 =
* New: Automatische SEO-Metadaten — nach der Beitragserstellung wird der fertige Text analysiert und das Hauptkeyword ermittelt.
* New: Automatisch generierter SEO-Titel (50–60 Zeichen, klickstark) und Meta-Beschreibung (140–160 Zeichen).
* New: Die Werte werden automatisch in RankMath, Yoast SEO oder SEOPress eingetragen — passend zum im API-Tab gewählten SEO-Plugin.
* New: Automatischer Fallback auf ein aktives SEO-Plugin, falls das konfigurierte Plugin nicht installiert ist.
* Improvement: SEO-Metadaten werden zusätzlich als `_wbag_seo_*` Post-Meta gespeichert (Debug/Referenz).
* Fix: Fehlendes drittes Argument beim Aufruf `WBAG_RankMath::set_seo_meta()` im Blog-Writer-Runner ergänzt.

= 1.3.1 =
* Improvement: Removed the "Markenname" and "Markenschlagzeile" fields from the Identität tab — blog posts are typically written neutrally about a topic and brand framing was not needed.
* Improvement: Simplified Blog Writer prompt and image SEO prompt by removing brand name context.
* Improvement: Cleaned up default option values and sanitizer to match the streamlined Identität settings.

= 1.3.0 =
* New: Custom topic — manually enter a blog topic instead of using Topic Scout.
* New: Affiliate links — add product links with labels that are naturally embedded in the generated blog post.
* New: Automatic transparency disclosure appended to posts containing affiliate links.
* New: Affiliate link data stored as post meta (`_wbag_affiliate_links`) for future reference.
* New: Repeater UI for adding/removing multiple affiliate links with live validation.

= 1.2.0 =
* New: Modernized admin settings page with dark gradient header, radial accent glow, and cleaner layout.
* New: Tab navigation now includes Dashicons for better visual orientation.
* New: Action cards (Topic Scout & Blog Writer) redesigned with icon badges and colored borders.
* Improvement: Donate section reworded to softer German localization ("Gefällt Ihnen das Plugin? Unterstützen Sie die Weiterentwicklung!").
* Improvement: Donate button styled as subtle heart-icon button instead of aggressive call-to-action.
* Improvement: Version badge now reads from WBAG_VERSION constant instead of hardcoded value.
* Fix: Header title color explicitly set to white for WordPress admin compatibility.

= 1.1.0 =
* New: Context-aware image prompts — Claude analyzes the specific blog section where each image will be placed and generates a tailored image prompt, resulting in images that match the surrounding content.
* New: Strengthened anti-text instructions in all image prompts to prevent text/typography artifacts in generated images.
* New: SEO metadata generation now includes section context for more accurate alt texts, captions, and descriptions.
* New: Helper method to extract H2 section text for targeted prompt generation.
* Fix: Changed PREG_OFFSET_SET to PREG_OFFSET_CAPTURE — resolved HTTP 500 errors during image insertion into post content.
* Fix: Improved alt text fallback logic to prevent empty strings.
* Improvement: Aggressive memory management for Imagen 4 base64 payloads (unset, gc_collect_cycles).
* Improvement: Shutdown handler catches fatal errors and returns partial JSON response.

= 1.0.0 =
* Initial release.

== Upgrade Notice ==

= 1.3.14 =
Neu: Vorschau-Modal mit KI-Überarbeitungs-Eingabe. Artikel vor dem Editor prüfen und gezielt ändern lassen.

= 1.3.12 =
Übersichtlichere Stilvorlagen-Auswahl: Nur noch die aktive Variante ist sichtbar, Slot-Wechsel per Radio-Button.

= 1.3.11 =
Vier Stilvorlagen-Slots: erkannte Vorlage + drei eigene Varianten, live umschaltbar. Perfekt für A/B/C/D-Tests verschiedener Schreibstile.

= 1.3.10 =
Wichtiger Bugfix: Die Stilvorlage und andere Einstellungen können beim Speichern nicht mehr versehentlich verloren gehen. Update empfohlen.

= 1.3.9 =
Interne Link-Kandidaten werden jetzt thematisch passend ausgewählt (Keyword- und Titel-Match, gleiche Kategorie), nicht mehr nur nach Datum. Claude verlinkt dadurch zuverlässig die relevantesten bestehenden Beiträge.

= 1.3.8 =
Vereinfachter Workflow: Jedes Thema in der Warteschlange hat jetzt einen direkten „Beitrag schreiben"-Button. Der zweistufige Genehmigen-Schritt entfällt.

= 1.3.7 =
Behebt den Bug, dass genehmigte und bereits geschriebene Themen weiterhin in der Warteschlange auftauchten. Zeigt genehmigte Themen jetzt in einem eigenen Bereich.

= 1.3.6 =
Behebt zwei weitere RankMath-Warnungen: zu lange URL und fehlende interne Links. Slugs werden jetzt kurz und keyword-fokussiert, und der Blog-Writer baut automatisch interne Links zu bestehenden Beiträgen ein.

= 1.3.5 =
Wichtiger SEO-Fix: RankMath-Fehler „Fokus-Schlüsselwort nicht gefunden" in URL, am Anfang des Inhalts und im Inhalt wird behoben. Keyword-Platzierung ist jetzt garantiert.

= 1.3.4 =
Wichtiger Fix: Die Buttons „Themen finden" und „Beitrag schreiben" hatten keine Funktion — jetzt behoben.

= 1.3.3 =
Animierter Fortschrittsbalken mit Phasenanzeige und Live-Zeitmessung während der Beitragserstellung.

= 1.3.2 =
Automatisches Hauptkeyword, SEO-Titel und Meta-Beschreibung — direkt in RankMath, Yoast oder SEOPress eingetragen.

= 1.3.1 =
Simplified Identität settings — removed unused Markenname and Markenschlagzeile fields.

= 1.3.0 =
Custom topic input with affiliate link support and automatic transparency disclosure.

= 1.2.0 =
Modernized admin UI with Dashicons, redesigned action cards, and softer German-localized donate section.

= 1.1.0 =
Context-aware image generation — images now match the blog section they illustrate.

= 1.0.0 =
Initial release.
