{"id":171,"date":"2026-01-21T07:21:45","date_gmt":"2026-01-21T06:21:45","guid":{"rendered":"https:\/\/helloblog.io\/de\/wordfence-wp-cli-abilities-api\/"},"modified":"2026-01-21T07:36:10","modified_gmt":"2026-01-21T06:36:10","slug":"wordfence-wp-cli-abilities-api","status":"publish","type":"post","link":"https:\/\/helloblog.io\/de\/wordfence-wp-cli-abilities-api\/","title":{"rendered":"Wordfence per Terminal steuern: WP-CLI-Commands plus Abilities API (WordPress 6.9)"},"content":{"rendered":"\n<p>Wer mehrere WordPress-Instanzen betreibt oder ohnehin lieber im Terminal arbeitet, kennt das Problem: Security-Workflows laufen oft im Admin-UI zusammen. Mit einem neuen Open-Source-Plugin \u00e4ndert sich das f\u00fcr Wordfence deutlich: Es erg\u00e4nzt Wordfence Security um eine WP-CLI-Command-Suite (<code>wp wfsec<\/code>) und implementiert gleichzeitig eine der ersten Integrationen f\u00fcr die neue <strong>WordPress Abilities API<\/strong> aus WordPress 6.9.<\/p>\n\n\n\n<p>Der praktische Effekt: Du kannst Wordfence-Scans ansto\u00dfen, den Status verfolgen, Firewall-\/WAF-Optionen (Web Application Firewall) schalten, IPs blocken und Findings verwalten \u2013 komplett skriptbar. Und \u00fcber die Abilities API wird das Ganze zus\u00e4tzlich \u00fcber eine standardisierte, von Tools (inkl. AI Agents) entdeckbare Schnittstelle zug\u00e4nglich.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was das Plugin konkret liefert<\/h2>\n\n\n\n<p>Das Plugin erweitert WP-CLI um den Namespace <strong><code>wfsec<\/code><\/strong>. Dar\u00fcber stehen zentrale Wordfence-Funktionen als Terminal-Kommandos bereit \u2013 ideal f\u00fcr Admins, SRE\/DevOps-nahe Workflows, Cronjobs und Automatisierung.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1) Security Scanning<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Quick- oder Full-Malware-Scans starten<\/li>\n\n\n<li>Scan-Fortschritt in Echtzeit \u00fcberwachen<\/li>\n\n\n<li>Scan-Historie und detaillierte Logs ausgeben<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2) Firewall-Management<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>IP-Adressen blockieren oder entblocken<\/li>\n\n\n<li>Block-Dauer und Begr\u00fcndung setzen<\/li>\n\n\n<li>Pr\u00fcfen, ob eine bestimmte IP geblockt ist<\/li>\n\n\n<li>WAF-Schutz aktivieren oder deaktivieren<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3) Issue Tracking (Funde\/Threats verwalten)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Alle erkannten Security-Issues listen<\/li>\n\n\n<li>Nach Status filtern (new, ignored, resolved)<\/li>\n\n\n<li>Einzelne Threats l\u00f6schen oder gezielt verwalten<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4) Konfiguration &#038; Lizenz<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Wordfence-Settings lesen und setzen<\/li>\n\n\n<li>Lizenzstatus pr\u00fcfen<\/li>\n\n\n<li>Konfiguration exportieren und importieren<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Schnelleinstieg: typische WP-CLI-Aufrufe<\/h2>\n\n\n\n<p>Ein paar Beispiele, wie sich das im Alltag anf\u00fchlt (z. B. auf einem Maintenance-Host, in CI oder einfach lokal via SSH):<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly># Overall-Status von Wordfence\nwp wfsec status\n\n# Full Scan starten\nwp wfsec scan start --type=full\n\n# Scan-Fortschritt beobachten\nwp wfsec scan status\n\n# Alle Issues ausgeben\nwp wfsec issues ls --status=all\n\n# IP f\u00fcr 24h blocken (86400 Sekunden)\nwp wfsec firewall block 192.168.1.100 --duration=86400 --reason=&quot;Brute force attempt&quot;\n\n# Lizenzstatus pr\u00fcfen\nwp wfsec license status\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#6A737D\"># Overall-Status von Wordfence<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">wp<\/span><span style=\"color:#9ECBFF\"> wfsec<\/span><span style=\"color:#9ECBFF\"> status<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\"># Full Scan starten<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">wp<\/span><span style=\"color:#9ECBFF\"> wfsec<\/span><span style=\"color:#9ECBFF\"> scan<\/span><span style=\"color:#9ECBFF\"> start<\/span><span style=\"color:#79B8FF\"> --type=full<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\"># Scan-Fortschritt beobachten<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">wp<\/span><span style=\"color:#9ECBFF\"> wfsec<\/span><span style=\"color:#9ECBFF\"> scan<\/span><span style=\"color:#9ECBFF\"> status<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\"># Alle Issues ausgeben<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">wp<\/span><span style=\"color:#9ECBFF\"> wfsec<\/span><span style=\"color:#9ECBFF\"> issues<\/span><span style=\"color:#9ECBFF\"> ls<\/span><span style=\"color:#79B8FF\"> --status=all<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\"># IP f\u00fcr 24h blocken (86400 Sekunden)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">wp<\/span><span style=\"color:#9ECBFF\"> wfsec<\/span><span style=\"color:#9ECBFF\"> firewall<\/span><span style=\"color:#9ECBFF\"> block<\/span><span style=\"color:#79B8FF\"> 192.168.1.100<\/span><span style=\"color:#79B8FF\"> --duration=86400<\/span><span style=\"color:#79B8FF\"> --reason=<\/span><span style=\"color:#9ECBFF\">\"Brute force attempt\"<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\"># Lizenzstatus pr\u00fcfen<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">wp<\/span><span style=\"color:#9ECBFF\"> wfsec<\/span><span style=\"color:#9ECBFF\"> license<\/span><span style=\"color:#9ECBFF\"> status<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>F\u00fcr Scripting und Automatisierung wichtig: <strong>Alle Commands unterst\u00fctzen <code>--format=json<\/code><\/strong>. Damit kannst du Ausgaben stabil parsen und in eigene Tools, Pipelines oder Monitoring-Checks einspeisen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Abilities API in WordPress 6.9: warum das hier der eigentliche Gamechanger ist<\/h2>\n\n\n\n<p>Neben WP-CLI ist das Plugin spannend, weil es die <strong>WordPress Abilities API<\/strong> implementiert. Diese Schnittstelle wurde mit WordPress 6.9 als standardisierte M\u00f6glichkeit eingef\u00fchrt, WordPress-Funktionalit\u00e4t f\u00fcr Automatisierungstools und <strong>AI Agents<\/strong> (Agenten, die Aufgaben anhand von Tools\/APIs selbstst\u00e4ndig ausf\u00fchren) <strong>auffindbar und nutzbar<\/strong> zu machen.<\/p>\n\n\n\n<p>Statt individueller, plugin-spezifischer Integrationen setzt die Abilities API auf eine <strong>self-describing<\/strong> und <strong>schema-validierte<\/strong> Beschreibung von F\u00e4higkeiten. Tools k\u00f6nnen damit programmgesteuert erkennen, welche Aktionen verf\u00fcgbar sind und wie sie korrekt aufzurufen sind \u2013 ohne dass du f\u00fcr jedes Plugin eine eigene Custom-Integration bauen musst.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Diese 7 \u201eAbilities\u201c stellt das Plugin bereit<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>scan-status<\/strong> \u2013 aktuellen Scan-Status und Fortschritt abfragen<\/li>\n\n\n<li><strong>scan-start<\/strong> \u2013 Security-Scans programmatisch starten<\/li>\n\n\n<li><strong>issues-list<\/strong> \u2013 erkannte Security-Issues abrufen<\/li>\n\n\n<li><strong>issues-count<\/strong> \u2013 Issue-Anzahlen nach Severity liefern<\/li>\n\n\n<li><strong>firewall-status<\/strong> \u2013 WAF-Status pr\u00fcfen<\/li>\n\n\n<li><strong>firewall-block<\/strong> \u2013 IPs \u00fcber API blockieren<\/li>\n\n\n<li><strong>license-status<\/strong> \u2013 Lizenzinformationen abfragen<\/li>\n\n<\/ul>\n\n\n\n<p>Damit wird Wordfence z. B. in folgenden Szenarien deutlich einfacher integrierbar: AI-gest\u00fctztes Security-Monitoring, eigene Admin-\/Ops-Dashboards, automatisierte Routine-Checks (z. B. t\u00e4glicher Scan-Status + Issue-Counts) oder standardisierte Workflows, die IP-Blocks nach bestimmten Signalen setzen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Auth: Application Passwords via Basic Auth<\/h3>\n\n\n\n<p>Die Authentifizierung erfolgt \u00fcber <strong>WordPress Application Passwords<\/strong> (Anwendungs-Passw\u00f6rter) per <strong>Basic Auth<\/strong>. Das ist besonders relevant f\u00fcr Automations-Setups, bei denen ein externer Dienst oder Agent gezielt und nachvollziehbar mit minimalen Rechten zugreifen soll.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Voraussetzungen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>WordPress <strong>6.9+<\/strong><\/li>\n\n\n<li>PHP <strong>8.0+<\/strong><\/li>\n\n\n<li>WP-CLI <strong>2.5+<\/strong><\/li>\n\n\n<li>Wordfence Security Plugin (Free oder Premium)<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Installation &#038; Download<\/h2>\n\n\n\n<p>Du kannst die aktuelle Version als ZIP herunterladen und in dein <code>\/wp-content\/plugins\/<\/code>-Verzeichnis hochladen:<\/p>\n\n\n<a href=\"https:\/\/github.com\/trueqap\/wpcli-for-wordfence\/releases\/download\/v1.0.0\/wpcli-for-wordfence-1.0.0.zip\" class=\"download-card\" download>\n                <span class=\"download-icon\"><i class=\"fa-duotone fa-file-zipper\"><\/i><\/span>\n                <span class=\"download-info\">\n                    <span class=\"download-title\">Download WP CLI for Wordfence v1.0.0<\/span>\n                    <span class=\"download-meta\"><span class=\"download-filename\">wpcli-for-wordfence-1.0.0.zip<\/span><\/span>\n                <\/span>\n                <span class=\"download-action\"><i class=\"fa-duotone fa-arrow-down-to-line\"><\/i><\/span>\n            <\/a>\n\n\n<p>Alternativ ist laut Projekt auch eine Installation via Composer m\u00f6glich, wenn du ein Bedrock-\u00e4hnliches Setup nutzt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einordnung f\u00fcr den Betrieb: wann sich das besonders lohnt<\/h2>\n\n\n\n<p>Wenn du viele Sites betreibst, ist der Mehrwert schnell sp\u00fcrbar: WP-CLI macht Wordfence-Operationen wiederholbar, testbar und in vorhandene Admin-Prozesse integrierbar (Deployments, Wartungsfenster, Incident Response). Die Abilities-API-Schicht legt zus\u00e4tzlich eine standardisierte Automations-Spur dar\u00fcber \u2013 interessant, sobald du Security-Tasks nicht nur \u201eausf\u00fchren\u201c, sondern auch <strong>systematisch orchestrieren<\/strong> willst (Agenten, Runbooks, zentrale Dashboards).<\/p>\n\n\n\n<p>Wichtig ist dabei vor allem die Kombi aus <code>--format=json<\/code> (f\u00fcr robuste Automations-Outputs) und der Abilities API (f\u00fcr Tool-Discovery und standardisierte Interaktion).<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Referenzen \/ Quellen<\/h2>\n                <ul class=\"references-list\"><li><a href=\"https:\/\/github.com\/trueqap\/wpcli-for-wordfence\" target=\"_blank\" rel=\"noopener noreferrer\">WP-CLI &amp; Abilities API for Wordfence: Manage Security from Terminal and AI Agents<\/a><\/li><li><a href=\"https:\/\/github.com\/trueqap\/wpcli-for-wordfence\/releases\/download\/v1.0.0\/wpcli-for-wordfence-1.0.0.zip\" target=\"_blank\" rel=\"noopener noreferrer\">Download WP CLI for Wordfence v1.0.0<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Wordfence-Scans, Firewall-Regeln und Funde verwalten, ohne ins Dashboard zu klicken: Ein neues Open-Source-Plugin bringt `wp wfsec` in WP-CLI \u2013 und \u00f6ffnet Wordfence \u00fcber die Abilities API sogar f\u00fcr Automatisierung und AI Agents.<\/p>\n","protected":false},"author":9,"featured_media":172,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[45],"tags":[81,11,15,10,7],"class_list":["post-171","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-okosystem","tag-abilities-api","tag-security","tag-wordfence","tag-wordpress","tag-wp-cli"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/posts\/171","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/comments?post=171"}],"version-history":[{"count":1,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/posts\/171\/revisions"}],"predecessor-version":[{"id":173,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/posts\/171\/revisions\/173"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/media\/172"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/media?parent=171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/categories?post=171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/tags?post=171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}