Node.js: inserimento di nuovi prodotti in WooCommerce utilizzando le REST API

Node.js: inserimento di nuovi prodotti in WooCommerce utilizzando le REST API

In questo articolo proseguiamo il nostro discorso mostrando come creare un nuovo prodotto in WooCommerce utilizzando le REST API e Node.js.

Per creare il form di inserimento abbiamo bisogno dell'elenco delle categorie presenti nello store.

Aggiungiamo quindi un metodo alla nostra classe API:

static categories() {
    return WooCommerce.get('/products/categories');
}

A questo punto definiamo il metodo da associare alla nostra route:

product: (req, res) => {
    req.API.categories().then(data => {
            res.render('product', {
                title: 'New product | WooCommerce Node',
                categories: data.product_categories
            });
        }).catch(err => {
            res.redirect('/dashboard');
        });
}

Nel form definiamo la select box in questo modo:

<div class="form-group">
            <select name="category" class="form-control">
                <option value="">Category</option>
                <% categories.forEach(function(category) { %>

                <option value="<%= category.id %>"><%= category.name %></option>

                <% }); %>
            </select>
        </div>

Attiviamo la nostra route in app.js:

app.get('/dashboard/products/new', routes.product);

Ora dobbiamo creare un metodo nella nostra classe per effettuare una richiesta POST alle API REST:

static product(data) {
    return WooCommerce.post('products', data);
}

L'argomento passato è un oggetto letterale contenente il nome del prodotto, il prezzo, la descrizione, la descrizione breve e la categoria scelta.

In questo caso il metodo restituisce una Promise essendo stata omessa la funzione di callback.

Ora definiamo la route che gestirà l'invio del form di inserimento:

createProduct: (req, res) => {
    let form = req.body;
    let data = {
        name: form.name,
        type: 'simple',
        regular_price: form.regular_price,
        description: form.description,
        short_description: form.short_description,
        categories: [
            {
                id: parseInt(form.category, 10)
            }
        ]
    };
    req.API.product(data).then(success => {
        res.redirect('/dashboard/products');
    }).catch(err => {
       res.json(err);
    });
}

Abbiamo omesso la validazione del form per brevità, ma i criteri sono:

  • name: non può essere vuoto
  • regular_price: stringa decimale nel formato nn.nn
  • ID categoria: numero intero

Potete aiutarvi nella validazione installando il modulo validator:

npm install validator --save

Attenzione: questo modulo opera unicamente sulle stringhe e restituisce un errore se l'argomento passato ad uno dei suoi metodi non è una stringa. Esempio d'uso nel nostro caso:

const validator = require('validator');

//...

createProduct: (req, res) => {
    let form = req.body;
    let errors = [];

    if(validator.isEmpty(form.name)) {
        errors.push('Il nome è richiesto');
    }
    if(!validator.isDecimal(form.regular_price)) {
        errors.push('Formato prezzo non valido');
    }
    if(!validator.isInt(form.category)) {
        errors.push('Categoria non valida');
    }
    if(errors.length > 0 ) {
       res.json(errors);
    } else {   
    let data = {
        name: form.name,
        type: 'simple',
        regular_price: form.regular_price,
        description: form.description,
        short_description: form.short_description,
        categories: [
            {
                id: parseInt(form.category, 10)
            }
        ]
    };
    req.API.product(data).then(success => {
        res.redirect('/dashboard/products');
    }).catch(err => {
       res.json(err);
    });
    }
}

Consultate la pagina ufficiale del modulo per un elenco completo dei metodi di validazione disponibili.

Non ci resta a questo punto che attivare la nostra route:

app.post('/dashboard/products/new', routes.createProduct);

Conclusione

Abbiamo visto come creare un prodotto semplice utilizzando le REST API di WooCommerce e Node.js. Nei prossimi articoli vedremo come gestire meglio i prodotti.

Torna su