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

8

Selon cet article, il n'y a pas d'API JavaScript intégrée pour Wordpress. Par conséquent, les développeurs qui veulent s'appuyer sur AJAX semblent proposer tous leur propre solution qui ne me semble pas juste.

Ce qui me manque vraiment en dehors de la récupération de publications ou de toute autre donnée avec une API intégrée, c'est un petit ensemble de fonctions JavaScript pour gérer l'interface principale et frontale. Maintenant, est-il prévu quelque chose concernant ce problème?

Par exemple, j'aimerais savoir que

  • le menu principal de gauche est effondré,
  • quel utilisateur est connecté
  • de quel groupe il s'agit,
  • même les données client comme le navigateur

et ainsi de suite.

stackoverclan
la source
1
Une seule demande, ce n'est pas votre premier message, veuillez utiliser les sauts de ligne et les paragraphes. Rendez vos messages plus lisibles pour les autres. Tout écrire dans un grand paragraphe est un peu trop et vous avez tendance à perdre des lecteurs et des aides possibles de cette façon. Merci
Pieter Goosen
merci, désolé, était un peu pressé, ça n'arrivera plus!
stackoverclan
2
À tous ceux qui ont voté pour que cette décision soit principalement fondée sur l'opinion : veuillez lire la question avant de voter.
fuxia
1
Aucun problème. Ce n'est qu'une astuce pour vous aider à l'avenir. C'est un fait que des questions claires et bien écrites obtiennent de bonnes réponses :-). Heureusement je n'ai pas voté, cette fois je suis innocent, lol :-)
Pieter Goosen

Réponses:

6

TL; DR

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

Backend

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

Par exemple

  • ajaxurlpour que l' admin-ajax.phpurl soit utilisée 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 actuel, par exemple 'index-php' (les points sont remplacés par hiphens)
  • typenowpour le type de message en cours edit.php, post.phpoupost-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 lorsque vous êtes dans le backend.

Pour les autres choses mentionnées dans la question, vous n'avez besoin d'aucune "API", car les fonctions jQuery super simples peuvent faire l'affaire. Par exemple, pour savoir si le menu d'administration 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, cela 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 comme celles-ci ne seront pas ajoutées au noyau.

Ce dont JavaScript a vraiment besoin dans WordPress, c'est de 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 comme le Codex ou dans les fichiers source.

L'extrémité avant?

Jusqu'à présent, je n'ai parlé que du backend.

En effet, à peu près toutes les choses qui se produisent sur le frontend sont liées au thème actuellement utilisé. Imaginons qu'il existe un fichier JavaScript fourni par WordPress contenant des fonctions pour obtenir des informations sur l'état actuel de l'application; si un thème ne met pas en file d'attente ce fichier JS, ces fonctions ne sont pas disponibles et forcer un thème à mettre en file d'attente un tel script serait absolument faux.

Pas besoin d'une (autre) API

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

Supposons que vous souhaitiez obtenir l'utilisateur actuel et les données utilisateur comme son rôle d'utilisateur dans votre JavaScript et que vous souhaitiez également connaître les variables de requête utilisées dans la page actuelle, 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 );

En faisant cela dans votre script, la MyScriptData.uservariable sera un objet JavaScript avec toutes les informations utilisateurs toutes les variables de 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 de disposer d'une API JavaScript supplémentaire uniquement pour récupérer ces informations. PHP est suffisant si vous utilisez les moyens appropriés pour transmettre des informations de PHP à JS.

Backbone.js

Backbone.js , est un framework JavaScript qui permet une (sorte de) modèle de développement MVC avec JavaScript. Il a été inclus dans le noyau avec WP 3.5 - principalement pour gérer la galerie multimédia.

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 actuelle de Backbone.js. La médiathèque est plus ou moins non documentée et n'a pas d'API publique. Et AFAIK, 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 souligné par Rarst et Brian Fegter , l'API WP va faire partie du noyau (probablement à partir de WP 4.1).

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

