{"id":177,"date":"2026-01-21T07:21:43","date_gmt":"2026-01-21T06:21:43","guid":{"rendered":"https:\/\/helloblog.io\/nl\/wordfence-wp-cli-abilities-api\/"},"modified":"2026-01-21T07:36:24","modified_gmt":"2026-01-21T06:36:24","slug":"wordfence-wp-cli-abilities-api","status":"publish","type":"post","link":"https:\/\/helloblog.io\/nl\/wordfence-wp-cli-abilities-api\/","title":{"rendered":"Wordfence bedienen via WP-CLI \u00e9n de nieuwe Abilities API (WP 6.9+): scans, firewall en issues automatiseren"},"content":{"rendered":"\n<p>Wie meerdere WordPress-sites beheert, weet dat security-werk vaak neerkomt op herhaling: scan starten, resultaten checken, verdachte IP\u2019s blokkeren, issues opvolgen. Als je daarbij liever in de terminal zit (of je processen wilt automatiseren), is er nu een interessante nieuwkomer: <strong>WP-CLI &#038; Abilities API for Wordfence<\/strong> (open-source) voegt WP-CLI-commando\u2019s toe voor Wordfence Security \u00e9n implementeert meteen de <strong>WordPress Abilities API<\/strong> die met WordPress 6.9 is ge\u00efntroduceerd.<\/p>\n\n\n\n<p>Het resultaat: Wordfence-functies worden niet alleen scriptbaar via WP-CLI, maar ook benaderbaar via een gestandaardiseerde, self-describing API-laag die automation tools en AI agents kunnen ontdekken en gebruiken zonder maatwerk integraties per plugin.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wat deze plugin precies toevoegt<\/h2>\n\n\n\n<p>Na installatie krijg je in WP-CLI een nieuw command namespace: <code>wp wfsec<\/code>. Daarmee stuur je een groot deel van Wordfence aan vanuit de terminal. Handig voor beheer op afstand, cronjobs, deploy pipelines en onderhoud op meerdere omgevingen (dev\/staging\/prod).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Security scanning<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Quick of full malware scans starten<\/li>\n\n\n<li>Scan-voortgang real-time monitoren<\/li>\n\n\n<li>Scan history en gedetailleerde logs bekijken<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Firewall management (WAF)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>IP-adressen blocken en unblocken<\/li>\n\n\n<li>Blockduur en reden meegeven<\/li>\n\n\n<li>Controleren of een specifiek IP geblokkeerd is<\/li>\n\n\n<li>WAF protection aan- of uitzetten<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Issue tracking<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Alle gedetecteerde security issues opvragen<\/li>\n\n\n<li>Filteren op status (new, ignored, resolved)<\/li>\n\n\n<li>Individuele threats verwijderen of beheren<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Configuratie &#038; licentie<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Wordfence-instellingen uitlezen en aanpassen<\/li>\n\n\n<li>Licentiestatus controleren<\/li>\n\n\n<li>Configuratie exporteren en importeren<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Snelle voorbeelden (WP-CLI)<\/h2>\n\n\n\n<p>Onderstaande commando\u2019s geven een goed gevoel bij de workflow. In alle gevallen kun je dit combineren met shell scripting (bijv. in CI\/CD) of periodieke jobs.<\/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>Belangrijk voor automatisering: alle commando\u2019s ondersteunen <code>--format=json<\/code>. Daarmee kun je output betrouwbaar parsen in scripts en tooling, zonder dat je moet leunen op tekstoutput die kan veranderen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Waarom de Abilities API hier het echte nieuws is<\/h2>\n\n\n\n<p>WP-CLI is fantastisch voor beheerders en DevOps-achtige workflows. Maar deze plugin gaat verder: hij is \u00e9\u00e9n van de eerste die de <strong>WordPress Abilities API<\/strong> implementeert (ge\u00efntroduceerd in <strong>WordPress 6.9<\/strong>). Denk aan de Abilities API als een gestandaardiseerde interface waarmee tooling (inclusief AI agents) kan <strong>ontdekken<\/strong> welke acties een WordPress-installatie aanbiedt, \u00e9n die acties vervolgens kan aanroepen via een schema-validated, self-describing contract.<\/p>\n\n\n\n<p>Concreet betekent dit dat Wordfence-functionaliteit opeens veel makkelijker in te pluggen is in bijvoorbeeld een eigen security dashboard, een automatiseringsplatform of een AI-gedreven monitoring agent-zonder dat je per se een custom plugin-API hoeft te schrijven of ad-hoc endpoints moet bouwen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">De 7 abilities die deze plugin exposed<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>scan-status<\/strong> \u2013 huidige scanstatus en voortgang opvragen<\/li>\n\n\n<li><strong>scan-start<\/strong> \u2013 security scans programmatisch starten<\/li>\n\n\n<li><strong>issues-list<\/strong> \u2013 gedetecteerde issues ophalen<\/li>\n\n\n<li><strong>issues-count<\/strong> \u2013 aantallen issues per severity opvragen<\/li>\n\n\n<li><strong>firewall-status<\/strong> \u2013 status van de WAF checken<\/li>\n\n\n<li><strong>firewall-block<\/strong> \u2013 IP\u2019s blocken via de API<\/li>\n\n\n<li><strong>license-status<\/strong> \u2013 licentie-informatie opvragen<\/li>\n\n<\/ul>\n\n\n\n<p>Met deze abilities kun je bijvoorbeeld periodiek een scan starten, de voortgang volgen, issues automatisch inventariseren en bij bepaalde thresholds (severity\/aantal) een blokactie uitvoeren of een incident aanmaken in je eigen proces.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Authenticatie: Application Passwords<\/h3>\n\n\n\n<p>Voor authenticatie gebruikt de API-kant <strong>WordPress Application Passwords<\/strong> via <strong>Basic Auth<\/strong>. Application Passwords zijn WordPress\u2019 ingebouwde manier om per integratie een aparte credential te gebruiken (handig: apart intrekken zonder je hoofdwachtwoord te wijzigen).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vereisten (check dit v\u00f3\u00f3r je installeert)<\/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>De <strong>Wordfence Security<\/strong> plugin (free of premium)<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Installatie: ZIP downloaden of Composer<\/h2>\n\n\n\n<p>De snelste route is de laatste release downloaden en uploaden naar je plugins-map (<code>\/wp-content\/plugins\/<\/code>). Daarna activeer je de plugin zoals je gewend bent.<\/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>Gebruik je een Bedrock-achtige setup (waar Composer de dependency manager is), dan is installatie via Composer ook een optie volgens de projectbeschrijving.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Praktische use-cases in een beheeromgeving<\/h2>\n\n\n\n<p>In de praktijk is dit vooral interessant als je security als een operationeel proces benadert in plaats van een \u2018klik-klus\u2019 in wp-admin. Een paar concrete scenario\u2019s die direct passen bij de feature-set:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Nightly full scans starten en de JSON-output wegschrijven naar logging\/monitoring.<\/li>\n\n\n<li>Een klein script dat <code>issues-count<\/code> checkt en bij overschrijding van een severity-threshold een alarm triggert.<\/li>\n\n\n<li>Een routine die brute force IP\u2019s met context (duration + reason) blockt en periodiek opschoont\/unblockt.<\/li>\n\n\n<li>Een dashboard dat scanstatus, WAF status en licentiestatus in \u00e9\u00e9n overzicht trekt, zonder handmatig in te loggen op elke site.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Samenvatting<\/h2>\n\n\n\n<p>WP-CLI &#038; Abilities API for Wordfence combineert twee werelden: snelle, beheer-vriendelijke terminal-commando\u2019s via <code>wp wfsec<\/code> \u00e9n een Abilities API-implementatie die Wordfence-functies vindbaar en aanroepbaar maakt voor automation en AI agents. Zeker als je meerdere sites runt of security checks wilt standaardiseren, is dit een opvallend praktische stap richting \u2018security as code\u2019 binnen WordPress.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Referenties \/ Bronnen<\/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-taken uitvoeren zonder het dashboard te openen? Met deze open-source plugin krijg je een `wp wfsec` command namespace \u00e9n een Abilities API-laag die automation en AI-agents een standaard ingang geeft.<\/p>\n","protected":false},"author":23,"featured_media":178,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[63],"tags":[45,65,14,10,8],"class_list":["post-177","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-ecosysteem","tag-api","tag-beveiliging","tag-wordfence","tag-wordpress","tag-wp-cli"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/posts\/177","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/users\/23"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/comments?post=177"}],"version-history":[{"count":1,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/posts\/177\/revisions"}],"predecessor-version":[{"id":179,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/posts\/177\/revisions\/179"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/media\/178"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/media?parent=177"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/categories?post=177"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/tags?post=177"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}