Fermer

avril 9, 2018

Connecter Angular et l'API WordPress avec wp-api-angular –


Dans ce tutoriel, vous apprendrez à travailler avec la bibliothèque wp-api-angular qui vous permet d'interagir avec l'API WordPress de Angular 2+ applications. Cette bibliothèque prend en charge toutes les ressources WP, y compris les utilisateurs, les publications, les commentaires, les médias, les taxonomies, etc. Elle est également très simple à utiliser, vous obtiendrez l'idée en un rien de temps.

va coder les caractéristiques suivantes:

  • Authentification utilisant JWT
  • Liste des utilisateurs
  • Liste des messages
  • Création et édition des messages
  • Suppression des messages

À la fin de l'article, vous Je vais me familiariser avec cette bibliothèque et je serai prêt à l'utiliser par vous-même.

Le code source de ce tutoriel est disponible sur GitHub .

Je suppose que vous utilisez Angular 5, mais tous les concepts expliqués devraient aussi être valables pour Angular 2.

Laying Foundations

Configuration de WordPress

Avant de commencer à écrire le code, il y a quelques choses à prendre en compte. Tout d'abord, notez que l'API que nous allons utiliser ne fonctionne qu'avec la version auto-hébergée de WordPress . Pour la version Web (qui peut être configurée via le site WordPress ), il existe une API distincte qui comporte de nombreux concepts similaires, bien que ce soit encore assez différent.

Vous devez également activer les permaliens pour que le client API fonctionne correctement. Pour Nginx, vous devrez ajouter la ligne suivante au fichier nginx.conf :

 try_files $ uri $ uri / /index.php?$args;

Des informations plus détaillées et des explications sur la façon d'activer les permaliens peuvent être trouvées dans ce guide du Codex WordPress .

Enfin, nous devrions prendre soin de WordPress security qui, comme ils dire, est avant tout. Pour cela, un plugin spécial appelé Authentification JWT est requis. Nous allons l'utiliser pour authentifier notre client API à l'aide de jetons spéciaux (une approche assez courante ces temps-ci).

C'est à peu près tout. Si vous souhaitez en savoir plus sur l'API WordPress en général, parcourez cet article . Lorsque vous êtes prêt, passez à l'étape suivante et voyons le client Angular WordPress en action!

Bootstrapping une application angulaire

Maintenant que nous avons préparé WordPress, créez une nouvelle application Angular en exécutant:

 ng nouveau wp-api

Cela va créer un squelette pour l'application. Nous n'allons pas discuter de sa structure à fond, mais vous pouvez trouver plus d'informations dans notre série Angular .

Ensuite, cd dans le répertoire et installez la bibliothèque elle-même: [19659021] cd wp-api
npm install -g typings
npm installer wp-api-angular –save

Nous devons maintenant importer les composants appropriés dans le fichier src / app / app.module.ts :

 // ... autres importations
import {Http} à partir de '@ angular / http';
importer {HttpClientModule, HttpClient} à partir de '@ angular / common / http';
import {
  WpApiModule,
  WpApiLoader,
  WpApiStaticLoader
} à partir de 'wp-api-angular';

WpApiModule doit également être ajouté au bloc imports . Notez que nous devons utiliser une fabrique exportée pour AoT compilation ou Ionic :

 // ... imports

@NgModule ({
  déclarations: [
        // ... omitted
  ],
  importations: [
    BrowserModule,
    FormsModule,
    HttpClientModule, // <---
    WpApiModule.forRoot({ // <---
      provide: WpApiLoader,
      useFactory: (WpApiLoaderFactory),
      deps: [Http]
    })

  ]
    // ...
})

Voici la fabrique elle-même:

 fonction d'export WpApiLoaderFactory (http: Http) {
  retourne un nouveau WpApiStaticLoader (http, 'http: // VOTRE_DOMAIN_HERE / wp-json / wp / v2 /', '');
}

N'oubliez pas de fournir votre propre nom de domaine ici!

Ajoutons enfin quelques imports au fichier app.components.ts :

 import {Component} from '@ angulaire / noyau ';
import {Observable} à partir de 'rxjs';
importer {NgForm} à partir de '@ angular / forms';
importer {HttpClientModule, HttpClient} à partir de '@ angular / common / http';
importez {En-têtes} à partir de '@ angular / http';