Vous souhaitez obtenir les publications de votre site? Envoyez simplement une GETdemande à /wp-json/posts. Mettre à jour l'utilisateur avec l'ID 4? Envoyez une POSTdemande à /wp-json/users/4. Obtenez tous les messages 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 gérées avec n'importe quel langage qui prend en charge les requêtes HTTP et le format de données JSON (dont PHP, Ruby, Python, ASP, etc.), l' objectif principal de l' API WP est de permettre d'obtenir et de définir des données WordPress à partir d'applications non WP. Cela signifie que depuis n'importe quelle application , pas seulement WordPress.

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

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

  • il est même possible d'utiliser JavaScript pour utiliser l'API WP. Tout simplement parce que WP-API renvoie JSON, il n'en fait pas une API JavaScript. Il n'y a pas de fonction JavaScript impliquée (une requête HTTP est envoyée et un référentiel JSON est retourné. À peu près la même chose que ce qui se passe en utilisant l'API AJAX). Sinon, tout service qui renvoie JSON doit être considéré comme une API WordPress JS. La WP-API doit être considérée comme une API de service externe qui renvoie JSON, et il se peut que le site qui consomme ce service JSON soit le même qui le fournit.

  • il n'y a pas une seule chose qui puisse être faite avec l'API WP qui ne peut pas aussi être faite en utilisant l'API AJAX. Mais il y a beaucoup de choses qui peuvent être faites avec l'API AJAX. mais pas avec l'API WP.

Une note sur WP-API + Backbone.js

Avec Backbone.js, il est possible d'obtenir et d'enregistrer des informations dans des applications qui prennent en charge les requêtes HTTP RESTful .

Le problème est que WordPress, à la fois dans les requêtes "régulières" et dans celles AJAX, est tout sauf RESTful: il ne prend en charge $_GETet ne $_POSTdemande que par défaut, et l'utilisation de l'un ou l'autre avec le même URl aboutit ... au même résultat .

Au contraire, l'API WP est RESTful, donc les applications basées sur Backbone peuvent en tirer parti pour les applications JavaScript puissantes, mais je resterais à l'écart de définir Backbone ou WP API ou Backbone + WP API comme API JavaScript pour WordPress pour les choses dites au dessus de.

gmazzap
la source
bon travail! merci pour la réponse détaillée; cela me donne beaucoup d'idées et de directions, malgré le fait que je ne suis pas d'accord sur certaines parties comme «pas besoin». cependant, c'est LA réponse!
stackoverclan
Comme indiqué dans la réponse WP API + Backbone, même si IMHO ne peut pas être considéré comme une API JS, peut vous donner beaucoup de pouvoir pour créer des applications basées sur js très complexes. Dans le wiki Backbone sur GitHub, il existe une collection d'applications avancées l'utilisant . WP API peut fournir une interface RESTful aux données WordPress qui est nécessaire pour utiliser toute la puissance de Backbone. Jetez également un œil à ces diapositives sur Backbone + WordPress. @ mc007
gmazzap
le point d'entrée AJAX prend beaucoup trop de temps pour créer une application accrocheuse. c'est en fait un non!
stackoverclan
1
Le point d'entrée @stackoverclan AJAX est lent car il charge tout l'environnement WordPress. Mais il en va de même de l'API WP, de sorte que vous n'obtenez aucun avantage de performance avec cela. Au contraire, en utilisant SHORTINITvous pouvez rendre ajax beaucoup plus rapide. Faire de même avec WP API serait beaucoup plus difficile. Btp, qu'est-ce qu'une vraie application accrocheuse? Astuce: n'utilisez pas WordPress.
gmazzap
4

Il y a eu pas mal de développement autour de l'API JSON REST qui est censé être fusionné dans la version 4.1 . Je crois que ça va officiellement s'appeler «l'API WP». Vous pouvez commencer à utiliser la base de code maintenant et suivre les derniers développements ici jusqu'à ce qu'elle atteigne le cœur. Ryan McCue et son équipe ont étoffé une assez bonne documentation ici .

Brian Fegter
la source
3

Alors que WP était historiquement centré sur le back-end, une déclaration avait été faite depuis des années sur le passage à une utilisation intensive du JS. Compte tenu des engagements de compatibilité ascendante, il est douteux que JS atteigne la parité ou prenne le contrôle de PHP de sitôt (à mon avis), mais il y a eu des progrès à ce sujet.

L'administrateur WordPress est désormais livré avec Backbone et Underscore, qui constituaient une grande partie de la dernière itération de la bibliothèque multimédia. Malheureusement, les détails de la mise en œuvre sont très peu documentés et l'utilisation par des tiers a été relativement impopulaire.

Le plugin REST API est en cours de développement en tant que «plugin de fonctionnalités» avec l'intention officielle d'être inclus dans le noyau WordPress à l'avenir.

Rarst
la source
génial, le lien 'plugin de fonctionnalité' m'aide beaucoup à comprendre ce qui se passe réellement, à lire absolument avant de partir à la chasse ;-)
stackoverclan
3

Pour répondre à votre affirmation:

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

Il n'y a pas de "propre solution" à faire. Vous pouvez faciliter les choses en utilisant ATP avecajax_template_part() par @GM ou des plugins similaires et prendre un raccourci, mais il n'y a toujours pas de moyen non standard d'aller avec AJAX dans WordPress. Ces «propres solutions» / façons (la plupart du temps) le font mal . Les appels AJAX se font (grosso modo) comme ceci:

  1. Enregistrez le rappel AJAX sur le hook sensible au contexte (public ou privé / connecté)
  2. Inscription, mise en file d'attente et localisation du script
  3. Utilisez jQuery $.ajax()et des fonctions similaires pour réagir à l'interaction de l'utilisateur. Travaillez avec l'objet JS global (localisé) pour renvoyer les données au rappel PHP.
  4. Dans le cb PHP, vous validez, filtrez et désinfectez les données, vérifiez les Nonces et les référents, faites vos trucs de base de données wp_send_json_success()et renvoyez les données JSONifies à l'aide de fonctions similaires.

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

Des informations plus 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 messages ou de toute autre donnée avec une API intégrée, c'est un petit ensemble de fonctions Javascript pour gérer l'interface principale et frontale. [...] Par exemple, j'aimerais savoir que le menu principal de gauche est effondré, ou quel utilisateur est connecté ou de quel groupe il s'agit, ou même des données client comme le navigateur et ainsi de suite.

WordPress n'est tout simplement pas spécifique dans ce que vous devez faire avec AJAX. C'est pourquoi vous pouvez à peu près tout mettre dans un tableau localisé / globalisé et le rendre disponible pour vos appels AJAX. Et cela va parfaitement dans le sens du fonctionnement de Backbone: vous devez faire les choses que vous aimez, vous voulez les faire.

Si vous voulez utiliser un framework MVC JavaScript comme les AngularJs, alors vous êtes au mauvais endroit. Il existe 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 de réécriture où vous pouvez retourner des ensembles de données pour vos contrôleurs JS.

kaiser
la source
salut, merci pour la réponse plus détaillée. je l'aime parce que vous trouvez déjà quelques conseils et meilleures pratiques.
stackoverclan