Tu remarqueras qu’il y a deux solutions possibles : l’intégration JS officielle qui est en effet limitée à de l’affichage mais fonctionnelle ou alors corriger l’implémentation actuelle sur Numerama : la seule chose à faire en php c’est faire le lien entre l’ID d’un article WordPress et l’ID d’un sujet Discourse. Tout le reste (obtenir les messages, poster des commentaires et likes, signaler un message) est possible en utilisant l’API Discourse, comme je le détaillais ici fin août 2016 ou en février/mars 2016.
Pour obtenir les messages d’un sujet Discourse il suffit d’y rajouter .json
: https://www.numerama.com/discussions/t/29084.json
Pour poster un message en AJAX avec jQuery :
$.ajax({
url: '/discussions/session/csrf.json',
success: function(data){
var csrf = data["csrf"];
$.ajax({
url: '/discussions/posts',
method: 'POST',
headers: { 'X-CSRF-Token': csrf },
data: {
'raw' : 'Test ajax jQuery test *test*',
'topic_id':ID_TOPIC, // ID du sujet, obtenu dans la page ou avec encore un autre $.ajax sur '/ajax-comment.php?action=getLastComments&post_id=ID_ARTICLE', cf Numerama Purity user.js
/*'reply_to_post_number':NB_POST_IN_TOPIC, */ // optionnel, post_number
'archetype':'regular',
'typing_duration_msecs':1900, // cf https://github.com/discourse/discourse/blob/825452df/lib/new_post_manager.rb#L46
'composer_open_duration_msecs':15000,
'nested_post':'true'
},
success : function(data){ console.log(data); /* afficher le nouveau message, etc */ }
}); // POST /posts
}
}); // GET csrf.json
Aimer un message
$.ajax({
url: '/discussions/session/csrf.json',
success: function(data){
var csrf = data["csrf"];
$.ajax({
url: '/discussions/post_actions',
method: 'POST',
headers: { 'X-CSRF-Token': csrf },
data: {
'id':ID_MESSAGE, // ID du message sur Discourse
'post_action_type_id':2, // like https://github.com/discourse/discourse/blob/f1639bf4f5a51ee5579ca911ecb8bbb356ab4934/app/models/post_action_type.rb#L22-L29
'flag_topic':false
},
success : function(data){ console.log(data); /* afficher le J'aime envoyé, etc. */ }
}) // POST /post_actions
}
}); // GET csrf.json
Enlever un J’aime à un message
$.ajax({
url: '/discussions/session/csrf.json',
success: function(data){
var csrf = data["csrf"];
$.ajax({
url: '/discussions/post_actions/'+ID_MESSAGE,
method: 'DELETE',
headers: { 'X-CSRF-Token': csrf },
data: {
'post_action_type_id':2
},
success : function(data){ console.log(data); /* enlever le J'aime de l'affichage, etc. */ }
}) // DELETE /post_actions
}
}); // GET csrf.json
Signaler un message à la modération avec un texte défini par l’utilisateur
$.ajax({
url: '/discussions/session/csrf.json',
success: function(data){
var csrf = data["csrf"];
$.ajax({
url: '/discussions/post_actions',
method: 'POST',
headers: { 'X-CSRF-Token': csrf },
data: {
'id':ID_MESSAGE, // ID du message sur Discourse
'post_action_type_id':7, // flag
'message':'Ce message contrevient à la charte parce que…\n\nCeci est un test.',
'flag_topic':false
},
success : function(data){ console.log(data); /* afficher que le signalement a bien été envoyé, etc. */ }
}) // POST /post_actions
}
}); // GET csrf.json
Il suffit d’ouvrir la console réseau de son navigateur avant d’effectuer une action pour découvrir ces paramètres comme je l’expliquais déjà ici, je n’ai fait que traduire les requêtes HTTP vers l’API jQuery en enlevant les paramètres superflus. Il faut aussi gérer les erreurs retournées par Discourse (ex : texte trop court, sujet fermé, utilisateur non connecté, droits d’accès…).
À part les extraits de code c’est au moins la troisième fois que je poste ça, est-ce que cette fois-ci ça va vous être suffisant pour enfin supprimer 90 % de cette API PHP inutile et erronée ? Difficile de vous mâcher encore plus le travail, je l’ai même testé sur la partie WordPress, il vous suffit juste de copier-coller. Double effet kiss-kool, ça corrigera les différentes apostrophes mal échappées.