web-dev-qa-db-fra.com

Existe-t-il une API JavaScript? Comment accéder aux données publiques et privées dans JS?

Selon cet article il n’existe pas d’API JavaScript intégrée à Wordpress. Par conséquent, les développeurs qui souhaitent utiliser AJAX semblent proposer leur propre solution, ce qui ne me semble pas correct.

Ce qui me manque vraiment, mis à part la récupération de publications ou de données, avec une API intégrée, c’est un petit ensemble de fonctions JavaScript permettant de gérer les interfaces back-end et front-end. Maintenant, y a-t-il quelque chose de prévu concernant ce problème?

Par exemple, j'aimerais savoir que

  • le menu principal de gauche est réduit,
  • quel utilisateur est connecté
  • quel groupe il est,
  • même les données du client comme le navigateur

et ainsi de suite.

8
stackoverclan

TL; DR

Il n'y a pas d'API JavaScript dans le noyau WordPress et personne n'est prévu, mais en réalité, il n'en est pas nécessaire.

Backend

Tout d'abord, disons que, en ce qui concerne le backend, certaines informations utiles peuvent être extraites de variables globales JavaScript déjà présentes (WordPress aime toutes les variantes globales).

Par exemple.

  • ajaxurl pour l'URL admin-ajax.php à utiliser dans les appels ajax
  • pagenow pour le slug de la page d’administration actuelle, par exemple 'tableau de bord'
  • adminpage pour le fichier de page d'administration en cours, par exemple 'index-php' (les points sont remplacés par des hiphens)
  • typenow pour le type de publication en cours dans edit.php, post.php ou post-new.php
  • userSettings peut être utilisé pour obtenir des informations sur l'utilisateur actuellement connecté

Ces informations vous donnent un "contexte" de l'état de l'application pendant que vous êtes dans le backend.

Pour les autres choses mentionnées dans la question, vous n'avez besoin d'aucune "API", car des fonctions jQuery super simples peuvent faire l'affaire. Par exemple pour savoir si le menu admin est fermé, vous pouvez vérifier la classe "repliée" dans le corps:

if ( $(body).hasClass('folded') ) {
  alert( 'Admin left menu is closed!' );
} else {
  alert( 'Admin left menu is open!' );
}

Manque de documentation

Pour des choses comme les extraits précédents, il ne vaut pas la peine de créer des fonctions. WP a déjà trop de fonctions en PHP. J'espère vraiment que des fonctions supplémentaires telles que celles-ci ne seront pas ajoutées au noyau.

Ce dont JavaScript a réellement besoin dans WordPress, c’est plus de documentation pour les fonctionnalités existantes: aucune des choses que j’ai écrites ci-dessus n’est documentée dans les documents officiels tels que le Codex ou les fichiers source.

L'extrémité avant?

Jusqu'ici, je n'ai parlé que du backend.

En effet, à peu près tout ce qui se passe sur le front-end est lié au thème actuellement utilisé. Imaginons qu'il existe un fichier JavaScript fourni par WordPress contenant des fonctions permettant d'obtenir des informations sur l'état actuel de l'application; Si un thème ne met pas ce fichier JS en file d'attente, ces fonctions ne sont pas disponibles et forcer un thème permettant de mettre en file d'attente un tel script serait absolument faux.

Pas besoin de (une autre) API

Cependant, dans WordPress, every les informations que vous pouvez obtenir via PHP peuvent également être facilement utilisées en JavaScript et sans demande de AJAX. La fonction qui rend cela possible est wp_localize_script() .

Supposons que vous souhaitiez obtenir les données utilisateur et utilisateur actuelles, telles que son rôle d'utilisateur, dans votre code JavaScript et que vous souhaitiez également connaître les variables de requête utilisées dans la page en cours. Vous pouvez effectuer les opérations suivantes:

$data = array(
  'user'       => wp_get_current_user(),
  'query_vars' => $GLOBALS['wp']->query_vars
);

wp_localize_script( 'myscript', 'MyScriptData', $data );

Dans votre script, la variable MyScriptData.user sera un objet JavaScript contenant toutes les informations sur les utilisateurs, ainsi que toutes les variables de la requête.