// ...

Nous aurons besoin de NgForm pour créer des formulaires, des modules HTTP pour interagir avec l'API et Headers pour authentifier le client.

La configuration initiale est terminée et nous pouvons continuer à la section suivante

Authentification

Avant d'interagir avec l'API, nous devons introduire un mécanisme d'authentification . Comme je l'ai déjà mentionné ci-dessus, une authentification basée sur des jetons sera utilisée, ajoutons donc une variable token à la classe d'application app.components.ts :

 exportComponent {
    jeton = null;
    // ...
}

Aussi, modifiez le fichier app.component.html en ajoutant un nouveau bloc:

  
  

Pour que cela fonctionne, un composant séparé est requis afin de le générer maintenant:

 ng generate authentication

Importez les modules nécessaires dans le fichier src / app / authentication / authentication.component.ts :

 import {Component, OnInit, Entrée, Sortie, EventEmitter} à partir de '@ angular / core' ;
importer {HttpClientModule, HttpClient} à partir de '@ angular / common / http';
// ...

Le processus d'authentification va être très simple: un utilisateur doit entrer son identifiant et son mot de passe, soumettre le formulaire, et un jeton spécial sera retourné si les informations d'identification sont correctes. Ce jeton sera ensuite utilisé pour effectuer des requêtes d'API. Par conséquent, rédigeons un utilisateur et ajoutons une entrée et une sortie pour AuthenticationComponent :

 // ...
classe d'exportation AuthenticationComponent implémente OnInit {
  utilisateur = {
    s'identifier: '',
    mot de passe: ''
  }
  Jeton @Input ();
    @Output () tokenChange = nouvel EventEmitter  ();

    // ...
}

Bien sûr, vous pouvez définir l'utilisateur comme un modèle, mais pour les besoins de cette démo, ce n'est pas obligatoire. Comme pour le constructeur, passez le HttpClient :

 // ...
constructeur (http privé: HttpClient) {}

Ensuite, codez la méthode auth . C'est aussi simple que d'envoyer une requête POST à ​​l'URL correcte avec les informations d'identification et d'attendre la réponse:

 // ...
auth () {
  this.http.post ('http: // VOTRE_DOMAIN / wp-json / jwt-auth / v1 / jeton', {
    nom d'utilisateur: this.user.login,
    mot de passe: this.user.password
  }). subscribe ((données) => {
    if (data ['token']) {// si le jeton est renvoyé
      this.token = données ['token'];
      this.tokenChange.emit (this.token);
    }
  });
}

Encore une fois, n'oubliez pas d'insérer votre nom de domaine dans l'URL.

Le composant est prêt, et la dernière chose à faire dans cette section est de créer le formulaire correspondant. Il ne devrait s'afficher que si le jeton est null . Lorsque le formulaire est soumis, la méthode auth doit être appelée:

  

Fouille le formulaire en ajoutant deux champs et un bouton Soumettre :

C'est tout! La fonctionnalité d'authentification est terminée, et nous pouvons commencer à jouer avec l'API

Liste des utilisateurs

Habituellement, la lecture via l'API est plus simple que l'écriture, essayons donc de lister les utilisateurs de notre site. Créer un nouveau composant UserList :

 ng générer une liste d'utilisateurs de composants

Dans le fichier src / app / user-list / user-list.component.ts vous devez importer le module WpApiUsers ainsi que d'autres modules: [19659026] import {Component, OnInit, Input} à partir de '@ angular / core';
import {WpApiUsers} à partir de 'wp-api-angular';
importez {En-têtes} à partir de '@ angular / http';
// ...

Nous allons stocker les utilisateurs dans le tableau des utilisateurs qui est vide d'initiallité:

 // ...
classe d'exportation UserListComponent implémente OnInit {
    utilisateurs = [];
}

Passez WpApiUsers dans le constructeur et appelez une méthode getUserList :

 // ...
constructeur (wpApiUsers privé: WpApiUsers) {
  this.getUserList ();
}

Maintenant, nous devons coder le getUserList . Chaque méthode présentée par le client API retourne une observable qui peut être convertie en promesse en utilisant to Promise . Donc, pour obtenir une liste de tous les utilisateurs, nous devrions appeler la méthode getList la convertir en promesse et affecter la variable users au tableau retourné:

 //. ..
