Comment gérer les appels ajax et JSON dans wordpress

13

J'ai un type de publication personnalisé auquel je veux accéder via jQuery - de préférence en utilisant JSON.

Alors, tout d'abord. créer une fonction qui retourne / echos json est assez facile, mais comment pourrais-je y accéder via jquery.

comme Mike l'écrit dans cette question , il - pour autant que je comprends - le place dans la racine wordpress. ce qui le rendrait accessible en utilisant le nom du fichier php - mais est-ce recommandé? Je préfère le mettre dans un dossier de plugins.

J'ai essayé de lire le codex wordpress, mais la façon dont les appels ajax sont traités me confond, car vous postez chaque appel ajax sur admin-ajax.php, même s'il ne s'agit pas d'une page d'administration?

Quelqu'un peut-il s'il vous plaît redresser les problèmes que j'ai?

/Orage

Éditer

Le problème que j'ai eu était de comprendre comment les appels ajax devaient être passés dans wordpress, ainsi que où placer votre code php et js pour faire / gérer les appels.

Dans l'autre question à laquelle j'ai lié, vous avez créé une fonction plaçant le fichier à la racine wp - je ne veux pas le faire. Mais j'ai maintenant appris à utiliser wp_ajax_ (nopriv _) [action] et je peux effectivement accéder au json que je crée. Le problème qui reste est où je dois placer le JS pour faire l'appel. Je veux le placer dans le fichier js des plugins, mais comme cela doit être présenté dans une page, pas sur le site d'administration, ajaxurl n'est pas défini, donc je dois faire écho en utilisant php.

echo admin_url('admin-ajax.php');

Donc, la question devient comment dois-je combiner ce php avec le javascript, et comment dois-je ensuite le mettre en file d'attente, car ce n'est pas un fichier ou un script.

Orage
la source
J'aimerais modifier le titre de votre question pour donner un titre plus descriptif mais après lecture, je ne suis toujours pas sûr à 100% de votre question. Demandez-vous simplement comment accéder à un flux JSON, sans rapport avec les types de publication personnalisés (le CPT n'est-il pas vraiment importé dans votre question?) Et est-il important qu'il ne soit pas à la racine? Est-ce pour la fonctionnalité d'administration? Peut-être que cela aiderait si vous expliquez ce que vous essayez réellement d'accomplir du point de vue de l'utilisateur final en plus de l'approche technique avec laquelle vous luttez?
MikeSchinkel
Ouais, je peux admettre que le titre n'est pas le plus descriptif de tous les temps. J'ai juste mis quelque chose parce que j'ai posté avec un pire encore au début. Publication modifiée avec plus d'informations.
Tempête du
Le type de publication personnalisé que je viens de mettre, car le plugin json-api qui semble populaire ne couvre pas réellement les types de publication personnalisés.
Tempête du

Réponses:

17

Ajax Handler

Il est en effet un peu déroutant que le gestionnaire Ajax se trouve dans le wp-admin/répertoire, mais oui, vous pouvez et devez également l'utiliser pour les demandes non administratives. Vous enregistrez ensuite un gestionnaire pour le wp_ajax_nopriv_[action]hook, au lieu de la normale wp_ajax_[action]. Dans ce cas, il vous suffit de suivre les premières lignes deadmin-ajax.php , car une demande effectuée par un utilisateur non connecté laissera déjà la page autour de la ligne 50.

Enregistrez donc une fonction pour le hook wp_ajax_nopriv_get_custom_post_data, et elle sera appelée si vous le demandez admin-ajax.phpavec le actionparamètre défini sur get_custom_post_data. Assurez-vous d'appeler vous-même die()à la fin de votre gestionnaire, sinon la valeur par défaut die(-1)sera retournée. Et enregistrez également la version connectée wp_ajax_get_custom_post_data(à la même fonction de gestionnaire, pas de problème), car si vous êtes connecté à votre site, vous ne toucherez pas le noprivcrochet.

Configuration côté serveur en Javascript

L'astuce pour envoyer des données de configuration côté serveur (comme l' admin-ajax.phpURL) est wp_localize_script(). Vous lui passez un tableau de clés et de valeurs qui seront incluses en haut de la page. Cela a probablement été créé à l'origine uniquement pour les chaînes localisables, mais vous pouvez également l'utiliser pour transmettre des données de configuration.

wp_localize_script('storm_json_config', 'storm_config', array(
    'ajaxurl' => admin_url('admin-ajax.php'),
));

storm_json_configest le nom du handle (si vous souhaitez le retirer plus tard), storm_configest le nom de l'objet Javascript qui contiendra vos données. Ainsi, votre fichier Javascript statique peut contenir une ligne comme jQuery.post(storm_config.ajaxurl, ...).

Voir aussi la réponse de bueltge à une question similaire .

Javascript statique depuis le répertoire du plugin

Pour charger un fichier Javascript statique à partir de votre propre répertoire de plugin, vous utilisez wp_enqueue_script(). Cela ressemblerait à quelque chose comme ceci:

wp_enqueue_script('storm_json', plugin_dir_url(__FILE__) . 'js/json.js', array('jquery'), '20101105');

storm_jsonest à nouveau un nom de descripteur, puis vous donnez le lien vers le fichier, puis les dépendances (peut être null), puis un numéro de version qui sera ajouté après la demande de battre les caches du navigateur sur les mises à jour.

Jan Fabry
la source
très bonne réponse. C'est ce que je me demandais, et il semble que je l'ai fait fonctionner. Je peux maintenant accéder à /wp-admin/admin-ajax.php?action=[action] et obtenir un résultat json. Mon problème est maintenant de savoir où placer le js pour faire l'appel ajax. Puisque j'ai besoin de mettre echo admin_url ('admin-ajax.php'); comme l'URL, je ne peux pas le mettre dans mon fichier plugins js. Alors, comment pourrais-je le mettre en file d'attente? Je ne veux pas simplement imprimer le script au milieu d'une page.
Tempête du
@Storm: J'ai développé ma réponse avec wp_localize_script(), que vous pouvez utiliser pour envoyer des données de configuration du côté serveur au navigateur. (Petit conseil: si vous ajoutez @à un nom d'utilisateur, cette personne recevra une notification de votre réponse. @Mike: I updated the titleAssurez-vous donc qu'il voit votre commentaire)
Jan Fabry
Merci beaucoup Jan. Je pense maintenant que je comprends tout le paquet. Je vais devoir jouer un peu avec tout cela pour bien le comprendre mais vous avez été d'une grande aide! Réponse acceptée =) btw merci pour la @ note. Mais comme je commente votre réponse maintenant, vous recevrez toujours une alerte, n'est-ce pas?
Tempête du
@Storm: Oui, l'alerte est envoyée à l'auteur de la question ou de la réponse sur laquelle vous commentez, et elle peut en outre être envoyée à un autre participant que vous mentionnez dans un @ -commentaire. J'ai donc reçu votre notification "gratuitement", mais vous n'en obtiendriez pas si je ne vous incluais pas. Il y a une explication complète sur le méta site général du réseau Stack Exchange.
Jan Fabry