- documenta as 18 tools do MCP wpfc (site como parametro, guarda-corpo Premium, allowlist fixa de 7 option keys) - mesma convencao das skills mcp-element-pack/mcp-bit-social/mcp-cloudflare-app: esta skill e o 'como executar', wp-fastest-cache continua a ser o mapeamento completo das options - cross-referencia wp-fastest-cache <-> mcp-wpfc nos dois sentidos
50 KiB
name, description
| name | description |
|---|---|
| wp-fastest-cache | Gestão completa do WP Fastest Cache (page cache HTML local) via WP-CLI e via o MCP `wpfc` (projecto `mcp-wpfc`, multi-site, 18 tools). Cobre purga de cache nativa (`wp fastest-cache clear`), diferença entre page cache (WPFC) e object cache (Redis), preload após publicar, minify HTML/CSS/gzip, exclusão de páginas/cookies/user-agents, Clearing Specific Pages, integração CDN (Cloudflare/MaxCDN/genérica) e Varnish, customização do caminho da cache, matriz Free vs Premium, estado real Premium por site (§16.1), achado crítico sobre formato de armazenamento das options (string JSON, não JSON tipado — §16.2), e sequência de purga completa (WPFC + Cloudflare) após deploys ou mudanças de config. Usar quando "wp fastest cache", "wpfc", "purgar cache", "limpar cache wordpress", "cache não actualiza", "preload cache", "minify html", "combine css", "gzip wordpress", "excluir página cache", "cache timeout", "cdn wordpress", "clearing specific pages", "varnish wordpress", "wpfc mcp", "wp fastest pro", "mcp-wpfc". |
/wp-fastest-cache — Gestão do WP Fastest Cache via WP-CLI
Page cache local (HTML estático em disco) do bundle de performance WP Descomplicar®. Complementa (não substitui) o Redis Object Cache e o App for Cloudflare® — os três operam em camadas diferentes, ver §3.
Fonte: leitura completa do código-fonte v1.5.0 (versão Free — sem
wp-fastest-cache-premium/ instalado) no servidor server.descomplicar.pt,
porta 9443, site piloto emanuelalmeida.pt: wpFastestCache.php (2746
linhas), inc/admin.php (2620 linhas), inc/cache.php (1460 linhas),
inc/preload.php (894 linhas), inc/css-utilities.php (766 linhas),
inc/cdn.php (650 linhas), inc/js-utilities.php (340 linhas),
inc/single-preload.php (346 linhas), inc/varnish.php (177 linhas),
inc/admin-toolbar.php, inc/clearing-specific-pages.php, inc/column.php,
inc/wp-polls.php, inc/cli.php, uninstall.php, e todos os templates em
templates/ (exclude.php, timeout.php, preload.php, cache_path.php,
varnish.php, toolbar_settings.php, disable_wp_cron.php,
clearing_specific_pages.php, cdn/cloudflare.php, cdn/maxcdn.php,
cdn/other.php, cdn/file_types.php, cdn/specify_sources.php,
cdn/exclude_sources.php) + CONFIG-Plugins-Referencia.md §3 +
BUNDLE-Excelencia-WP.md §2.2/§2.4 + verificação ao vivo de todas as
wp_options prefixadas WpFastestCache* via SSH em emanuelalmeida.pt,
16-08-2026.
Contexto CWP — sempre obrigatório
PATH=/home/USER/public_html
wp <comando> --allow-root --path=$PATH
Acesso via SSH: ssh server "sudo -u USER /usr/local/bin/wp <comando> --path=$PATH --format=json"
(alias server já configurado; user/path variam por site — ver tabela de
sites de referência no topo desta sessão).
1. Config real — wp_options.WpFastestCache (JSON serializado)
Não existe API wp option patch dedicada a este plugin de forma prática —
a option é um objecto JSON simples (não serializado PHP), por isso
wp option update com --format=json funciona directamente (ao
contrário do Rank Math, que usa arrays PHP serializados e exige
wp option patch). Internamente, saveOption() (inc/admin.php) faz
json_encode($_POST) do formulário inteiro — ou seja, a option guarda
exactamente o subconjunto de checkboxes que estava marcado no momento
de gravar, nunca chaves "off" explícitas (chave ausente = desligada).
# Ler a config completa
wp option get WpFastestCache --format=json --allow-root --path=$PATH
Valor real verificado ao vivo em emanuelalmeida.pt (16-08-2026):
{
"wpFastestCacheStatus": "on",
"wpFastestCachePreload": "on",
"wpFastestCachePreload_number": "4",
"wpFastestCacheLoggedInUser": "on",
"wpFastestCacheMobile": "on",
"wpFastestCacheMobileTheme": "on",
"wpFastestCacheNewPost": "on",
"wpFastestCacheMinifyHtml": "on",
"wpFastestCacheMinifyCss": "on",
"wpFastestCacheCombineCss": "on",
"wpFastestCacheGzip": "on",
"wpFastestCacheLBC": "on",
"wpFastestCacheDisableEmojis": "on"
}
| Chave | Valor | O que faz |
|---|---|---|
wpFastestCacheStatus |
on |
Liga a cache HTML (interruptor mestre) |
wpFastestCachePreload + wpFastestCachePreload_number |
on, 4 threads |
Regenera a cache automaticamente (crawl interno) em vez de esperar pela primeira visita — 4 = threads paralelas do crawler |
wpFastestCacheLoggedInUser |
on |
Serve cache também a utilizadores autenticados (o plugin exclui automaticamente páginas com nonce/admin-bar dinâmicos, não quebra o WP admin) |
wpFastestCacheMobile |
on |
Free. Não serve a versão desktop cacheada a dispositivos móveis (cache mobile separada da desktop, ficheiro próprio em /cache/wpfc-mobile-cache) |
wpFastestCacheMobileTheme |
on |
⚠ Só tem efeito com o addon Premium activo (gate class_exists("WpFastestCachePowerfulHtml") em inc/admin.php:1233). Neste site a chave está gravada no JSON mas é ignorada em runtime porque wp-fastest-cache-premium/ não está instalado — ver §13 |
wpFastestCacheNewPost |
on |
Limpa a cache automaticamente ao publicar/actualizar conteúdo |
wpFastestCacheMinifyHtml |
on |
Minifica HTML na saída |
wpFastestCacheMinifyCss + wpFastestCacheCombineCss |
on |
Minifica e combina ficheiros CSS num único ficheiro |
wpFastestCacheGzip |
on |
Comprime a resposta com gzip |
wpFastestCacheLBC |
on |
Lazy Browser Caching — envia headers Expires/Cache-Control de longa duração para assets estáticos |
wpFastestCacheDisableEmojis |
on |
Ver §5 |
1.1 Todas as chaves possíveis da option WpFastestCache (mapeadas do código-fonte)
Lista completa extraída de grep -roh "wpFastestCache[A-Za-z_]*" a todo o
código-fonte (wpFastestCache.php, inc/*.php, templates/**/*.php) —
não apenas as 13 activas neste site. Cada chave corresponde a um
name="..." de formulário que, quando marcado, é gravado via
saveOption().
Disponíveis na versão Free (sem gate class_exists("WpFastestCachePowerfulHtml")):
| Chave | Free | O que faz |
|---|---|---|
wpFastestCacheStatus |
✅ | Master switch da cache HTML |
wpFastestCachePreload |
✅ | Preload automático (crawler) — ver §6 |
wpFastestCachePreload_number |
✅ | Nº de threads paralelas do crawler de preload |
wpFastestCacheLoggedInUser |
✅ | Não serve cache a utilizadores autenticados |
wpFastestCacheMobile |
✅ | Cache mobile separada (ficheiros próprios, não é "tema mobile") |
wpFastestCacheNewPost |
✅ | Limpa cache ao publicar |
wpFastestCacheNewPost_type / _type_all / _type_homepage |
✅ | Âmbito da limpeza ao publicar — só a página nova, ou tudo, ou também a homepage (templates/newpost.php) |
wpFastestCacheUpdatePost |
✅ | Limpa cache ao actualizar um post/página existente |
wpFastestCacheUpdatePost_type / _type_all / _type_post |
✅ | Âmbito da limpeza ao actualizar (templates/updatepost.php) |
wpFastestCacheMinifyHtml |
✅ | Minifica HTML |
wpFastestCacheMinifyCss |
✅ | Minifica CSS |
wpFastestCacheCombineCss |
✅ | Combina ficheiros CSS |
wpFastestCacheGzip |
✅ | Gzip |
wpFastestCacheLBC |
✅ | Leverage Browser Caching (headers de expiração) |
wpFastestCacheDisableEmojis |
✅ | Remove script/CSS de emoji do WP core — ver §5 |
wpFastestCacheWidgetCache |
✅ (link de doc é premium, mas o campo em si não está gated no template lido) | Cache de widgets para reduzir queries SQL — confirmar no wp-admin, o link de ajuda aponta para a página de marketing Premium mas o checkbox aparece fora do bloco class_exists no ficheiro templates/ correspondente |
wpFastestCacheLanguage |
✅ | Idioma da interface de admin do plugin (select, não afecta o frontend) |
wpFastestCachePage |
✅ (interno) | Campo hidden do formulário que identifica qual sub-página foi submetida (options, deleteCache, deleteCssAndJsCache, cacheTimeout) — nunca persiste na option guardada |
wpFastestCacheTimeOut / _TimeOutHour / _TimeOutMinute |
✅ | Cache Timeout global legado (1 única regra, agenda wp_schedule_event no hook wp_fastest_cache) — não confundir com o Cache Timeout Wizard (§8, WpFastestCacheExclude-like, guardado via wp_fastest_cache_N) |
Só têm efeito com wp-fastest-cache-premium/wpFastestCachePremium.php activo (gate class_exists("WpFastestCachePowerfulHtml") em inc/admin.php) — neste site NÃO instalado, ver §13:
| Chave | O que faria (Premium) |
|---|---|
wpFastestCacheMobileTheme + _themename |
Cache de um tema mobile dedicado (Mobile Cache) |
wpFastestCacheMinifyHtmlPowerFul |
Minificação de HTML mais agressiva ("Minify HTML Plus") |
wpFastestCacheMinifyCssPowerFul |
Minificação de CSS mais agressiva ("Minify Css Plus") |
wpFastestCacheMinifyJs |
Minifica ficheiros JS |
wpFastestCacheCombineJs |
Combina JS no <head> |
wpFastestCacheCombineJsPowerFul |
Combina JS no <footer> ("Combine Js Plus") |
wpFastestCacheRenderBlocking + _Css |
Elimina render-blocking JavaScript/CSS |
wpFastestCacheGoogleFonts |
Carrega Google Fonts de forma assíncrona |
wpFastestCacheLazyLoad + _type, _type_all, _type_exceptcontent, _keywords, _placeholder, _exclude_full_size_img |
Lazy load de imagens/iframes com regras avançadas de âmbito e placeholder customizado |
wpFastestCacheDelayJS |
Atrasa carregamento de scripts JS até scroll/movimento do rato |
wpFastestCachePremium |
Flag interna de licença Premium |
Nota crítica: todo o bloco acima só é renderizado/gravado se
class_exists("WpFastestCachePowerfulHtml")for verdadeiro, o que exige o plugin separadowp-fastest-cache-premium(licença paga) instalado e activo. Não é apenas "desligado por omissão" — nos sites do bundle Descomplicar (sem addon Premium comprado) estes checkboxes aparecem desativados/cinzentos no wp-admin (classequestionCon disabled) e os respectivos$_POSTnunca chegam asaveOption(). Ver §13 para a matriz completa Free vs Premium.
Chaves de infraestrutura confirmadas como ausentes (não é omissão de leitura):
| Chave esperada | Estado | Porque fica assim |
|---|---|---|
WpFastestCacheVarnish |
⚪ não configurado | Sem Varnish à frente do site — não aplicável. Ver §10.3 |
WpFastestCacheCDN |
⚪ não configurado | A integração CDN nativa do WPFC não está activa; o purge Cloudflare é feito pelo App for Cloudflare®, não pelo WPFC. Ver §10 |
WpFastestCacheExclude |
⚪ não configurado | Sem regras de exclusão de páginas/cookies/user-agents definidas. Ver §7 |
WpFastestCacheCSP |
⚪ não configurado | Sem regras "Clearing Specific Pages" definidas. Ver §9 |
WpFastestCachePathSettings |
⚪ não configurado | Caminho de cache por omissão (wp-content/cache, wp-content/cache/wpfc-minified). Ver §11 |
WpFastestCacheToolbarSettings |
⚪ não configurado | Sem restrição de roles na toolbar de admin — ver §12 |
2. Purgar cache — comando nativo (NÃO é wp cache flush)
O plugin regista um comando WP-CLI próprio via inc/cli.php
(WP_CLI::add_command('fastest-cache', 'wpfcCLI')), carregado
automaticamente quando WP_CLI está definido — não precisa de nada extra
no wp-config.php. wp help fastest-cache confirma ao vivo (16-08-2026)
que existe um único subcomando: clear — não há preload, status,
exclude nem cdn via CLI; essas operações só existem no wp-admin/AJAX.
# Limpar toda a cache HTML (mantém ficheiros minificados existentes)
wp fastest-cache clear all --allow-root --path=$PATH
# Limpar TUDO, incluindo cache minificada (CSS/HTML combinados) — usar após deploy de CSS/JS
wp fastest-cache clear all and minified --allow-root --path=$PATH
# Limpar só a cache de um ou mais posts/páginas específicos
wp fastest-cache clear --post_id=123 --allow-root --path=$PATH
wp fastest-cache clear --post_id=123,456,789 --allow-root --path=$PATH
Código-fonte de wpfcCLI::clear() (inc/cli.php) — lógica exacta:
- Se
--post_id=estiver presente, itera cada ID (split por vírgula) e chamasingleDeleteCache(false, $post_id)por post — não aceitaallem conjunto com--post_id; - Senão, se
$args[0] == "all":- Se
$args[1] == "and"e$args[2] == "minified"→deleteCache(true); - Senão →
deleteCache()(sem otrue, não limpa minificados);
- Se
- Qualquer outra combinação (
$args[0]diferente deall, ou sintaxe incompleta de "and minified") →wrong_usage(), que imprime um bloco de erro com link para a doc oficial e sai comWP_CLI::error_multi_line.
Internamente, deleteCache() — a mesma função que corre quando se clica
"Delete Cache" no wp-admin — faz, por esta ordem:
- Purga Varnish se
WpFastestCacheVarnishestiver configurado (não é o caso nos sites do bundle — ver §10.3); - Chama
CdnWPFC::cloudflare_clear_cache()— só tem efeito seWpFastestCacheCDNtiver uma entradaid == "cloudflare"comcdnurl/originurl(email + API token) configurados. Nos sites do bundle não está configurado — o purge Cloudflare real é feito pelo App for Cloudflare®, não por esta chamada. Não assumir quewp fastest-cache clear allpurga o edge Cloudflare; - Recria a pasta de preload temporária e relança o crawler de preload
(
set_preload()); - Apaga
wp-content/cache/all,wp-content/cache/wpfc-minifiedewp-content/cache/wpfc-mobile-cache(ou os caminhos customizados deWpFastestCachePathSettings, ver §11).
3. Três camadas de cache — não confundir
| Camada | Plugin/mecanismo | Comando de purga | O que invalida |
|---|---|---|---|
| Page cache (HTML em disco) | WP Fastest Cache | wp fastest-cache clear all and minified |
Ficheiros HTML/CSS/JS gerados em wp-content/cache/* |
| Object cache (queries à BD) | Redis Object Cache (redis-cache, DB 12, Predis) |
wp cache flush |
Chaves no Redis (queries, transients cacheados) |
| Edge cache (CDN) | Cloudflare, via App for Cloudflare® | purge no wp-admin do plugin ou API Cloudflare directa | Cache no edge Cloudflare (fora do servidor de origem) |
Não conflitam entre si — são camadas independentes e complementares:
o Redis acelera queries PHP mesmo quando o WPFC serve HTML estático (o
WPFC serve o ficheiro sem sequer bootar o WordPress completo em muitos
casos, mas quando bootar — ex. utilizador autenticado — o Redis acelera
essa execução). wp cache flush não limpa a cache HTML do WPFC, e
wp fastest-cache clear all não limpa o Redis. Confundir os dois é o
erro mais comum: "limpei a cache e a alteração continua sem aparecer" —
normalmente falta uma das três camadas.
4. Sequência de cache completa (sempre após alterações de config ou deploy)
Seguir o mesmo padrão do /rank-math (Sequencia de cache), com o passo
WPFC adicionado:
wp fastest-cache clear all and minified --allow-root --path=$PATH
wp cache flush --allow-root --path=$PATH
wp transient delete --all --allow-root --path=$PATH
wp rewrite flush --allow-root --path=$PATH
Seguido de purga Cloudflare (App for Cloudflare®, camada edge — fora
do WP-CLI, via wp-admin ou API Cloudflare com o token da zona). Alterações
que dependem de robots.txt, /llms.txt, headers ou CSS/JS combinado só
aparecem depois de purgar as três camadas — confirmado no achado real
do bot_management/robots.txt (BUNDLE-Excelencia-WP.md §2.4):
robots.txt tinha cache-control: max-age=315360000 no Cloudflare, e só
mudou depois de purgar Cloudflare + WPFC juntos.
Regra prática: depois de qualquer alteração a CSS/JS/tema/Elementor,
purgar sempre WPFC (and minified) + Cloudflare juntos — nunca só um
dos dois. Alterações a options do WordPress sem impacto em HTML/CSS
(ex. Rank Math meta) só precisam do wp cache flush (Redis).
5. wpFastestCacheDisableEmojis — o que faz exactamente
Confirmado em inc/cache.php:34 — quando esta opção está on, o plugin
remove o <script> inline wp-emoji-release.min.js e o CSS inline de
detecção de emoji que o WordPress core injecta por omissão em todo o
<head> (mecanismo nativo para navegadores antigos sem suporte a emoji
Unicode). Ganho de performance pequeno mas real: elimina um pedido
JS + um bloco de CSS inline em cada página, sem efeito visual em
navegadores modernos (emoji Unicode nativo funciona sem o script). Sem
riscos conhecidos de quebra — ao contrário de Minify JS/Combine JS
(Premium), não mexe em scripts de plugins/tema.
6. Preload — configuração completa e rebuild após deploy
wpFastestCachePreload=on + wpFastestCachePreload_number=4 significa
que, após qualquer purga (deleteCache()), o plugin relança
automaticamente um crawler interno (set_preload()) com 4 threads
paralelas para regenerar a cache das páginas mais visitadas antes da
próxima visita real — evita que o primeiro visitante depois de um deploy
apanhe sempre a versão sem cache (mais lenta). Lógica em inc/preload.php
(894 linhas) e inc/single-preload.php (346 linhas, preload de um único
post após ser publicado/actualizado).
6.1 Método de preload (templates/preload.php)
O wizard de Preload no wp-admin oferece um <select> com dois métodos
(campo interno, não persiste directamente como chave simples — é
serializado dentro da config de preload):
| Método | O que faz |
|---|---|
default |
Ordena o conteúdo do mais recente ao mais antigo (Contents from Newest to Oldest) — é o método activo se nada for escolhido |
sitemap |
Usa um sitemap XML como fonte de URLs a pré-carregar, em vez de percorrer o conteúdo por data |
6.2 Tipos de conteúdo incluídos no preload (checkboxes arrastáveis/reordenáveis)
Quando o método é default, os seguintes tipos de conteúdo podem ser
marcados individualmente e a ordem entre eles é definida por
drag-and-drop (guardada em wpFastestCachePreload_order):
| Checkbox | Tipo de conteúdo |
|---|---|
wpFastestCachePreload_homepage |
Homepage |
wpFastestCachePreload_post |
Posts |
wpFastestCachePreload_category |
Categorias |
wpFastestCachePreload_page |
Páginas |
wpFastestCachePreload_tag |
Tags |
wpFastestCachePreload_attachment |
Anexos (media attachments com página própria) |
wpFastestCachePreload_customposttypes |
Custom Post Types registados no site |
wpFastestCachePreload_customTaxonomies |
Taxonomias customizadas |
Quando o método é sitemap, existe ainda wpFastestCachePreload_sitemap
para indicar o URL do sitemap XML a usar como fonte.
6.3 Rebuild após deploy
# Depois de um deploy (código/tema alterado), sequência completa:
wp fastest-cache clear all and minified --allow-root --path=$PATH
wp cache flush --allow-root --path=$PATH
# + purga Cloudflare (App for Cloudflare, fora do WP-CLI)
# O preload arranca sozinho a seguir ao clear — não precisa de comando extra.
# Confirmar que recriou a pasta de cache:
wp eval 'echo is_dir(WP_CONTENT_DIR . "/cache/all") ? "existe" : "vazio, aguardar preload";' --allow-root --path=$PATH
7. Exclusão de páginas, cookies e user-agents — WpFastestCacheExclude
Feature separada da option principal, gerida pelo "Exclude Page Wizard"
(templates/exclude.php) e persistida em wp_options.WpFastestCacheExclude
como um array JSON de objectos {prefix, content, type} — não faz parte
do JSON de WpFastestCache. Callback de gravação:
wpfc_save_exclude_pages_callback() em wpFastestCache.php:714.
# Ler as regras de exclusão configuradas
wp option get WpFastestCacheExclude --format=json --allow-root --path=$PATH
7.1 Estrutura de uma regra
| Campo | Valores possíveis | O que faz |
|---|---|---|
type |
page, useragent, cookie, css, js |
A que se aplica a regra — página completa (não gera cache), pedido de um User-Agent específico, presença de um cookie, ou exclusão de um ficheiro CSS/JS individual da minificação/combinação |
prefix |
homepage, category, tag, post, page, archive, attachment (content types); startwith, contain, exact, regex (métodos); googleanalytics, yandexclickid, woocommerce_items_in_cart (especiais) |
Como o content é comparado contra o REQUEST_URI (ou o cookie/user-agent) |
content |
string livre ou regex | O valor a comparar |
7.2 Regras nativas sempre presentes (hardcoded, não editáveis)
Independentemente da configuração, o wizard sempre lista estas regras
como pré-existentes e não removíveis (editable: false em
WpFcExcludePages.insert_existing_rules()):
| Tipo | Regra | Motivo |
|---|---|---|
page, exact |
wp-login.php |
Nunca cachear a página de login |
page, startwith |
wp-admin |
Nunca cachear o admin |
useragent, contain |
facebookexternalhit |
Bots de preview social não devem receber cache potencialmente desatualizada |
useragent, contain |
LinkedInBot |
idem |
useragent, contain |
WhatsApp |
idem |
useragent, contain |
Twitterbot |
idem |
cookie, contain |
Admin |
Qualquer visitante com cookie de admin (wordpress_logged_in_... com role admin) nunca recebe cache |
7.3 Efeito no .htaccess (Apache) e no PHP (todos os servidores)
Ao gravar (modify_htaccess_for_exclude()), o plugin reescreve o bloco
# Start WPFC Exclude ... # End WPFC Exclude do .htaccess com regras
mod_rewrite equivalentes — isto é a camada rápida (nginx/Apache
servem o miss sem sequer chamar o PHP). Em paralelo, inc/cache.php
lê WpFastestCacheExclude em runtime (get_option("WpFastestCacheExclude"),
linha 78) para aplicar as mesmas regras via PHP como segunda camada de
segurança (necessário em nginx, onde não há .htaccess).
7.4 Bloquear cache de uma página individual via editor
O plugin regista um botão no TinyMCE/Quicktags (addButtonOnEditor(),
checkShortCode()) que insere [wpfcNOT] no conteúdo — qualquer post/página
que contenha este shortcode nunca é cacheada ($this->blockCache = true),
sem precisar de criar uma regra de exclusão explícita.
7.5 Exclusão automática de wishlist (YITH WooCommerce Wishlist)
Se o plugin yith-woocommerce-wishlist/init.php estiver activo,
exclude_urls() (inc/admin.php:163) adiciona automaticamente uma regra
exact para o URL da página de wishlist, sempre que a config é gravada —
comportamento automático, não precisa de intervenção manual.
8. Cache Timeout — duas mecânicas distintas
8.1 Timeout global legado (wpFastestCacheTimeOut)
Uma única regra global, gravada como parte da própria option WpFastestCache
(wpFastestCacheTimeOut, _TimeOutHour, _TimeOutMinute). Ao gravar
(addCacheTimeout(), inc/admin.php:203), o plugin:
- Limpa qualquer agendamento anterior no hook
wp_fastest_cache(wp_clear_scheduled_hook($this->slug()), ondeslug() == "wp_fastest_cache"); - Agenda um novo
wp_schedule_event()no mesmo hook, com o schedule (hourly,daily, etc.) escolhido emwpFastestCacheTimeOute a hora exacta calculada a partir deTimeOutHour/TimeOutMinute.
# Verificar se há um timeout global agendado
wp cron event list --allow-root --path=$PATH | grep wp_fastest_cache
8.2 Cache Timeout Wizard — múltiplas regras por página/tipo (templates/timeout.php)
Mecanismo mais granular: permite definir N regras de purga agendada,
cada uma associada a um subconjunto de páginas (homepage, all,
startwith, exact) e a uma frequência (wp_get_schedules(), incluindo
schedules customizados que tenham a flag ["wpfc"] marcada). Não usa
uma wp_option própria — cada regra vira um evento WP-Cron individual
com hook wp_fastest_cache_<indice> (wpfc_save_timeout_pages_callback(),
wpFastestCache.php:832), e os parâmetros da regra (prefix, content,
hour, minute) viajam como argumentos serializados do próprio evento
cron — inspecionáveis apenas via wp cron event list + wp cron event run,
não via wp option get.
# Listar todas as regras de timeout agendadas (uma por evento wp_fastest_cache_N)
wp cron event list --allow-root --path=$PATH | grep 'wp_fastest_cache_'
Se o schedule escolhido for daily/onceaday, a UI mostra também um
selector de Hora/Minuto (fuso do servidor, mostrado ao vivo no wizard via
current_time("H:i:s")) para agendar a purga a uma hora fixa em vez de
"daqui a X".
8.3 Aviso "Disabled Cron" (templates/disable_wp_cron.php)
Se DISABLE_WP_CRON estiver definido como true no wp-config.php, o
botão "+ Add New Timeout" no wp-admin mostra um aviso a explicar que o
WP-Cron foi desligado inteiramente e nenhuma regra de timeout vai
disparar sozinha — só via cron real do sistema a chamar wp-cron.php, ou
wp cron event run --due-now.
9. Clearing Specific Pages (CSP) — WpFastestCacheCSP
Feature para purgar páginas adicionais sempre que a cache é limpa por
qualquer motivo (publicar/actualizar post, clique manual, CLI) —
útil para páginas agregadoras (ex. /loja/, /blog/) que mostram
conteúdo de múltiplos posts e por isso ficam desatualizadas sem serem
elas próprias editadas. Classe ClearingSpecificPagesWPFC
(inc/clearing-specific-pages.php), UI em templates/clearing_specific_pages.php.
# Ler as regras CSP configuradas
wp option get WpFastestCacheCSP --allow-root --path=$PATH
9.1 Estrutura
Array de objectos {url, order}, onde:
urltem de começar pelo mesmo host queget_option("home")— validado porcheck_url(), senão a gravação falha comwp_send_json_error();- Pode conter no máximo um wildcard
(.*), validado porcheck_wild_card()— mais do que um wildcard, ou um wildcard mal colocado (não precedido de/), é rejeitado; - Não pode conter
..(protecção contra directory traversal,preg_match("/\.{2,}/", ...)); orderé o identificador único da regra (usado para editar/remover).
9.2 Exemplo de uso típico
Se /loja/ lista os últimos produtos e um produto novo é publicado,
adicionar uma regra CSP com url = https://site.pt/loja/ garante que
/loja/ é purgado junto com a cache do próprio produto, mesmo que
wpFastestCacheNewPost_type esteja configurado apenas para "a página
nova".
10. Integração CDN e Varnish
10.1 CDN genérica (MaxCDN / StackPath / BunnyCDN / CloudFront / "Other") — WpFastestCacheCDN
Classe CdnWPFC (inc/cdn.php, 650 linhas). A option
WpFastestCacheCDN guarda um array JSON de integrações (mais do
que uma CDN pode coexistir), cada entrada identificada por id:
cloudflare, maxcdn, other (genérico — cobre StackPath, BunnyCDN,
Amazon CloudFront, KeyCDN, CDN77, que são todos normalizados para "other"
internamente em start_cdn_integration()/pause_cdn_integration()/
remove_cdn_integration()).
wp option get WpFastestCacheCDN --format=json --allow-root --path=$PATH
Campos de uma entrada genérica (não-Cloudflare): id, cdnurl (URL do
CDN), originurl (URL de origem, normalmente o próprio domínio),
status (ausente = activo, "pause" = integração pausada sem remover a
config).
Âmbito de reescrita de URLs (wizard "Other CDN", templates/cdn/*):
templates/cdn/file_types.php— checkboxes por extensão de ficheiro a servir via CDN:aac, avif, css, eot, gif, jpeg, js, jpg, less, mp3, mp4, ogg, otf, pdf, png, svg, swf, ttf, webm, webp, woff, woff2(todos marcados por omissão);templates/cdn/specify_sources.php— lista de palavras-chave: só URLs que contenham um dos keywords especificados são servidos via CDN (whitelist opcional, vazio = todos os tipos marcados acima);templates/cdn/exclude_sources.php— lista de palavras-chave: URLs que contenham um destes keywords nunca são servidos via CDN (blacklist, tem prioridade sobre a whitelist).
Validação em tempo real do URL do CDN (CdnWPFC::check_url()) bloqueia
explicitamente: IPv6, IPs decimais/hex/octal, localhost, e ranges
privados (127., 10., 172., 169., 100., 198., 192.) — com
mensagens de erro específicas conhecidas para CloudFront 403, BunnyCDN
403 e Speedsize 400.
10.2 Integração Cloudflare nativa do WPFC
Distinta do App for Cloudflare® — esta é a integração embutida no
próprio WP Fastest Cache, activada com id == "cloudflare" dentro de
WpFastestCacheCDN, campos cdnurl (email da conta, ou literal "wpfc"
se estiver a usar API Token em vez de Global API Key — ver
cloudflare_generate_header()) e originurl (a chave/token).
Ao configurar via wizard templates/cdn/cloudflare.php, o plugin executa
automaticamente e em sequência (cloudflare_change_settings()):
- Desactiva o Rocket Loader da zona Cloudflare (
cloudflare_disable_rocket_loader()) — evita conflito entre o Rocket Loader (que também reescreve JS) e o Combine/Minify JS do WPFC; - Purga a cache Cloudflare (
cloudflare_clear_cache()); - Define Browser Cache TTL para 6 meses (
16070400segundos,cloudflare_set_browser_caching()) — hardcoded, não configurável pela UI; - Se o plano Cloudflare for
free, remove automaticamente as regras WebP do.htaccess(cloudflare_remove_webp()) — porque o plano grátis da Cloudflare já faz a sua própria conversão/entrega WebP via Polish, e as duas camadas juntas causam conflitos; cloudflare_disable_minify()está deprecated (fazreturnantes de qualquer chamada à API) porque a Cloudflare descontinuou o Auto Minify legacy — o código morto continua no ficheiro mas nunca executa.
O Zone ID é resolvido automaticamente por cloudflare_get_zone_id()
(paginando /zones?page=1..2&per_page=1000 da API Cloudflare e
comparando o hostname do site) e fica em cache serializado dentro do
próprio WpFastestCacheCDN->zone_id (função unserialize()/serialize()
directamente sobre um array PHP — não JSON).
# Confirmar se há integração Cloudflare nativa do WPFC configurada (distinta do App for Cloudflare®)
wp option get WpFastestCacheCDN --format=json --allow-root --path=$PATH | grep -o '"id":"cloudflare"'
10.3 Varnish (reverse proxy) — WpFastestCacheVarnish
Classe VarnishWPFC (inc/varnish.php). Guarda apenas
{"server": "<host:porta>"} (e opcionalmente "status": "pause"). Ao
purgar, envia um pedido HTTP PURGE (não GET/POST) para
<schema>://<server>/.* com o header Host apontado para o domínio real
do site — se o pedido falhar tenta trocar https://↔http:// uma vez
antes de desistir, e trata explicitamente respostas 501 (método PURGE
não permitido pelo Varnish/hosting) com mensagem a sugerir contacto com o
hosting. Chamado automaticamente dentro de deleteCache() sempre que
WpFastestCacheVarnish existir e não estiver em pausa — não é preciso
correr nada manualmente depois de configurado.
wp option get WpFastestCacheVarnish --allow-root --path=$PATH
11. Customização do caminho da cache — WpFastestCachePathSettings
Wizard "Cache Path Customization" (templates/cache_path.php) permite
mudar o nome da pasta de cache dentro de wp-content/ (por omissão
cache) e da pasta de assets minificados (por omissão wpfc-minified).
Útil quando outro plugin/CDN já usa wp-content/cache/ para outra coisa,
ou por segurança-por-obscuridade em setups multi-tenant.
wp option get WpFastestCachePathSettings --allow-root --path=$PATH
Estrutura: {"cachepath": "cache", "optimizedpath": "wpfc-minified"} —
se a option não existir, o código assume estes dois valores por omissão
(inc/admin.php:22-29 em cache_path.php). Alterar isto implica que
todos os comandos de purga (wp fastest-cache clear, deleteCache())
passam a apagar os novos caminhos — não há migração automática de
ficheiros já cacheados no caminho antigo, ficam órfãos em disco até
serem apagados manualmente ou por rotação de logs.
12. Toolbar de admin e acções rápidas por post
12.1 Menu na admin bar (inc/admin-toolbar.php)
Classe WpFastestCacheAdminToolbar adiciona um nó "WP Fastest Cache" na
admin bar do WordPress (frontend e wp-admin), com sub-itens: "Clear Cache
of This Page" (só no frontend), "Clear All Cache", "Clear Cache and
Minified CSS/JS", e (se for multisite) "Clear Cache of All Sites". No
wp-admin, mostra ainda "Toolbar Settings" quando já se está na página de
opções do plugin.
12.2 Restringir a toolbar por role (WpFastestCacheToolbarSettings)
Wizard templates/toolbar_settings.php permite marcar quais roles não
administrativos (o administrator está sempre incluído e não aparece
na lista) veem o menu "WP Fastest Cache" na admin bar —
wpfc_toolbar_save_settings_callback() grava um array {role: "1"} em
wp_options.WpFastestCacheToolbarSettings.
wp option get WpFastestCacheToolbarSettings --allow-root --path=$PATH
12.3 Link "Clear Cache" na listagem de posts/páginas (inc/column.php)
Classe WpFastestCacheColumn injecta um link "Clear Cache" nas row
actions de post_row_actions/page_row_actions (a mesma linha onde
aparecem "Edit"/"Trash"/"View" na listagem do wp-admin), com um pedido
AJAX (wpfc_clear_cache_column) que chama singleDeleteCache() só para
esse post — equivalente a wp fastest-cache clear --post_id=<ID> mas
disparado pela UI sem passar pela CLI.
12.4 Integração WP-Polls (inc/wp-polls.php)
Se o plugin WP-Polls estiver activo, o WPFC intercepta a votação em
enquetes via AJAX próprio (wpfc_wppolls_ajax_request) para garantir que
o resultado do voto não fica "preso" numa página cacheada — sem isto, um
visitante veria sempre a enquete por votar mesmo depois de votar, porque
a página HTML estática não reflecte o estado de sessão.
13. Matriz Free vs Premium (addon wp-fastest-cache-premium)
Confirmado no código: class_exists("WpFastestCachePowerfulHtml") é o
gate central usado em inc/admin.php para decidir o que renderizar/gravar.
Essa classe só existe se o plugin separado
wp-fastest-cache-premium/wpFastestCachePremium.php estiver instalado e
activo (licença paga, get_premium_version() lê a versão do cabeçalho
No site piloto desta secção (emanuelalmeida.pt) este addon NÃO está
instalado — confirmado por find no wp-content/plugins/ desse site,
que só devolve a pasta wp-fastest-cache/ (Free). Correcção 19-08-2026:
isto não é verdade para todo o bundle — ver §16.1, descomplicar.pt tem
o Premium 1.7.7 instalado no disco (inactivo).
| Funcionalidade | Free | Premium | Onde no código |
|---|---|---|---|
| Page cache HTML, minify HTML/CSS, combine CSS, Gzip, Leverage Browser Caching | ✅ | ✅ | inc/admin.php (fora do gate) |
| Preload (crawler automático) | ✅ | ✅ | inc/preload.php |
| Exclusão de páginas/cookies/user-agents | ✅ | ✅ | inc/cache.php, WpFastestCacheExclude |
| Clearing Specific Pages | ✅ | ✅ | inc/clearing-specific-pages.php |
| CDN genérica (MaxCDN/Other) + Cloudflare nativa | ✅ | ✅ | inc/cdn.php |
| Varnish | ✅ | ✅ | inc/varnish.php |
| Cache Timeout (global e por regra) | ✅ | ✅ | inc/admin.php, templates/timeout.php |
| Disable Emojis | ✅ | ✅ | inc/cache.php |
| Mobile cache (separar cache mobile/desktop) | ✅ | ✅ | wpFastestCacheMobile |
| Mobile Theme (tema mobile dedicado) | ❌ | ✅ | inc/admin.php:1233, wp-fastest-cache-premium/pro/library/mobile-cache.php |
| Minify HTML Plus / Minify Css Plus | ❌ | ✅ | inc/admin.php:1289,1311 |
| Minify JS / Combine JS / Combine JS Plus | ❌ | ✅ | inc/admin.php:1330-1373 |
| Render Blocking JS/CSS | ❌ | ✅ | inc/admin.php:1400, doc: wpfastestcache.com/premium/render-blocking-js/ |
| Google Fonts optimizado | ❌ | ✅ | inc/admin.php:1426 |
| Lazy Load (imagens/iframes) | ❌ | ✅ | inc/admin.php:1450, wp-fastest-cache-premium/pro/library/lazy-load.php (incluído via cache.php:987) |
| Delay JS | ❌ | ✅ | inc/admin.php:1488, wp-fastest-cache-premium/pro/library/delay-js.php (incluído via cache.php:875) |
| Image optimisation/compressão | ❌ | ✅ | wpFastestCache.php:214, WpFastestCacheImageOptimisation |
| Logs de actividade | ❌ | ✅ | wpFastestCache.php:1556, pro/library/logs.php |
| DB auto-cleanup (limpeza de transients/revisões) | ❌ | ✅ | inc/admin.php:2231, pro/templates/db-auto-cleanup.php |
| Static file caching avançado | ❌ | ✅ | wpFastestCache.php:249, pro/library/statics.php |
Gotcha de auditoria: se uma option JSON WpFastestCache mostrar
chaves Premium marcadas "on" (ex. wpFastestCacheMobileTheme,
wpFastestCacheLazyLoad) isso não prova que a funcionalidade está
activa — só prova que a chave ficou gravada num momento em que o addon
Premium podia estar instalado, ou que veio de uma migração/import. A
única forma fiável de confirmar se o Premium está realmente activo é:
wp plugin list --path=$PATH --format=json | grep -i "fastest-cache"
# Se só aparecer "wp-fastest-cache" (sem "-premium"), todas as chaves Premium são no-op.
14. Gotchas / erros comuns
| Sintoma | Causa | Solução |
|---|---|---|
| "Limpei a cache e não mudou nada" | Confundir camadas — só correu wp cache flush (Redis) ou só wp fastest-cache clear (page cache), faltou Cloudflare |
Sempre as 3 camadas juntas para mudanças visuais (§4) |
wp fastest-cache clear all não purga Cloudflare |
WpFastestCacheCDN sem entrada cloudflare com credenciais válidas — a chamada CdnWPFC::cloudflare_clear_cache() corre mas fica sem efeito por falta de email/API key/zone ID |
Purgar Cloudflare à parte (App for Cloudflare® ou API) |
Comando wp fastest-cache "command not found" |
inc/cli.php só é carregado if(defined('WP_CLI') && WP_CLI) — falha se o WP-CLI não inicializar o plugin correctamente (ex. --skip-plugins) |
Nunca usar --skip-plugins com este comando; confirmar wp plugin is-active wp-fastest-cache primeiro |
wp fastest-cache clear all and minified dá "Wrong usage" |
Sintaxe exacta exigida: exactamente all, and, minified como 3 argumentos posicionais separados por espaço — qualquer typo (--minified, all-minified) cai em wrong_usage() |
Copiar o comando literal da doc, sem flags extra |
| Checkbox Premium (Lazy Load, Minify JS, Render Blocking...) não tem efeito nenhum apesar de aparecer marcado no JSON | Addon wp-fastest-cache-premium não está instalado — o checkbox nem chega a ser submetido no wp-admin (disabled), a chave só sobrevive na option se veio de outro contexto |
Confirmar wp plugin list (§13) antes de investigar "porque é que a Lazy Load não funciona" |
| Minify JS/Combine JS activados "quebram" o site | Nos sites do bundle estas opções nem estão disponíveis (Premium-only) — se aparecerem activas nalgum sítio é sinal de config legada ou de outro plugin | Confirmar se o Premium está mesmo activo antes de desligar; se não estiver, a causa do problema é outra |
robots.txt//llms.txt não reflecte alteração recente |
max-age alto no Cloudflare + cache HTML do WPFC — as duas mascaram a alteração na origem |
Purgar WPFC + Cloudflare juntos (§4), não só um |
--post_id= não limpa nada |
ID de post inválido ou página não estava em cache (nunca visitada) | Confirmar que a página tem ficheiro em wp-content/cache/all/<slug>/ (ou no caminho customizado de WpFastestCachePathSettings, §11) antes de assumir falha |
| Regra de exclusão gravada no wp-admin não bloqueia a cache em produção | Site em nginx (sem .htaccess) e WpFastestCacheExclude não está a ser lido correctamente pelo PHP, ou regex mal escapado (prefix=regex) |
Testar a regra isoladamente com wp option get WpFastestCacheExclude --format=json, validar a regex fora do WordPress primeiro |
Página agregadora (/loja/, /blog/) mostra conteúdo desatualizado mesmo com New Post activo |
wpFastestCacheNewPost_type só limpa a página nova, não as páginas que a listam |
Adicionar regra Clearing Specific Pages (§9) para essas páginas agregadoras |
| Cache Timeout Wizard "desaparece" depois de gravar | DISABLE_WP_CRON está true no wp-config.php — a regra fica registada como evento mas nunca dispara sozinha |
Confirmar cron real do sistema a chamar wp-cron.php, ou usar wp cron event run --due-now manualmente/via systemd timer |
15. Decision tree — qual comando/opção usar
| Operação | Comando/Opção |
|---|---|
| Purgar tudo (HTML) | wp fastest-cache clear all |
| Purgar tudo incl. minificados (após deploy CSS/JS) | wp fastest-cache clear all and minified |
| Purgar só 1+ posts/páginas | wp fastest-cache clear --post_id=ID[,ID...] |
| Purgar object cache (Redis) | wp cache flush |
| Purgar edge (Cloudflare) | wp-admin App for Cloudflare® ou API Cloudflare directa (ou integração nativa WPFC se configurada, §10.2) |
| Ler config completa | wp option get WpFastestCache --format=json |
| Alterar 1 chave da config | wp option update WpFastestCache '{"...json completo com a chave alterada..."}' --format=json (é JSON simples, não serializado PHP — reescrever o objecto completo) |
| Confirmar se está a servir cache | wp eval 'echo is_dir(WP_CONTENT_DIR."/cache/all") ? "sim" : "nao";' |
| Ver regras de exclusão de páginas/cookies/UA | wp option get WpFastestCacheExclude --format=json (§7) |
| Ver regras de purga extra (páginas agregadoras) | wp option get WpFastestCacheCSP (§9) |
| Ver integrações CDN configuradas | wp option get WpFastestCacheCDN --format=json (§10) |
| Ver config Varnish | wp option get WpFastestCacheVarnish (§10.3) |
| Ver caminho de cache customizado | wp option get WpFastestCachePathSettings (§11) |
| Ver regras de Cache Timeout (por página) | `wp cron event list |
| Ver timeout global legado | `wp cron event list |
| Confirmar se o addon Premium está activo | `wp plugin list --format=json |
| Bloquear cache de 1 página sem criar regra | Inserir [wpfcNOT] no conteúdo via botão do editor (§7.4) |
16. MCP construído (wpfc, projecto mcp-wpfc) — 19-08-2026, ao vivo
16.1 Estado real por site (corrige a afirmação de §13)
Verificado ao vivo via wp plugin list --format=json em 8 sites WordPress
reais do bundle (não 7 — care.descomplicar.pt, ecommerce-demo.descomplicar.pt
e ecommerce.descomplicar.pt são instalações WP reais adicionais sem WPFC):
| Site | wp-fastest-cache |
wp-fastest-cache-premium |
Cache HTML activa? |
|---|---|---|---|
emanuelalmeida.pt |
active, v1.5.0 | não instalado | sim (Free) |
starter.descomplicar.pt |
active, v1.5.0 | não instalado | sim (Free) |
ccv.descomplicar.pt |
active, v1.5.0 | não instalado | sim (Free) |
descomplicar.pt (produção) |
inactive, v1.5.0 | inactive, v1.7.7 | não — nem Free nem Premium activos |
e-commerce.descomplicar.pt |
inactive, v1.5.0 | não instalado | não |
care.descomplicar.pt |
não instalado | não instalado | não |
ecommerce-demo.descomplicar.pt |
não instalado | não instalado | não |
ecommerce.descomplicar.pt |
não instalado | não instalado | não |
descomplicar.pt é o único site confirmado com o addon Premium no disco
(1.7.7), mas está inactivo tal como o Free — a config antiga em
WpFastestCache (§1) sobreviveu de um período em que esteve activo, incluindo
a chave Premium wpFastestCacheGoogleFonts: "on" (só tem efeito com
WpFastestCachePowerfulHtml a existir, ou seja, nunca teve efeito real desde
que o Premium está inactivo).
Pergunta em aberto de §16.2 (versão anterior) respondida: descomplicar.pt
não tem NENHUM plugin de HTML page-cache activo hoje (confirmado via
wp plugin list — nem WPFC Free/Premium, nem outro concorrente; webp-express
é o único plugin de optimização activo). Também sem drop-in
object-cache.php (Redis inactivo) e sem headers cache-control/x-cache
na resposta ao vivo — o site depende só da edge Cloudflare (proxy laranja)
para qualquer camada de cache. Conclusão: seguro construir e testar o MCP
em produção; activar o Premium continua por decidir à parte (fora do
âmbito desta sessão — activação de plugin já é coberta pelo emcp-tools activate-plugin genérico, não precisa deste MCP).
16.2 Achado crítico de implementação: formato de armazenamento das options
As 7 options WPFC (WpFastestCache, WpFastestCacheExclude,
WpFastestCacheCSP, WpFastestCacheCDN, WpFastestCacheVarnish,
WpFastestCachePathSettings, WpFastestCacheToolbarSettings) são strings
PHP planas cujo conteúdo é texto JSON — NÃO são options JSON tipadas do
WP-CLI. Confirmado via wp option get WpFastestCache (sem --format=json):
devolve um array PHP {0 => '{', 1 => '"', 2 => 'w', ...} — ou seja, o
valor já é uma string de caracteres, e o WP-CLI está a mostrar essa string
char a char porque o plugin fez json_encode($array) ao gravar, não
update_option() sobre um array PHP nativo.
Bug reproduzido e corrigido durante o build: a primeira versão do MCP
usava wp option get/update --format=json (o padrão copiado de
mcp-element-pack, correcto lá porque as options do Element Pack Pro são
arrays PHP nativos). Em WpFastestCache isto causa dupla codificação:
- Leitura com
--format=jsonde uma string já-JSON devolve essa string entre aspas ("{\"wpFastestCacheStatus\": \"on\", ...}"). Um únicoJSON.parse()do lado do cliente devolve uma string, não um objecto. {...string, ...novasChaves}em JavaScript faz spread de uma string como se fosse um array de caracteres — produz um objecto{0: '{', 1: '"', 2: 'w', ...}com as novas chaves misturadas.- Escrever esse objecto de volta com
--format=jsongrava um array PHP indexado por número na base de dados — corrompe a option, o plugin deixa de conseguir lê-la (json_decode()falha silenciosamente,getOption()volta a defaults).
Isto corrompeu de facto WpFastestCache em descomplicar.pt durante o
teste (verificado via wp option get sem --format=json, mostrando o array
de caracteres). Restaurado imediatamente a partir do valor exacto capturado
antes do bug (wp option get --format=json da leitura de diagnóstico
original desta sessão) — confirmado idêntico ao original, só difere um \n
final inofensivo.
Correcção aplicada: getOption/setOption do MCP nunca usam
--format=json. Leitura: wp option get '<key>' --path=... --allow-root
(raw), depois JSON.parse() uma única vez no cliente. Escrita: o valor
JavaScript é JSON.stringify()-ado e enviado como string crua (via base64
em stdin) para wp option update '<key>' --path=... --allow-root (sem
--format=json), replicando exactamente o que o próprio plugin faz.
Lição para MCPs futuros que envolvam wp option: nunca assumir que
--format=json é seguro só porque o valor "parece JSON" no get — testar
sempre wp option get <key> sem a flag primeiro, para confirmar se o
tipo real na BD é uma string-com-JSON-dentro (como aqui) ou um array PHP
nativo (como no Element Pack Pro, element_pack_active_modules etc.) antes
de escolher o padrão de leitura/escrita.
16.3 Sites cobertos e tools (18)
Projecto /media/ealmeida/Dados/Dev/mcp-wpfc, registado em
~/.omp/agent/mcp.json como wpfc. Parâmetro site em cada tool (alias
conhecido de §16.1 ou path absoluto) — cobre os 8 sites reais do bundle
numa só ligação, ao contrário de element-pack/rank-math-mcp (uma
ligação fixa por site). Como executar cada tool: ver skill mcp-wpfc — esta secção fica só
com o desenho e a verificação; o "como usar" tool a tool vive na skill dedicada.
wpfc_list_sites— sites conhecidos com path e nota de estado.wpfc_get_status— instalado/activo/versão, Free e Premium.wpfc_get_config/wpfc_set_config— optionWpFastestCachecompleta;wpfc_set_configfaz merge (read-modify-write) e recusa gravar qualquer chave só-Premium (lista emPREMIUM_ONLY_CONFIG_KEYS, §1.1 desta skill) a menos que confirmewp-fastest-cache-premiumactivo ou recebaforce_premium: true.wpfc_purge_cache—all/all_minified/post(--post_id).wpfc_get_exclude/wpfc_set_exclude—WpFastestCacheExclude(§7).wpfc_get_csp/wpfc_set_csp—WpFastestCacheCSP(§9).wpfc_get_cdn/wpfc_set_cdn—WpFastestCacheCDN(§10.1).wpfc_get_varnish/wpfc_set_varnish—WpFastestCacheVarnish(§10.3).wpfc_get_pathSettings/wpfc_set_pathSettings—WpFastestCachePathSettings(§11).wpfc_get_toolbarSettings/wpfc_set_toolbarSettings—WpFastestCacheToolbarSettings(§12.2).
As 6 options estruturadas (set_exclude/csp/cdn/varnish/pathSettings/toolbarSettings)
são substituição completa, não merge — enviar sempre a lista/objecto
desejado por inteiro.
Testado ponta-a-ponta contra produção (19-08-2026): wpfc_get_status
em descomplicar e ccv confirmou os dados reais de §16.1;
wpfc_set_config com uma chave Premium (wpFastestCacheGoogleFonts) foi
correctamente recusado em descomplicar (Premium inactivo); com uma chave
Free (wpFastestCacheDisableEmojis: "on", já "on" — sem alterar
comportamento) escreveu e releu correctamente, confirmado por leitura SSH
directa fora do MCP; wpfc_get_exclude/wpfc_set_exclude testado em
ccv (fallback [] → escrita [] → releitura []); wpfc_purge_cache
executado com sucesso em ccv (Success: The cache has been cleared!).
Fonte: CONFIG-Plugins-Referencia.md §3 (WP Fastest Cache) +
BUNDLE-Excelencia-WP.md §2.2/§2.4 (modelo de performance, achado do
purge Cloudflare+WPFC no robots.txt) + leitura directa e completa do
código-fonte do plugin v1.5.0 (Free, sem addon Premium instalado) no
servidor server.descomplicar.pt, site piloto emanuelalmeida.pt:
wpFastestCache.php (2746 linhas, 100% lido), inc/admin.php (2620
linhas, secções de settings/save/render lidas integralmente), inc/cache.php
(1460 linhas), inc/preload.php (894 linhas), inc/css-utilities.php
(766 linhas), inc/cdn.php (650 linhas, 100% lido), inc/js-utilities.php
(340 linhas), inc/single-preload.php (346 linhas), inc/varnish.php
(177 linhas, 100% lido), inc/clearing-specific-pages.php (100% lido),
inc/admin-toolbar.php, inc/column.php, inc/wp-polls.php, inc/cli.php
(100% lido), e todos os templates relevantes em templates/ e
templates/cdn/ (100% lidos) + wp help fastest-cache e wp option list --search='WpFastestCache*' ao vivo em emanuelalmeida.pt,
16-08-2026.