{"id":165,"date":"2026-01-21T07:21:30","date_gmt":"2026-01-21T06:21:30","guid":{"rendered":"https:\/\/helloblog.io\/sv\/wp-cli-wordfence-abilities-api\/"},"modified":"2026-01-21T07:37:08","modified_gmt":"2026-01-21T06:37:08","slug":"wp-cli-wordfence-abilities-api","status":"publish","type":"post","link":"https:\/\/helloblog.io\/sv\/wp-cli-wordfence-abilities-api\/","title":{"rendered":"WP-CLI-st\u00f6d f\u00f6r Wordfence + Abilities API i WordPress 6.9: s\u00e4kerhetsjobb direkt fr\u00e5n terminalen (och f\u00f6r AI-agenter)"},"content":{"rendered":"\n<p>Att sk\u00f6ta Wordfence via wp-admin funkar, men om du driftar flera WordPress-sajter (eller bara f\u00f6redrar terminalen) blir det snabbt mycket klickande. Ett nytt open source-plugin, <strong>WP-CLI &#038; Abilities API for Wordfence<\/strong>, tar ett rej\u00e4lt steg mot ett mer automatiserbart arbetsfl\u00f6de: det ger Wordfence ett eget kommandonamnrymd i WP-CLI och implementerar dessutom den nya <strong>WordPress Abilities API<\/strong> som introduceras i <strong>WordPress 6.9<\/strong>.<\/p>\n\n\n\n<p>Det praktiska v\u00e4rdet \u00e4r dubbelt: du kan k\u00f6ra skanningar, hantera WAF-regler och f\u00f6lja upp hot utan att g\u00e5 in i admin. Och via Abilities API blir samma funktioner uppt\u00e4ckbara och k\u00f6rbara av automationverktyg och AI-agenter genom ett standardiserat, sj\u00e4lvdokumenterande gr\u00e4nssnitt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vad pluginet faktiskt l\u00e4gger till<\/h2>\n\n\n\n<p>Efter installation f\u00e5r du ett nytt <code>wp wfsec<\/code>-namespace i <strong>WP-CLI<\/strong> (kommandoradsverktyget f\u00f6r WordPress). Tanken \u00e4r att du ska kunna g\u00f6ra typiska Wordfence-\u00e5tg\u00e4rder som en del av drift\/CI-skript, cron-jobb eller bara som ett snabbt terminalkommando n\u00e4r n\u00e5got ser misst\u00e4nkt ut.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Security scanning (skanning av sajten)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Starta snabb eller full malware-scan<\/li>\n\n\n<li>F\u00f6lja skanningsprogress i realtid<\/li>\n\n\n<li>Titta p\u00e5 scan-historik och detaljerade loggar<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Firewall management (WAF och IP-blockar)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Blockera eller avblockera IP-adresser<\/li>\n\n\n<li>S\u00e4tta blocktid (duration) och ange anledning (reason)<\/li>\n\n\n<li>Kontrollera om en specifik IP redan \u00e4r blockerad<\/li>\n\n\n<li>Sl\u00e5 p\u00e5 eller av WAF-skyddet<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Issue tracking (hittade problem\/hot)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Lista alla uppt\u00e4ckta s\u00e4kerhetsissues<\/li>\n\n\n<li>Filtrera p\u00e5 status (new, ignored, resolved)<\/li>\n\n\n<li>Ta bort eller hantera enskilda hot<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Configuration (inst\u00e4llningar och licens)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>H\u00e4mta och s\u00e4tta Wordfence-inst\u00e4llningar<\/li>\n\n\n<li>Kontrollera licensstatus<\/li>\n\n\n<li>Exportera och importera konfiguration<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Snabba exempel: <code>wp wfsec<\/code> i praktiken<\/h2>\n\n\n\n<p>H\u00e4r \u00e4r ett g\u00e4ng kommandon som visar hur arbetsfl\u00f6det ser ut. Det \u00e4r samma typ av operationer man annars g\u00f6r i Wordfence-UI \u2013 men skriptbart och l\u00e4tt att k\u00f6ra mot flera milj\u00f6er.<\/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># Check overall Wordfence status\nwp wfsec status\n\n# Start a full security scan\nwp wfsec scan start --type=full\n\n# Watch scan progress\nwp wfsec scan status\n\n# List all security issues\nwp wfsec issues ls --status=all\n\n# Block an IP address for 24 hours\nwp wfsec firewall block 192.168.1.100 --duration=86400 --reason=&quot;Brute force attempt&quot;\n\n# Check license status\nwp wfsec license status\n\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\"># Check overall Wordfence status<\/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\"># Start a full security scan<\/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\"># Watch scan progress<\/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\"># List all security issues<\/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\"># Block an IP address for 24 hours<\/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\"># Check license status<\/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>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>En detalj som g\u00f6r stor skillnad i automation \u00e4r att kommandona st\u00f6djer <code>--format=json<\/code>. Det g\u00f6r det enklare att parsa output i shell-skript, CI eller \u00f6vervakningsjobb (t.ex. f\u00f6r att trigga alerts n\u00e4r en scan hittar nya issues).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Det nya: WordPress Abilities API (WordPress 6.9) + Wordfence<\/h2>\n\n\n\n<p>Det mest intressanta i pluginet \u00e4r att det \u00e4r bland de tidiga implementationerna av <strong>WordPress Abilities API<\/strong> i WordPress 6.9. Med \u201cabilities\u201d menas i praktiken ett standardiserat s\u00e4tt f\u00f6r WordPress att beskriva och exponera funktionalitet s\u00e5 att externa verktyg (inklusive AI-agenter) kan <em>uppt\u00e4cka<\/em> vad som g\u00e5r att g\u00f6ra och <em>hur<\/em> det ska anropas \u2013 utan att du skriver specialintegration f\u00f6r varje plugin.<\/p>\n\n\n\n<p>I st\u00e4llet f\u00f6r att din agent\/automation m\u00e5ste k\u00e4nna till pluginets interna endpoints och payloads, kan den arbeta mot en <strong>sj\u00e4lvbeskrivande och schema-validerad<\/strong> yta d\u00e4r abilities g\u00e5r att lista och anropa p\u00e5 ett mer enhetligt s\u00e4tt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">De 7 abilities som exponeras<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>scan-status<\/strong> \u2013 h\u00e4mta aktuell scan-state och progress<\/li>\n\n\n<li><strong>scan-start<\/strong> \u2013 starta security scans programmatiskt<\/li>\n\n\n<li><strong>issues-list<\/strong> \u2013 h\u00e4mta uppt\u00e4ckta security issues<\/li>\n\n\n<li><strong>issues-count<\/strong> \u2013 h\u00e4mta antal issues per severity<\/li>\n\n\n<li><strong>firewall-status<\/strong> \u2013 kontrollera WAF-l\u00e4ge\/state<\/li>\n\n\n<li><strong>firewall-block<\/strong> \u2013 blockera IP via API<\/li>\n\n\n<li><strong>license-status<\/strong> \u2013 h\u00e4mta licensinformation<\/li>\n\n<\/ul>\n\n\n\n<p>Det h\u00e4r \u00f6ppnar upp f\u00f6r ganska konkreta use cases: AI-baserad s\u00e4kerhetsmonitorering, egna dashboards som sammanst\u00e4ller Wordfence-data, eller automation som k\u00f6r rutinchecks och vidtar enkla \u00e5tg\u00e4rder (som att blockera IP:n som just f\u00f6rs\u00f6kt en brute force-serie).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Autentisering<\/h3>\n\n\n\n<p>Autentisering sker med <strong>WordPress Application Passwords<\/strong> via <strong>Basic Auth<\/strong>. Application Passwords \u00e4r WordPress inbyggda mekanism f\u00f6r att skapa separata inloggningsuppgifter f\u00f6r integrationer, vilket \u00e4r praktiskt n\u00e4r du vill ge en agent\/ett verktyg begr\u00e4nsad \u00e5tkomst utan att anv\u00e4nda ditt vanliga l\u00f6senord.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Krav (versionsniv\u00e5er) att ha koll p\u00e5<\/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>Installerat <strong>Wordfence Security<\/strong>-plugin (free eller premium)<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Installation och nedladdning<\/h2>\n\n\n\n<p>Senaste versionen finns som zip i GitHub-releaser. Ladda ner och ladda upp pluginet till <code>\/wp-content\/plugins\/<\/code> och aktivera som vanligt.<\/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>Om du k\u00f6r en Bedrock-liknande setup n\u00e4mns \u00e4ven att installation kan g\u00f6ras via Composer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summering: varf\u00f6r det h\u00e4r \u00e4r v\u00e4rt att testa<\/h2>\n\n\n\n<p><code>wp wfsec<\/code> g\u00f6r Wordfence mer driftv\u00e4nligt n\u00e4r du vill jobba i terminalen, s\u00e4rskilt om du hanterar m\u00e5nga sajter eller vill bygga repeatable runbooks. Abilities API-delen \u00e4r samtidigt en tydlig signal om vart WordPress \u00e4r p\u00e5 v\u00e4g: funktionalitet som inte bara finns i admin, utan g\u00e5r att uppt\u00e4cka och anv\u00e4nda p\u00e5 ett standardiserat s\u00e4tt av automation och AI-agenter \u2013 med mindre handbyggd integration.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Referenser \/ K\u00e4llor<\/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>Ett nytt open source-plugin l\u00e4gger till ett helt `wp wfsec`-kommandonamnrymd f\u00f6r Wordfence i WP-CLI \u2013 och exponerar samtidigt Wordfence-funktioner via WordPress Abilities API f\u00f6r automation och AI-agenter.<\/p>\n","protected":false},"author":61,"featured_media":166,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[65,11,13,10,7],"class_list":["post-165","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sakerhet","tag-automation","tag-sakerhet","tag-wordfence","tag-wordpress","tag-wp-cli"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/sv\/wp-json\/wp\/v2\/posts\/165","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/sv\/wp-json\/wp\/v2\/users\/61"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/sv\/wp-json\/wp\/v2\/comments?post=165"}],"version-history":[{"count":1,"href":"https:\/\/helloblog.io\/sv\/wp-json\/wp\/v2\/posts\/165\/revisions"}],"predecessor-version":[{"id":167,"href":"https:\/\/helloblog.io\/sv\/wp-json\/wp\/v2\/posts\/165\/revisions\/167"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/sv\/wp-json\/wp\/v2\/media\/166"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/sv\/wp-json\/wp\/v2\/media?parent=165"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/sv\/wp-json\/wp\/v2\/categories?post=165"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/sv\/wp-json\/wp\/v2\/tags?post=165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}