8 avril 2020

nodejs & wordpress : publier un article avec une image

Par ghaliano

API WordPress à quoi sert ?

Api rest wordpress

L’api rest wordpress est un réel avantage apparu depuis la version 3.5, enfin l’api existait et une nette amélioration débarque à partir de la version 4.7

Pour tester le bon fonctionnement de l’api REST sur votre site wordpress allez vers l’uri suivante /wp-json/ normalement vous allez voir un code json qui s’affiche.

Le problème

Appelé « featured_image », il est possible d’ajouter un article wordpress avec une image à partir de la bibliothèque en utilisant l’api wordpress.

expliquant brièvement le problème: je dois récupérer une image distante à partir d’une url, et créer en conséquence un article wordpress avec la fameuse « featured image »

La solution

Brief, pour l’ajout de l’image j’avoue que j’ai un peux galérer avant de trouver une solution vu le manque d’information dans la doc, allons voir le code.

Ce code utilise nodejs et le module WPAPI qui facilite énormément la tâche et j’ai du passer par 4 bonnes étapes.

Se connecter à l’API

Pour se connecter à l’api, j’ai utilisé le plugin « Application password » permettent l’authentification via des systèmes non interactifs, tels que XMLRPC ou l’API REST, sans fournir votre mot de passe réel. Les mots de passe d’application peuvent être facilement révoqués. Ils ne peuvent pas être utilisés pour les connexions traditionnelles à votre site Web.
Vous devez tout d’abord génerer le mot de passe d’accèes

Génerer un mot de passe d’accèes pour votre utilisateur
var wp = new WPAPI({
        endpoint: "URL-VOTRE-SITE/wp-json",
        username: username,
        password: password,
        auth: true
    });

Récupérer le contenu de l’image distante

C’est assez simple, en utilisant le module request, on pourra facilement récupérer le contenu binaire d’une image distante

request
        .defaults({ encoding: null })
        .get(ad.picture, function (merror, mresponse, mbody) {
        console.log(mbody);
})

Insérer l’image puis récupérer son ID

Uploader le fichier et créer le média dans la bibliothèque

wp.media()
            .file( mbody, 'image.jpg')
            .create({
                title: ad.title,
                alt_text: ad.description,
                caption: 'Image de l\'annonce',
                description: ad.description
            }).then(function(response){
                
            }).catch(function( err ) {
                console.log(err);
            })

Insérer l’article

et finalement insérer l’article

var wp_post = {
                    'title': ad.title,
                    'status': 'publish',
                    'content': ad.description,
                    'excerpt' : ad.title,
                    'featured_media': response.id
                };
                wp.posts().create(wp_post).then(function( response ) {
                    process.exit(22);
                }).catch(function( err ) {
                    console.log(err);
                });

Le code complet

var wp = new WPAPI({
        endpoint: params.wp_api_endpoint,
        username: params.wp_username,
        password: params.wp_password,
        auth: true
    });

    request
        .defaults({ encoding: null })
        .get(ad.picture, function (merror, mresponse, mbody) {
        if (!merror && mresponse.statusCode == 200) {
            wp.media()
            .file( mbody, 'image.jpg')
            .create({
                title: ad.title,
                alt_text: ad.description,
                caption: 'Image de l\'annonce',
                description: ad.description
            }).then(function(response){
                var wp_post = {
                    'title': ad.title,
                    'status': 'publish',
                    'content': ad.description,
                    'excerpt' : 'Read this awesome post',
                    'featured_media': response.id
                };
                wp.posts().create(wp_post).then(function( response ) {
                    process.exit(22);
                }).catch(function( err ) {
                    console.log(err);
                });
            }).catch(function( err ) {
                console.log(err);
            })
        }
    });