J'utilise AngularJS pour créer un formulaire AJAX qui est ensuite traité sur un serveur exécutant Wordpress.
Le gestionnaire côté serveur est simple:
function rnr_contact_callback() {
$name = $_POST['firstName'] . ' ' . $_POST['lastName'];
wp_mail(
'[email protected]',
'Contact form submitted',
$name . '(' . $_POST['email'] . ') sent a message: ' . $_POST['comment']
);
exit;
}
Contrôleur côté client:
angular.module('app').controller('ContactForm', function($scope, $http) {
$scope.sendContactForm = function() {
$http({
method: 'POST',
url: '/wp-admin/admin-ajax.php',
params: {
action: 'contact',
firstName: $scope.userFirstName,
lastName: $scope.userLastName,
email: $scope.userEmail,
comment: $scope.userComment
}
}).success(function(data, status, headers, config) {
$scope.contactFormSent = true;
}).error(function(data, status, headers, config) {
});
};
});
J'ai testé la cohérence $scope
, et tout va bien. De plus, la demande POST est gérée: je reçois un courrier électronique. Le problème est que le corps de l'e-mail ressemble à ceci: () sent a message:
. Je conclus que, sur le serveur, aucun des $_POST['...']
n'est défini. Pourquoi? Qu'est-ce que je fais mal?
J? ai compris. J'aurais juste dû utiliser $_REQUEST
au lieu de $_POST
dans chaque fonction qui gère les requêtes AJAX.
Action d'analyse:
function angular_ajax_params_to_post() {
$is_ajax = ( defined( 'DOING_AJAX' ) && DOING_AJAX );
if($is_ajax){
$params = json_decode(file_get_contents('php://input'), true);
foreach ($params as $param_key => $param_val) {
$_POST[ $param_key ] = $param_val;
}
}
}
add_action( 'plugins_loaded', 'angular_ajax_params_to_post' );
Cette fonction analyse la chaîne de message angulaire dans le tableau $ _POST.
Je viens d'avoir le même problème. $ _REQUEST est vide, car angulars $ http envoie ses données au format JSON par défaut. Yu doit envoyer les données en tant que formdata:
var app = angular.module('foo', []);
app.config(function ($httpProvider) {
// send all requests payload as query string
$httpProvider.defaults.transformRequest = function(data){
if (data === undefined) {
return data;
}
return jQuery.param(data);
};
// set all post requests content type
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
});
Vous devez utiliser $ _REQUEST au lieu de $ _POST en PHP:
function rnr_contact_callback() {
$name = $_REQUEST['firstName'] . ' ' . $_REQUEST['lastName'];
wp_mail(
'[email protected]',
'Contact form submitted',
$name . '(' . $_REQUEST['email'] . ') sent a message: ' . $_POST['comment']
);
exit;
}