getUserList () {
  this.wpApiUsers.getList ()
  .promettre()
  .then (réponse => {
    let json: any = réponse.json ();
    this.users = json;
  })
}

Comme vous le voyez, rien de complexe ici. Fait intéressant, nous n'avons même pas besoin d'un jeton pour exécuter cette méthode. Par conséquent, rendez simplement les utilisateurs dans un cycle:

Utilisateurs:

Nom: {{user.name}}   

Le composant liste d'utilisateurs doit être ajouté au fichier app.component.html :


Travailler avec des publications

Créer des publications

Essayons maintenant de implémenter une fonctionnalité un peu plus complexe et permettre aux utilisateurs d'ajouter de nouveaux messages via l'API. Créer un composant post-nouveau distinct:

 ng générer un composant post-nouveau

Importez les modules nécessaires dans le fichier filesrc / app / post-new / post-new.component.ts :

 import {Component, OnInit, Input} à partir de '@ angular / core' ;
importer {WpApiPosts} à partir de 'wp-api-angular';
importez {En-têtes} à partir de '@ angular / http';
// ...

Le module WpApiPosts va être l'étoile principale ici

Ensuite, fournissez le jeton en entrée et rédigez un modèle post :

 // ...
la classe d'exportation PostNewComponent implémente OnInit {
  Jeton @Input ();
  new_post = {
    Titre: '',
    contenu: '',
    statut: 'publier'
    }
}

À tout le moins, chaque message devrait contenir un titre, du contenu et le statut (que nous codons en dur publions pour publier instantanément le nouveau message).

Un constructeur devrait accepter les WpApiPosts :

 // ...
constructeur (private wpApiPosts: WpApiPosts) {}

Maintenant, créons une méthode pour ajouter le message. Tout d'abord, codez la logique d'authentification en définissant l'en-tête Autorisation :

 // ...
createPost () {
  let headers: En-têtes = nouveaux en-têtes ({
    «Autorisation»: «Porteur» + this.token
    });
}

Maintenant nous pouvons simplement prendre la variable headers et la passer à la méthode create du module WpApiPosts :

 // ...
createPost () {
  let headers: En-têtes = nouveaux en-têtes ({
    «Autorisation»: «Porteur» + this.token
  });

  this.wpApiPosts.create (this.new_post, {en-têtes: en-têtes})
  .promettre()
  .then (réponse => {
    console.log (réponse);
  })
}

Qu'en est-il du formulaire? Eh bien, c'est assez simple vraiment:


Post Creation

    

Lorsque le formulaire est soumis, nous appelons la méthode createPost .

N'oubliez pas de rendre le composant post-nouveau :



Veuillez autoriser à créer un message

  

Nous vérifions que le jeton est activé, et sinon, nous demandons à l'utilisateur de s'authentifier.

Liste des messages

Bon, nous avons ajouté la possibilité de créer les messages. Pourquoi ne les affichons-nous pas aussi sur la page? Créez encore un autre composant:

 ng generate post-list de composant

Importez les modules nécessaires, y compris WpApiPosts dans le fichier src / app / post-list / post-list.component.ts :

 import {Component, OnInit, Entrée} à partir de '@ angular / core';
importer {WpApiPosts} à partir de 'wp-api-angular';
importez {En-têtes} à partir de '@ angular / http';
// ...

Fournissez l'entrée et le tableau posts :

 // ...
classe d'exportation PostListComponent implémente OnInit {
  Jeton @Input ();
    messages = [];
}

Codez le constructeur qui devrait appeler la méthode getPosts :

 // ...
constructeur (private wpApiPosts: WpApiPosts) {
  this.getPosts ();
}

Nous n'avons pas besoin d'authentifier pour aller chercher les messages, alors utilisons la même approche que précédemment:

 // ...
getPosts () {
  this.wpApiPosts.getList ()
  .promettre()
  .then (réponse => {
    let json: any = réponse.json ();
    this.posts = json;
  });
}

Maintenant rendre le tableau des messages:


Latests Messages:

  
  
    

    

    
  

Enfin, affiche le composant:



Détruire les poteaux

