Avaluació inicial sense contrasenyes Pressupost abans d’intervenir Un especialista responsable de principi a fi

Administrador Mitjans Frontend

WordPress `admin-ajax.php` retorna 400 Bad Request

Diagnostica errors 400 d'admin-ajax.php revisant action, nonces, autenticació, dades, callbacks i regles del tallafoc.

WordPress pot retornar un 400 des d’admin-ajax.php quan no troba cap callback vàlid per al valor d’action o quan la validació de l’aplicació o de seguretat rebutja la petició. Això no significa necessàriament que l’endpoint estigui espatllat: pot fallar només una acció concreta d’un connector.

Conserva la petició exacta que falla. Obrir admin-ajax.php directament, sense cap acció, acostuma a retornar 0 o 400 i no és una prova útil.

Registra la petició sense exposar dades

Executa la funció una sola vegada amb la pestanya Xarxa oberta. Revisa el mètode, la URL, l’estat, els camps enviats, la resposta i l’script que ha iniciat la sol·licitud.

Conserva:
nom d'action
usuari autenticat o anònim
mètode HTTP i tipus de contingut
nom i presència del camp nonce
text de la resposta
hora exacta i script iniciador

Oculta sempre els valors de nonce, les galetes i qualsevol dada personal.

Confirma que action arriba correctament

WordPress distribueix les peticions segons $_REQUEST['action']. Una acció absent, buida o mal escrita pot fallar abans que s’executi el codi del connector. També pot passar si JavaScript envia JSON però PHP espera dades de formulari.

Inspecciona la petició final del navegador, no només el codi font. Un altre script pot modificar el formulari o la codificació. Utilitza FormData o dades codificades a la URL d’acord amb el callback.

Relaciona els hooks privats i públics

Els callbacks per a usuaris autenticats utilitzen wp_ajax_{action}. Una acció disponible per a visitants necessita, a més, wp_ajax_nopriv_{action}.

add_action( 'wp_ajax_example_action', 'handle_example_action' );
add_action( 'wp_ajax_nopriv_example_action', 'handle_public_example_action' );

Registra la ruta pública només si és necessària i incorpora validació i límits. No exposis operacions administratives mitjançant nopriv.

Valida nonces i capacitats

Un nonce caducat, una sessió finalitzada o galetes perdudes poden provocar el rebuig. Torna a carregar la pàgina o inicia sessió i compara el resultat.

check_ajax_referer( 'example_action', 'nonce' );
current_user_can( 'edit_posts' );

El nonce no substitueix l’autorització. El callback també ha de comprovar la capacitat de l’usuari i retornar un error estructurat sense revelar informació sensible.

Revisa els registres i la resposta PHP

El callback pot provocar un error fatal o acabar amb wp_die() i un missatge genèric. Relaciona l’hora de la petició amb els registres de PHP i WordPress.

En codi propi, retorna JSON coherent:

wp_send_json_error( array( 'message' => 'Request could not be completed.' ), 400 );

No mostris excepcions completes, rutes internes ni secrets al navegador.

Comprova el tallafoc i els límits

ModSecurity o Cloudflare poden bloquejar contingut, mides o freqüències concretes. Cerca l’esdeveniment per URI i hora. Si confirmes un fals positiu, crea una excepció limitada a la regla i a l’acció validades, no a tot admin-ajax.php.

L’AJAX públic rep intents d’abús amb freqüència. Mantén la protecció, la validació i els límits de peticions.

Revisa la memòria cau i la versió de l’script

Les respostes AJAX autenticades no s’han d’emmagatzemar com si fossin pàgines públiques. Després d’una actualització, un JavaScript antic pot continuar enviant un nom d’acció o un nonce incompatibles.

Regenera els recursos, buida les capes de memòria cau necessàries i versiona els scripts. No fixis ajaxurl manualment al frontal: proporciona la URL administrativa correcta des de WordPress.

Versiona el contracte navegador-servidor

Considera el nom de l’acció, els camps, els tipus i la forma de la resposta com una interfície versionada. Si PHP espera el contracte nou i el navegador conserva l’antic, l’error reapareixerà de manera intermitent.

Utilitza wp_localize_script() o wp_add_inline_script() només per a configuració no secreta i nonces de la pàgina actual. No exposis claus API.

Gestiona concurrència i reintents

L’autocompletat, el desament automàtic i els filtres poden generar peticions simultànies. Una resposta antiga però lenta pot substituir-ne una de nova, i un doble clic pot repetir una operació.

Cancel·la les peticions obsoletes quan sigui possible i fes idempotents les escriptures amb referències estables. Limita transaccions o bloquejos al tram imprescindible.

Verifica usuaris i errors previstos

Prova les rutes autenticades i anònimes segons el disseny, amb nonce vàlid i invàlid, dades incorrectes i límits de freqüència. Confirma que cada resposta només conté informació autoritzada.

Després del desplegament, vigila els 400 i 403 per acció. Que l’endpoint respongui no demostra que tots els callbacks continuïn sent compatibles.

ABANS D’ENVIAR LA SOL·LICITUD

Preguntes freqüents.

Demaneu contrasenyes al formulari?+

No. El formulari públic no demana mai accessos. Les dades segures es demanen només després d’aprovar l’abast i el pressupost.

Qui revisa la incidència?+

La sol·licitud arriba a Jordi Ensenyat, fundador de Code Barcelona i especialista en WordPress amb més de 15 anys d’experiència.

Es canvia res abans del pressupost?+

No. Primer es revisen els símptomes visibles i es defineix l’abast. La intervenció comença després de l’aprovació i amb una via de recuperació preparada.

Treballeu amb webs en anglès i fora d’Espanya?+

Sí. WP Repair atén incidències de WordPress i WooCommerce en català, castellà i anglès mitjançant un servei remot.

Avaluar la meva incidència