WordPress
De meeste sites die een bureau beheert draaien op WordPress. Eén applicatiewachtwoord per website opent dezelfde host op meerdere manieren tegelijk. Eén daarvan levert een marketingbron die geen andere heeft: hoe vaak het merk van een klant opduikt, en gelinkt wordt, in AI-antwoorden. En onder dezelfde inlog leest en bewerkt een agent de pagina’s, formulieren en media van die site.
Waar je het vindt
Section titled “Waar je het vindt”De kaart WordPress op de detailpagina van een website (Domeinen & websites → Websites → de site). Er is bewust geen menu-item: WordPress is geen plek waar je naartoe gaat, het is iets wat een website heeft. Dezelfde redenering houdt Cloudflare op een domein in plaats van in de zijbalk.
Zet de koppeling aan onder Instellingen → Integraties. Hij heeft de module Websites nodig, want daar hangt de koppeling aan.
De inloggegevens, en wat dat werkelijk is
Section titled “De inloggegevens, en wat dat werkelijk is”- Ga in WordPress naar Gebruikers → Profiel en scroll naar Applicatiewachtwoorden. Maak er een aan en geef hem een naam die je later herkent (“schakl” bijvoorbeeld).
- Open de website in schakl. en vul op de kaart WordPress het adres van de site, de WordPress-gebruikersnaam en dat wachtwoord in.
- Druk op Controleren.
Het wachtwoord gaat versleuteld de opslag in, is via de API alleen te schrijven en komt nooit voor in een antwoord, een logregel of het wijzigingsspoor. Het spoor legt vast dat het gewijzigd is, nooit waarin.
Wat Controleren werkelijk nagaat
Section titled “Wat Controleren werkelijk nagaat”Er lopen zes losse proeven, en geen daarvan bepaalt de uitslag van een andere, want in het echt zijn die toestanden onafhankelijk: Rank Math ontbreekt gewoon vaak op een site waarvan de berichten-API kerngezond is, en de MCP-plugin op een site waar Rank Math prima werkt.
| Oppervlak | Wat een vinkje betekent | Wat een kruisje betekent |
|---|---|---|
rest | Het wachtwoord bereikt de REST-API van WordPress | De inlog zelf is geweigerd |
admin | Die gebruiker is beheerder | Geldige inlog, maar geen beheerder |
abilities | De Abilities-API van WordPress 6.9 is aanwezig | WordPress is ouder dan 6.9 |
rankmath_aiv | Rank Math antwoordt op AI-zichtbaarheid | Plugin afwezig, of geen Content AI-abonnement |
mcp | De MCP Adapter-plugin staat er | Die staat er niet |
bridge | De plugin schakl WordPress MCP Bridge staat er, met zijn versie | Die staat er niet |
Daar volgen twee regels uit. Een lezing die lukt weegt zwaarder dan een proef die weigert: een inlog die de gewone REST-API haalde is actief, ook als de andere niets opleverden, en pas als álle proeven weigeren heet de inlog geweigerd. En onbereikbaar en geen WordPress worden apart gehouden van geweigerd, want geen van beide zegt iets over het wachtwoord: ze als inlogfout melden stuurt iemand een nieuw wachtwoord maken dat nooit fout was.
Elk kruisje draagt de eigen fouttekst van de site, onvertaald, want het is een citaat:
rest_no_route, rest_forbidden, aiv_unauthorized. Een kruisje zonder uitleg is de enige
toestand waar niemand iets mee kan.
Vier oppervlakken, één sleutel
Section titled “Vier oppervlakken, één sleutel”Rank Math registreert zijn AI-zichtbaarheid als WordPress Abilities, met twee regels metagegevens erbij: toon in REST, en beschikbaar via MCP. Die twee regels zijn het hele verhaal. Ze zetten dezelfde functies op de gewone REST-route van WordPress én op de MCP-server van de MCP Adapter-plugin, en allebei authenticeren zoals iedere REST-aanroep dat doet.
| Oppervlak | Wat het is |
|---|---|
wp/v2 | De gewone REST-API: berichten, media, gebruikers, plugins |
wp-abilities/v1 | De Abilities-API van WordPress 6.9, per functie aan te zetten |
mcp/<server> | De MCP-server van de MCP Adapter-plugin |
rankmath/v1/ai-visibility | De eigen AI-zichtbaarheidsroute van Rank Math |
AI-zichtbaarheid als marketingbron
Section titled “AI-zichtbaarheid als marketingbron”Staat de inlog eenmaal, koppel dan onder Marketing op de klant een bron van het type Rank Math aan deze website. Zonder gekoppelde website wordt dat meteen geweigerd, in plaats van morgenochtend als een rode regel op te duiken.
Vijf cijfers, en omdat geen ervan een getal is dat een marketeer al bezit, draagt elk zijn eigen zin op het scherm: uitgeschreven waar er ruimte is, als tooltip waar die er niet is, en in hetzelfde onderdeel voor jouw team en voor het portaal van de klant.
| Cijfer | Wat het telt | Schaal |
|---|---|---|
| AI-zichtbaarheidsscore | Rang, vermeldingen, bronvermeldingen en sentiment in één getal | 0 tot 100 |
| Vermeldingen | Hoe vaak het merk genoemd werd in antwoorden op de gevolgde vragen | Aantal |
| Bronvermeldingen | Het deel daarvan dat ook naar de site van het merk linkte | Aantal |
| Gemiddeld sentiment | Hoe positief het merk beschreven wordt | Percentage |
| Gemiddelde plaats | De gemiddelde positie tussen de merken die een antwoord noemt | 1 is het beste |
Waarom de trendlijn van ons is en niet van Rank Math
Section titled “Waarom de trendlijn van ons is en niet van Rank Math”Rank Math houdt geen geschiedenis bij: elk pad daar antwoordt alleen met de laatste stand. Daarom schrijft de nachtelijke synchronisatie één momentopname per dag, en bestaat de trendlijn doordat wij die momentopnamen bewaren. Een venster van dertig dagen vullen met dertig identieke rijen zou een vlakke lijn opleveren die op meten lijkt.
Analyses draaien bovendien op het tempo van jouw Rank Math-abonnement, standaard wekelijks, dus twee opeenvolgende momentopnamen mogen gerust hetzelfde getal bevatten. Wanneer er voor het laatst geanalyseerd is reist mee met de cijfers, zodat een rapportage kan zeggen wat het eigenlijk vergelijkt in plaats van een week van 0% aan te kondigen.
De site als MCP-oppervlak
Section titled “De site als MCP-oppervlak”Dezelfde inlog is waarmee een agent de inhoud van een klantsite leest en bewerkt, vanuit de
MCP-server van schakl. en ook op sites die zelf geen abilities
registreren. Een site is een parameter, nooit een gereedschap: de sectie /mcp/wordpress is
hetzelfde rijtje gereedschappen of je bureau nu vier sites beheert of vierhonderd. Een gereedschap
per site zou een lijst opleveren die per klant verschilt, en een chatclient stopt elk gereedschap
bij elke beurt in de context van het model. Wat per site verschilt, welke plugins, welke
berichttypes en welke abilities, beantwoordt de samenvatting van die site.
| Wat | Recht |
|---|---|
| Welke site hoort bij deze klant, en een samenvatting: WordPress- en PHP-versie, berichttypes, plugin-namespaces, formulieren, abilities, meertaligheid | wordpress.site.read |
| Pagina’s, berichten en elk eigen berichttype lezen, met concepten, ACF-velden en de WPML-taal; media opzoeken | wordpress.content.read |
| Een concept aanmaken of iets bewerken wat nog niet live staat | wordpress.content.write |
| Iets bewerken wat een bezoeker ziet, of het live zetten | wordpress.content.publish |
| Contact Form 7 lezen / bewerken: sjabloon, veldnamen, beide mails, meldingen | wordpress.forms.read / wordpress.forms.write |
| Abilities opsommen en uitvoeren die zichzelf als alleen-lezen aanmerken | wordpress.ability.read |
| Elke ability uitvoeren | wordpress.ability.run |
Het publiek bepaalt het recht
Section titled “Het publiek bepaalt het recht”WordPress heeft geen testomgeving: een wijziging aan een gepubliceerde pagina ís de uitzending. De
rechten zijn daarom niet verdeeld naar welk veld je aanraakt, maar naar wie het resultaat ziet.
Een medewerker schrijft concepten; alles wat een bezoeker kan zien is wordpress.content.publish,
standaard alleen voor beheerders. Dat wordt besloten door het record te lezen vóór de wijziging,
en de weigering komt voordat de site iets gevraagd wordt. Een formulier bewerken valt onder
publiceren, want het staat live zodra het opslaat en bepaalt waar de aanvragen van een klant
landen. Een ability die zichzelf niet als alleen-lezen aanmerkt wordt als schrijvend behandeld:
liever iets onschuldigs geweigerd dan iets schrijvends doorgelaten.
Elke schrijfactie komt als regel in het wijzigingsspoor van de site bij schakl., met welke velden er zijn geraakt. De WordPress van de klant legt niets over ons vast.
De doorgang naar de hele REST-API
Section titled “De doorgang naar de hele REST-API”Wat geen vaste route heeft, gaat via één begrensde doorgang: elke aanroep die de REST-API van de site aanneemt, onder het opgeslagen wachtwoord. Die bestaat omdat echte klantsites WPML, LiteSpeed, FileBird en Link Genius draaien, en een route per plugin een lijst is die veroudert. Het is ook de route die een agent een WordPress-beheerder in handen geeft, dus de grenzen zijn het ontwerp:
wordpress.rest.readvoorGET(medewerker),wordpress.rest.writevoor al het andere (alleen beheerder, nooit op een standaardsleutel).- Schrijven naar gebruikers, plugins, thema’s en instellingen wordt voor iedereen geweigerd voordat de site iets gevraagd wordt. Die wijzigingen doet een mens in de eigen beheeromgeving van de site. Lezen van dezelfde routes mag wel.
- Paden zijn relatief aan
/wp-json/en kunnen daar niet uit klimmen. - Elke schrijfactie is een regel in het spoor, en elk antwoord wordt bij 256 KB afgekapt met erbij wat er weggelaten is.
schakl WordPress MCP Bridge: paginaopbouw, verborgen berichttypes, uploads, formulieren, menu’s en WPML
Section titled “schakl WordPress MCP Bridge: paginaopbouw, verborgen berichttypes, uploads, formulieren, menu’s en WPML”Veel bureausites bouwen een pagina op uit een ACF-repeater van getypte blokken, met per bloktype een handvol zichtbare velden uit dertig. Via de REST-integratie van ACF is dat niet te bewerken, en niets daaraan is op te lossen vanaf de kant van het wachtwoord:
- de validatie van ACF negeert voorwaardelijke logica, dus een verborgen verplicht veld blokkeert elke wijziging;
- een repeater moet in zijn geheel terug en slaat op positie op, dus één blok wijzigen betekent alle blokken opnieuw sturen;
- een berichttype dat niet in REST staat bestaat daar niet;
wp/v2/medianeemt alleen multipart aan, en dat kan geen MCP-gereedschap versturen.
Daarom doet een WordPress-plugin het op de site zelf: de schakl WordPress MCP Bridge (een eigen
repository, schakl-wordpress-mcp-bridge, PHP 7.4+, GPL). Hij kent het schema van de veldgroepen inclusief wanneer de editor een veld
verbergt, leest per blok alleen de velden die de editor toont, schrijft met de
voorwaardelijke logica geëvalueerd zoals de editor dat doet, meldt elk probleem met het volledige
pad (blokken[2].titel) in plaats van te stoppen bij het eerste, bewerkt één blok zonder de rest
te raken, neemt een afbeelding mee als URL of base64, en regelt WPML: talen, een gekoppelde
vertaling waarin elke verwijzing naar zijn vertaling is omgezet, en String Translation.
schakl. bereikt de plugin via 33 bridge-routes onder dezelfde inlog, en dus via dezelfde 33
gereedschappen in /mcp/wordpress hoeveel sites er ook zijn:
| Wat | Recht |
|---|---|
| Versies, berichttypes (ook die niet in REST staan), taxonomieën, optiepagina’s, menu’s, talen | wordpress.site.read |
| Het veldschema; records, termen, optiepagina’s en menu’s lezen | wordpress.content.read |
| Records en termen aanmaken of bewerken, media uploaden, een vertaling maken of koppelen | wordpress.content.write (+ publish voor wat live staat) |
| ACF-optiepagina’s en vertaalde teksten wijzigen: live zodra ze opslaan | wordpress.content.publish |
| Een menu aanmaken, hernoemen of de themalocaties ervan wijzigen; items toevoegen, bewerken, verplaatsen en verwijderen, en ze op volgorde zetten | wordpress.content.publish |
| Een record naar de prullenbak of verwijderen; een menu met al zijn items verwijderen | wordpress.content.delete |
| Contact Form 7-formulieren lezen, met de velden uit het sjabloon en de eigen configuratiefouten van CF7 | wordpress.forms.read |
| Een formulier aanmaken of bewerken, of de vertaling ervan maken | wordpress.forms.write |
| Een formulier verwijderen | wordpress.forms.delete |
Een record, een term of een optiepagina is ook als tekst te lezen in plaats van als veldboom: de titel, de inhoud zonder opmaak en de ACF-velden op volgorde, met keuzes bij hun label. De lijst met records neemt dezelfde optie aan, dus een agent haalt elk FAQ-item met zijn antwoord op in één aanroep, voor een fractie van de omvang.
Menu’s worden ter plekke bewerkt: een item houdt alles wat je niet meestuurt, kan naar een andere pagina of term wijzen, onder een ander bovenliggend item komen en een plek tussen zijn broertjes krijgen, en van een eigen link is de URL te wijzigen. Een heel menu verwijderen is definitief en valt onder het verwijderrecht, net als een record verwijderen.
Contact Form 7 is op twee manieren bereikbaar. De gewone formulierroutes hierboven gaan via de eigen REST-namespace van CF7 en blijven werken op een site zonder de plugin. De bridge voegt toe wat die namespace nooit had: de velden die CF7 uit het sjabloon haalt, de bezwaren van zijn configuratiecontrole (CF7 verstuurt niets zolang een mail verkeerd ingesteld is), mails en meldingen die over wat het formulier al heeft heen worden gelegd zodat een gewijzigde ontvanger het onderwerp niet leegmaakt, verwijderen, en WPML. Een formulier verwijderen is definitief (CF7 heeft geen prullenbak) en maakt elke pagina leeg die het insluit, vandaar een eigen recht.
WPML kent een formulier op twee manieren, en beide worden bediend. Waar formulieren een vertaalbaar berichttype zijn, krijgt elke taal een eigen gekoppelde kopie, en het antwoord bevat de shortcode die een pagina in die taal insluit. Waar de add-on Contact Form 7 Multilingual elke taal uit één formulier bedient, zijn de teksten String Translation-teksten, gelezen en geschreven op het formulier zelf.
Staat de plugin er niet, dan zegt de aanroep dat zelf, met de naam van de plugin erbij; op de kaart WordPress toont de controle welke versie er staat, en daaronder of de plugin zichzelf kan bijwerken: hij werkt zichzelf bij (automatisch, waar WordPress dat zo ingesteld heeft), er is een nieuwere versie beschikbaar, er is geen GitHub-token, of de updatecontrole is mislukt. Een site zonder werkend token linkt naar de instellingen van de plugin. Een plugin ouder dan 1.3.1 meldt dit niet, en dan zegt de kaart niet gemeld, nooit kan niet bijwerken. Een weigering van de plugin komt ongewijzigd door, met het pad naar het veld en de rij, want een vertaalde zin zonder rijnummer stuurt een agent zoeken.
Rechten
Section titled “Rechten”| Recht | Wat het opent | Standaard |
|---|---|---|
wordpress.site.manage | Koppelen, het wachtwoord wijzigen, controleren, ontkoppelen | Beheerder |
wordpress.site.read | Zien of de site van deze klant gekoppeld is, wat de laatste controle opleverde, en de samenvatting | Beheerder, Medewerker |
wordpress.content.read | Pagina’s, berichten, media en bridge-records lezen | Beheerder, Medewerker |
wordpress.content.write | Concepten schrijven, bewerken wat niet live staat, media uploaden | Beheerder, Medewerker |
wordpress.content.publish | Alles bewerken wat een bezoeker ziet, iets live zetten, optiepagina’s, menu’s en teksten | Beheerder |
wordpress.content.delete | Records naar de prullenbak of verwijderen, menu’s verwijderen | Beheerder |
wordpress.forms.read / wordpress.forms.write | Contact Form 7 lezen / bewerken | Medewerker / Beheerder |
wordpress.forms.delete | Contact Form 7-formulieren verwijderen via de bridge | Beheerder |
wordpress.ability.read / wordpress.ability.run | Alleen-lezen abilities / elke ability | Medewerker / Beheerder |
wordpress.rest.read / wordpress.rest.write | De doorgang naar de REST-API: lezen / schrijven | Medewerker / Beheerder |
Het leesrecht gaat naar medewerkers omdat “is de site van deze klant gekoppeld?” een vraag is die
een accountmanager tijdens gewoon werk stelt. Het beheerrecht blijft bij beheerders en zit bewust
niet in websites.website.write.
Goed om te weten
Section titled “Goed om te weten”- Ontkoppelen vergeet het wachtwoord hier, maar trekt het niet in bij WordPress. Dat doet de eigenaar zelf op zijn profielpagina, en het als bijeffect van opruimen intrekken zou breken waar dat wachtwoord verder nog voor gemaakt was.
- De kaart laadt meteen, gekoppeld of niet. Hij leest opgeslagen gegevens en raakt geen enkele dienst buiten schakl. aan, dus een websitepagina opent even snel of de WordPress van de klant nu in de lucht is, plat ligt, achter een firewall staat of verdwenen is. Gaan kijken is precies wat de knop Controleren doet.
- Een controle die lukt, wist de fout die een vorige zette. Een statusvlag die alleen maar aan kan gaan is een bug met een lange staart.
- Rank Math wordt alleen gelezen. Geen merk aanmaken en geen vragen bewerken. Schrijven naar de site zelf gaat via de MCP-routes hierboven, onder hun eigen rechten.
- Collega’s met een beperkte klantselectie zien alleen de sites van hun eigen klanten. Een website hoort bij de klant van zijn domein, twee stappen verderop, en dat wordt afgedwongen en niet aangenomen.