Le problème: je développe un plugin qui doit accepter les données POST (webhooks provenant d'une source externe). Je n'ai pas de contrôle sur le format des données postées. Ma seule option pour transmettre mes propres données est d'utiliser des arguments d'URL transmis lors de l'enregistrement du Webhook.
Jusqu'ici, j'ai proposé 3 idées, dont aucune ne semble idéale, mais deux d'entre elles fonctionneraient certainement (je ne pense pas que le n ° 2 puisse fonctionner ...). J'espère qu'il existe un moyen propre d'y parvenir sans pirater WordPress.
Pointez le Webhook sur la maison WP et écoutez-le simplement dans mon plugin pour la publication (en fonction d'un paramètre URL arbitraire que j'inclurais dans le Webhook). Mon problème avec ceci est que passer par la génération complète d'une page WordPress juste pour recevoir un POST est beaucoup plus onéreux qu'il ne le faudrait.
Au cours de mes recherches, j'ai découvert XML-RPC, qui semblait prometteur, jusqu'à ce que je constate qu'il dépendait du corps POST contenant les informations d'invocation. Evidemment ça ne marchera pas. Existe-t-il une solution de rechange qui me manque ou s'agit-il d'une impasse?
Publier directement sur une URL dans le plugin. Cela nécessite ensuite d’amorcer manuellement WP. Pas généralement idéal ...
Une option consiste à utiliser la technique add_rewrite_endpoint
que je mentionne dans mon commentaire.
Une autre option consiste à utiliser le hook admin_post_{action}
.
Par exemple, vous pouvez POST données vers votre URL avec un paramètre action
GET:
http://www.example.com/wp-admin/admin-post.php?action=my_plugin_action
Puis connectez cette action via admin_post_nopriv_my_plugin_action
pour recevoir cette demande et traiter les données:
function wpd_my_plugin_action() {
status_header(200);
// do stuff
echo $_POST['somedata'];
die;
}
add_action( 'admin_post_nopriv_my_plugin_action', 'wpd_my_plugin_action' );
Les deux options chargent WordPress sans exécuter la requête principale et charger le modèle.
EDIT: pour autoriser les POST entrants, vous devez vous connecter au allowed_http_Origin
ou au allowed_http_origins
(ce filtre ne fonctionnera que si POSTer a défini le HTTP_Origin
), sinon WordPress rejettera les demandes avant qu’elles n’exécutent votre action.