Ceci est valable pour les scripts backend et frontend (en d'autres termes: pour les deux "côtés"). Il n'est pas nécessaire que l'API JavaScript supplémentaire JavaScript se contente de récupérer ces informations. PHP est suffisant si vous utilisez les méthodes appropriées pour transmettre des informations de PHP à JS.

Backbone.js

Backbone.js , est un framework JavaScript qui permet un (en quelque sorte) MVC modèle de développement avec JavaScript. Il était inclus dans le noyau avec WP 3.5 - principalement pour gérer la médiathèque.

Cette bibliothèque n’est pas une API JavaScript WordPress, car elle permet sûrement un développement JavaScript plus puissant, mais aucune fonction spécifique à WordPress n’a été ajoutée à cette bibliothèque et c’est la seule utilisation principale de Backbone actuelle. js. La médiathèque est plus ou moins non documentée et ne possède aucune API publique. Et autant que je sache, il n’est pas prévu de combler cette lacune. (Plus qu'heureux de changer/supprimer cette déclaration - si quelqu'un peut me prouver le contraire).

WP-API

Comme indiqué par Rarst et Brian Fegter , l'API WP fait partie du noyau (probablement à partir de WP 4.1) .

Mais je dois dire que c'est not une API JavaScript. Cela permet simplement de connecter une requête HTTP à un point de terminaison d'application contrôlé par l'API WP. Et l'API récupère les données de la base de données et les retourne au format JSON. Exemple tiré de la documentation:

Vous souhaitez recevoir les publications de votre site? Envoyez simplement une demande GET à /wp-json/posts. Mettre à jour l'utilisateur avec l'ID 4? Envoyez une demande POST à /wp-json/users/4. Obtenez tous les articles avec le terme de recherche "génial"? GET /wp-json/posts?filter[s]=awesome.

Comme les requêtes HTTP et les réponses JSON associées peuvent être traitées avec n’importe quel langage prenant en charge les requêtes HTTP et le format de données JSON (PHP, Ruby, Python, ASP, etc.), le WP API L’objectif principal est de permettre d’obtenir et de définir les données WordPress d’applications non WP. Cela signifie que de l'intérieur n'importe quelle application , pas seulement WordPress.

Bien sûr, JavaScript étant un langage capable de gérer à la fois les requêtes HTTP et le format JSON, vous pouvez également utiliser l'API WP à partir de JavaScript JavaScript. Quelqu'un travaille également sur un WP js client pour cette API, mais

  • en utilisant wp_enqueue_script() + l'API Ajax + WordPress PHP, il est possible de récupérer toutes les informations dont vous avez besoin sans aucune API supplémentaire. Et, comme les trois "ingrédients" sont WP des normes établies, leur utilisation n’est pas une "solution propre". Il utilise simplement des solutions standard pour effectuer des tâches personnalisées (et communes), ce en quoi consiste le développement de ces plugins.

  • il est même possible d'utiliser JavaScript pour utiliser l'API WP. Juste parce que WP-API renvoie JSON, il pas en fait une API JavaScript. Aucune fonction JavaScript n'est impliquée (une requête HTTP est envoyée et un rapport JSON est renvoyé. Ce processus est pratiquement identique à celui de l'utilisation de l'API AJAX.). Sinon, tout service renvoyant du JSON doit être considéré comme une API WordPress JS. L'API-WP doit être considérée comme une API de service externe qui renvoie JSON. Il est également possible que le site qui utilise ce service JSON soit identique à celui qui le fournit.

  • avec WP API, aucune action ne peut également être réalisée à l'aide de l'API AJAX. Mais il y a beaucoup de choses qui peuvent être faites avec l'API AJAX. mais pas avec WP-API.

Une note sur le WP-API + Backbone.js

Avec Backbone.js, il est possible d’obtenir et de sauvegarder des informations dans des applications prenant en charge les requêtes RESTful HTTP.

Le problème est que WordPress, à la fois dans les requêtes "normales" et dans celles de AJAX, est tout sauf RESTful: il ne prend en charge que les requêtes $_GET et $_POST par défaut, et utilise l'une ou l'autre avec la même fin. dans ... le même résultat.

Au contraire, l'API WP est RESTful. Les applications basées sur Backbone peuvent donc en tirer parti pour les applications JavaScript puissantes, mais je ne voudrais pas définir Backbone ou WP API ou Backbone. + WP API en tant qu'API JavaScript pour WordPress dans le cadre de ce qui précède.

6
gmazzap

Il y a eu pas mal de développement autour de l'API JSON REST supposée être fusionnée dans la version 4.1 . Je crois que cela va officiellement s'appeler "API WP". Vous pouvez commencer à utiliser la base de code maintenant et vous tenir au courant des derniers développements here jusqu’à ce que cela devienne fondamental. Ryan McCue et son équipe ont élaboré une très bonne documentation here .

4
Brian Fegter

Tandis que par le passé, WP était centré sur le retour, des déclarations avaient été faites depuis des années sur le passage à une utilisation intensive du SC. Avec des engagements de compatibilité ascendante en tête, il est douteux que JS atteigne la parité ou prenne le contrôle de PHP prochainement (à mon avis), mais des progrès ont été réalisés à cet égard.

L'administrateur WordPress est maintenant livré avec Backbone et Underscore, une grande partie de la dernière itération de la bibliothèque multimédia. Malheureusement, les détails de la mise en œuvre ne sont absolument pas documentés et l'utilisation par une tierce partie a été relativement impopulaire.

REST API plugin est en cours de développement en tant que "feature plugin" avec l'intention officielle d'être inclus dans le noyau de WordPress à l'avenir.

3
Rarst

Pour répondre à votre déclaration:

[...] il n'y a pas d'API Javascript intégrée pour Wordpress. Par conséquent, les développeurs qui souhaitent utiliser Ajax semblent proposer leur propre solution, ce qui ne me semble pas correct.

Il n'y a pas de "solution propre" à faire. Vous pouvez faciliter les choses en utilisant ATP avec ajax_template_part() by @ G.M. ou des plugins similaires et prenez un raccourci, mais il n’existe toujours pas de moyen non standard d’utiliser AJAX dans WordPress. Ces "solutions propres"/manières (la plupart du temps) sont mal faire. AJAX les appels sont (approximativement) effectués comme suit:

  1. Register AJAX callback sur un raccordement sensible au contexte (public ou privé/connecté)
  2. Enregistrer, mettre en file d'attente et localiser le script
  3. Utilisez jQuery $.ajax() et des fonctions similaires pour réagir à l’interaction de l’utilisateur. Utilisez l’objet JS global (localisé) pour renvoyer les données au callback PHP.
  4. Dans PHP cb, vous validez, filtrez et désinfectez les données, vérifiez les nonces et les référents, créez votre base de données et restituez les données JSON à l'aide de wp_send_json_success() et de fonctions similaires.

Si un plugin ou un thème ne le fait pas de cette façon, alors l'auteur n'a pas lu les choses ou n'a pas regardé d'exemples. Il est un squelette pour ce qui devrait être utilisé.

Plus d'informations détaillées sur la façon de gérer AJAX dans WP peuvent être trouvées dans le livre de la communauté "WordPressTheRightWay" .

Ce qui me manque vraiment en dehors de la récupération de publications ou de n'importe quelles données avec une API intégrée, c’est un petit ensemble de fonctions Javascript permettant de gérer les interfaces back-end et front-end. [...] Par exemple, j'aimerais savoir que le menu principal de gauche est réduit, ou quel utilisateur est connecté ou quel groupe il est, ou même que des données client telles que le navigateur, etc.

WordPress n'est tout simplement pas spécifique à quoi vous devez faire avec AJAX. C'est pourquoi vous pouvez pratiquement tout ranger dans un tableau localisé/globalisé et le mettre à disposition pour vos appels AJAX. Et cela correspond parfaitement au fonctionnement de Backbone: vous devez faire des choses qui vous plaisent vouloir.

Si vous souhaitez utiliser un framework JavaScript MVC basé sur des opinions comme AngularJs, vous êtes au mauvais endroit. Il y a d'autres CMS comme OctoberCMS, Drupal8, etc. qui sont bien meilleurs pour fournir une base pour cela. WordPress vous obligerait à créer un ensemble personnalisé de points de terminaison Rewrite dans lesquels vous pouvez renvoyer des ensembles de données pour vos contrôleurs JS.

3
kaiser