Ensuite, j'aimerais ajouter une capacité à détruire les poteaux. Cette fonctionnalité peut être implémentée dans le même composant PostList . Il suffit d'ajouter un bouton Supprimer à côté de chaque message:


Latests Messages:


    
  

Notez que ce bouton est affiché uniquement si le jeton est présent. En outre, modifiez le composant en ajoutant la méthode deletePost :

 // src / app / post-list / post-list.component.ts
// ...
deletePost (id: numéro, index: numéro) {
  let headers: En-têtes = nouveaux en-têtes ({
    «Autorisation»: «Porteur» + this.token
  });

  this.wpApiPosts.delete (id, {headers: headers})
  .promettre()
  .then (réponse => {
    if (réponse ['ok'] == true) {
      this.posts.splice (index, 1);
    }
  })
}

Fondamentalement, rien de nouveau ici. Nous ajoutons le jeton aux en-têtes et appelons la méthode delete qui accepte l'ID du poste et son index dans le tableau posts . Si la requête réussit, supprimez le message du tableau.

Modification des messages

La dernière fonctionnalité que nous allons présenter aujourd'hui est la possibilité de modifier les messages. Créons un nouveau composant:

 ng generate post-edit

Ce composant sera référencé à partir de PostList . Plus précisément, je voudrais ajouter un bouton Modifier à côté de chaque publication et afficher le modèle PostEdit dès que l'on clique dessus:


Latests Messages:


    
  
  

Modifiez le PostListComponent en introduisant une variable editingPost et une méthode updatePost qui va affecter le editingPost à un valeur:

 // src / app / post-list / post-list.component.ts
// ...
classe d'exportation PostListComponent implémente OnInit {
  Jeton @Input ();
  messages = [];
    editingPost = null;

    updatePost (publication) {
      this.editingPost = poste;
    }
}

Passez au PostEditComponent et importez tous les modules requis:

 // src / app / post-edit / post-edit.component.ts
importer {Composant, OnInit, Entrée, EventEmitter, Sortie} à partir de '@ angular / core';
importer {WpApiPosts} à partir de 'wp-api-angular';
importez {En-têtes} à partir de '@ angular / http';
// ...

Ce composant va avoir deux entrées: le jeton et le post actuel à éditer. En outre, nous aurons une sortie ( EventEmitter ):

 // ...
la classe d'exportation PostEditComponent implémente OnInit {
  Jeton @Input ();
  @Input () post;
  @Output () finish = new EventEmitter  ();
  post_edit = {
    Titre: '',
    contenu: ''
    }
}

Dès que le composant est initialisé, affectez la variable post_edit avec le titre et le contenu appropriés tirés de la variable post :

 // ...
ngOnInit () {
  this.post_edit ['title'] = this.post.title.rendered;
  this.post_edit ['content'] = this.post.content.rendered;
}

Maintenant, codez la méthode updatePost qui va effectuer l'authentification. Mettre à jour le message et émettre un événement:

 // ...
updatePost () {
  let headers: En-têtes = nouveaux en-têtes ({
    «Autorisation»: «Porteur» + this.token
  });

  this.wpApiPosts.update (this.post.id, this.post_edit, {en-têtes: en-têtes})
  .promettre()
  .then (réponse => {
    this.finish.emit (null);
  })
}

Notez que la méthode de mise à jour accepte à la fois l'identifiant du message et la nouvelle valeur du titre et du contenu.

Voici le formulaire pour modifier le post:


Post Editing

    

Voilà: la fonction d'édition est prête! Vous pouvez maintenant démarrer le serveur en exécutant:

 ng serve --open

et jouez avec l'application pour vous assurer que tout fonctionne correctement.

Conclusion

Dans cet article, nous avons discuté de l'utilisation du client API WordPress pour Angular. Nous l'avons vu en action en introduisant la fonction d'authentification, en répertoriant les utilisateurs et les publications, ainsi qu'en ajoutant la possibilité de créer et de manipuler les publications. Ce client vous permet de travailler avec d'autres ressources comme les médias et les commentaires, mais toutes ces interactions sont très similaires à celles dont nous avons parlé ici.

J'espère que vous êtes maintenant prêt à appliquer les informations présentées ici, mais n'hésitez pas à m'envoyer vos questions! Comme toujours, merci de rester avec moi et jusqu'à la prochaine fois.




Source link