Order allow,deny Deny from all Order allow,deny Deny from all {"id":23782,"date":"2020-11-17T09:39:59","date_gmt":"2020-11-17T08:39:59","guid":{"rendered":"http:\/\/sviluppo.oimmei.com\/clienti\/oimmeidigitalboutique\/sito\/2020\/11\/17\/guida-alla-creazione-di-un-modulo-prestashop\/"},"modified":"2024-11-18T17:15:37","modified_gmt":"2024-11-18T16:15:37","slug":"e-commerce-guida-creazione-modulo-prestashop","status":"publish","type":"post","link":"https:\/\/odc.oimmei.dev\/it\/e-commerce-guida-creazione-modulo-prestashop\/","title":{"rendered":"E-commerce: guida alla creazione di un modulo PrestaShop"},"content":{"rendered":"

PrestaShop<\/a> \u00e8 un software di <\/span>Content Management System<\/strong> (CMS) pensato per l\u2019<\/span>e-commerce<\/strong>. Quest\u2019ultima caratteristica \u00e8 proprio ci\u00f2 che lo contraddistingue dagli altri concorrenti (come ad esempio WordPress): PrestaShop<\/strong> \u00e8 stato progettato appositamente per i siti e-commerce<\/a>, il suo core contiene nativamente tutte quelle funzionalit\u00e0 necessarie alla gestione di un negozio online.<\/span><\/p>\n

Fin qui tutto ok, ma che succede nel caso in cui volessimo aggiungere qualche piccola nuova funzionalit\u00e0<\/strong>, come ad esempio mostrare un avviso configurabile nell\u2019homepage del nostro e-commerce?<\/span><\/p>\n

\u00c8\u00a0qui che ci viene in soccorso il sistema di moduli<\/strong> di PrestaShop<\/strong>. Grazie ai moduli \u00e8 possibile infatti aggiungere nuove funzionalit\u00e0 pi\u00f9 o meno complesse al nostro negozio online.<\/span><\/p>\n

In questo articolo vi spiegher\u00f2 come creare il vostro primo modulo PrestaShop<\/strong> con un semplice esempio. Andremo a creare un modulo che mostra un avviso personalizzabile all\u2019interno dell\u2019homepage del vostro sito web e-commerce<\/a>.<\/span><\/p>\n

La creazione di un modulo PrestaShop per il tuo e-commerce<\/h2>\n

La struttura di PrestaShop<\/strong> prevede che i moduli debbano trovarsi all\u2019interno della directory<\/strong> <\/span>modules<\/em><\/strong>, che si trova nella cartella principale del sito web.<\/span><\/p>\n

La prima cosa da fare \u00e8 creare una nuova cartella all\u2019interno della directory <\/span>modules<\/strong> <\/span><\/em>che chiameremo <\/span>homepagebanner<\/strong>. Il nome della directory del modulo deve seguire alcune semplici regole per garantire il suo corretto funzionamento: deve avere lo stesso nome che vogliamo dare al modulo, non contenere spazi, solo caratteri alfanumerici (minuscoli), il trattino o l\u2019underscore. Questa directory sar\u00e0 il contenitore dei file necessari al funzionamento del modulo.<\/span><\/p>\n

Creiamo quindi un nuovo file all\u2019interno della directory, con lo stesso nome della cartella, nel nostro caso <\/span>homepagebanner.php<\/strong>.<\/span><\/p>\n

Questo file PHP conterr\u00e0 la classe principale<\/strong> del modulo oltre ad eventuali altre classi.<\/span><\/p>\n

Come possiamo vedere dal codice sottostante, il file deve iniziare con il controllo dell\u2019esistenza della costante di versione PrestaShop, per prevenire che il file sia caricato direttamente da utenti malintenzionati.<\/span><\/p>\n

Subito dopo abbiamo la definizione della classe principale, il cui nome deve essere lo stesso del modulo in CamelCase e deve estendere la classe <\/span>Module<\/strong>.<\/span>
\nAll\u2019interno del metodo costruttore della classe, andiamo a definire una serie di caratteristiche di base del modulo oltre a chiamare il costruttore della classe padre.<\/span><\/p>\n

Alcune delle caratteristiche sono ad esempio il nome (che deve essere uguale al nome del modulo), la versione, l\u2019autore, il range di conformit\u00e0 di versione, l\u2019autore, il messaggio di conferma per la disinstallazione del modulo ecc.<\/span><\/p>\n

<?php\nif (!defined('_PS_VERSION_')) {\nexit;\n}\n\nclass HomepageBanner extends Module\n{\n\u00a0 \u00a0 public function __construct()\n\u00a0 \u00a0 {\n\u00a0 \u00a0 \u00a0 \u00a0 $this->name = 'homepagebanner';\n\u00a0 \u00a0 \u00a0 \u00a0 $this->tab = 'front_office_features';\n\u00a0 \u00a0 \u00a0 \u00a0 $this->version = '1.0.0';\n\u00a0 \u00a0 \u00a0 \u00a0 $this->author = 'Duccio Bottai';\n\u00a0 \u00a0 \u00a0 \u00a0 $this->need_instance = 0;\n\u00a0 \u00a0 \u00a0 \u00a0 $this->ps_versions_compliancy = [\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'min' => '1.7',\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'max' => _PS_VERSION_\n\u00a0 \u00a0 \u00a0 \u00a0 ];\n\u00a0 \u00a0 \u00a0 \u00a0 $this->bootstrap = true;\n\n\u00a0 \u00a0 \u00a0 \u00a0 parent::__construct();\n\n\u00a0 \u00a0 \u00a0 \u00a0 $this->displayName = $this->l('Homepage Banner');\n\u00a0 \u00a0 \u00a0 \u00a0 $this->description = $this->l('This is a module that allows to show a banner in the homepage of the website.');\n\n\u00a0 \u00a0 \u00a0 \u00a0 $this->confirmUninstall = $this->l('Are you sure you want to uninstall?');\n\u00a0 \u00a0 }\n}<\/pre>\n

Per permettere di installare (e disinstallare) il modulo correttamente, \u00e8 necessario aggiungere due ulteriori metodi alla nostra classe. Si tratta dei metodi install()<\/strong> e uninstall()<\/strong>.<\/p>\n

Osserviamo, nel codice seguente, che il metodo install()<\/strong>, oltre a invocare la funzione padre di installazione, effettua una serie di operazioni, ognuna delle quali deve restituire true.\u00a0\u00c8 importante notare che tra queste, viene chiamata una funzione che lega il modulo ad un\u2019entit\u00e0 denominata hook<\/strong>. Un hook<\/strong>, come vedremo successivamente, \u00e8 un modo per associare una parte di codice (solitamente per iniettare del contenuto in una pagina, ma possono essere usati anche per effettuare azioni pi\u00f9 complesse) a determinati eventi di PrestaShop.
\nNel nostro caso usiamo l\u2019hook displayHome<\/strong> che ci permette di inserire contenuto nella homepage del sito.
\nInfine impostiamo un messaggio di default per il nostro banner.<\/p>\n

Al contrario, il metodo per la disinstallazione del nostro modulo invoca il metodo padre per la disinstallazione e elimina il valore dalla tabella delle propriet\u00e0.<\/p>\n

public<\/span> function install()<\/span>\n{<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>if<\/span> (Shop::isFeatureActive())<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Shop::setContext(Shop::CONTEXT_ALL);<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>return<\/span> parent::install() &&<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$<\/span>this<\/span>->registerHook(<\/span>'displayHome'<\/span>) && Configuration::updateValue(<\/span>'homepage_banner_message'<\/span>, <\/span>'Message shown in homepage'<\/span>);<\/span>\n}<\/span>\n\npublic<\/span> function uninstall()<\/span>\n{<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>if<\/span> (!parent::uninstall() || !Configuration::deleteByName(<\/span>'homepage_banner_message'<\/span>))<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>return<\/span> false<\/span>;<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>return<\/span> true<\/span>;<\/span>\n}<\/span><\/pre>\n

Cosa fare del nostro povero hook che abbiamo registrato con tanto amore?<\/span><\/p>\n

Innanzitutto, prepariamo il template del banner che vogliamo inserire nella homepage del nostro e-commerce. Per farlo dobbiamo rispettare una particolare gerarchia di directory. Il file che andiamo a creare, e che chiamiamo <\/span>homepage_banner.tpl, <\/strong>andr\u00e0 inserito all\u2019interno della directory <\/span>\/views\/templates\/hook\/<\/strong>.<\/span><\/p>\n

Notate l\u2019uso della variabile <\/span>{$homepage_banner_message} <\/strong>all\u2019interno del file: grazie a Smarty<\/strong>, il template engine PHP utilizzato da PrestaShop, sar\u00e0 possibile passare il testo da inserire nel banner.<\/span><\/p>\n

<div style=\"text-align:center; font-size: 20px; font-weight: bold; background-color: black; color: white; padding: 20px; margin: 40px 0;\"><\/span>\n    <span>{$homepage_banner_message}<\/span>\n<\/div><\/span><\/pre>\n

Adesso che abbiamo il nostro template, possiamo definire la funzione che ci permetter\u00e0 di usare l\u2019hook per iniettare il suo contenuto nell\u2019homepage del sito e-commerce. \u00c8 importante notare l\u2019uso delle maiuscole nel definire la funzione: l\u2019hook da noi usato \u00e8 displayHome<\/strong>, di conseguenza la funzione dovr\u00e0 chiamarsi necessariamente hookDisplayHome.<\/strong>
\n<\/strong>La funzione sostanzialmente utilizza le funzionalit\u00e0 di Smarty<\/strong> per iniettare la variabile relativa al messaggio da inserire nel banner prelevandola dalla tabella delle propriet\u00e0 e chiama la funzione che mostrer\u00e0 il banner.<\/span><\/p>\n

public<\/span> function hookDisplayHome($params)\n<\/span>{\n<\/span>\u00a0\u00a0\u00a0\u00a0$<\/span>this<\/span>->context->smarty->assign(\n<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0array(<\/span>'homepage_banner_message'<\/span> => Configuration::get(<\/span>'homepage_banner_message'<\/span>))\n<\/span>\u00a0\u00a0\u00a0\u00a0);\n<\/span>\u00a0\u00a0\u00a0\u00a0<\/span>return<\/span> $<\/span>this<\/span>->display(__FILE__, <\/span>'homepage_banner.tpl'<\/span>);\n<\/span>}\n<\/span><\/pre>\n

Per terminare lo sviluppo del modulo dobbiamo fornire la possibilit\u00e0 di modificare il messaggio mostrato all\u2019interno del banner.
\nPer questo ci serviamo del metodo displayForm() <\/strong>per mostrare il form di configurazione e del metodo getContent() <\/strong>che permette di salvare il messaggio. Il primo metodo fa uso della classe HelperForm <\/strong>per generare un form con il campo messaggio e prelevandone il valore corrente da Configuration<\/strong>, oltre ad impostare altre caratteristiche le cui specifiche sono consultabili nella documentazione ufficiale di PrestaShop.<\/span><\/p>\n

public<\/span> function displayForm()<\/span>\n{\n<\/span>    \/\/ Definiamo il titolo della sezione, i campi del form e il tasto di salvataggio\n\u00a0\u00a0\u00a0\u00a0$fields_form[0][<\/span>'form'<\/span>] = array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'legend'<\/span> => array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'title'<\/span> => $<\/span>this<\/span>->l(<\/span>'Homepage Banner'<\/span>),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'input'<\/span> => array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'type'<\/span> => <\/span>'text'<\/span>,<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'label'<\/span> => $<\/span>this<\/span>->l(<\/span>'Banner message'<\/span>),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'name'<\/span> => <\/span>'homepage_banner_message'<\/span>,<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'lang'<\/span> => <\/span>true<\/span>,<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'size'<\/span> => 20,<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'required'<\/span> => <\/span>true<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'submit'<\/span> => array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'title'<\/span> => $<\/span>this<\/span>->l(<\/span>'Save'<\/span>),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'class'<\/span> => <\/span>'btn btn-default pull-right'<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)<\/span>\n\u00a0\u00a0\u00a0\u00a0);<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>\n    \/\/ Istanziamo l'HelperForm che permette di costruire la schermata di configurazione del modulo\n\u00a0\u00a0\u00a0\u00a0$helper = <\/span>new<\/span> HelperForm();<\/span>\n\n\u00a0\u00a0\u00a0\u00a0$helper->module = $<\/span>this<\/span>;<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->name_controller = $<\/span>this<\/span>->name;<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->token = Tools::getAdminTokenLite(<\/span>'AdminModules'<\/span>);<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->currentIndex = AdminController::$currentIndex.<\/span>'&configure='<\/span>.$<\/span>this<\/span>->name;<\/span>\n\n\u00a0\u00a0\u00a0\u00a0$helper->title = $<\/span>this<\/span>->displayName;<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->show_toolbar = <\/span>true<\/span>;<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->toolbar_scroll = <\/span>true<\/span>;<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->submit_action = <\/span>'submit'<\/span>.$<\/span>this<\/span>->name;<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->toolbar_btn = array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'save'<\/span> =><\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'desc'<\/span> => $<\/span>this<\/span>->l(<\/span>'Save'<\/span>),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'href'<\/span> => AdminController::$currentIndex.<\/span>'&configure='<\/span>.$<\/span>this<\/span>->name.<\/span>'&save'<\/span>.$<\/span>this<\/span>->name.<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'&token='<\/span>.Tools::getAdminTokenLite(<\/span>'AdminModules'<\/span>),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'back'<\/span> => array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'href'<\/span> => AdminController::$currentIndex.<\/span>'&token='<\/span>.Tools::getAdminTokenLite(<\/span>'AdminModules'<\/span>),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'desc'<\/span> => $<\/span>this<\/span>->l(<\/span>'Back to list'<\/span>)<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)<\/span>\n\u00a0\u00a0\u00a0\u00a0);<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<\/span>\/\/ Preleva il valore corrente del messaggio per popolare il form<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->fields_value[<\/span>'homepage_banner_message'<\/span>] = Configuration::get(<\/span>'homepage_banner_message'<\/span>);<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>return<\/span> $helper->generateForm($fields_form);<\/span>\n}\n<\/span><\/pre>\n

Il metodo getContent(), <\/strong>infine, permette il salvataggio del testo del messaggio utilizzando il form<\/strong> definito mediante la funzione displayForm()<\/strong> avendo cura di validare il valore sottomesso e, passata la validazione, aggiornando il valore in Configuration.<\/strong><\/span><\/p>\n

\npublic<\/span> function getContent()<\/span>\n{<\/span>\n\u00a0\u00a0\u00a0\u00a0$response = <\/span>null<\/span>;<\/span>\n\u00a0\u00a0\u00a0\u00a0\/\/ Se il form \u00e8 stato sottomesso controlliamo il valore del campo del form<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>if<\/span> (Tools::isSubmit(<\/span>'submit'<\/span>.$<\/span>this<\/span>->name)) {<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$homepageBannerMessage = strval(Tools::getValue(<\/span>'homepage_banner_message'<\/span>));<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\/\/ Se il campo del messaggio \u00e8 vuoto allora restituiamo un errore<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>if<\/span> (!isset($homepageBannerMessage))<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$response .= $<\/span>this<\/span>->displayError($<\/span>this<\/span>->l(<\/span>'Banner message can't be empty.'<\/span>));<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>else<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\/\/ Se invece il campo non \u00e8 vuoto aggiorniamo il valore in Configuration<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Configuration::updateValue(<\/span>'homepage_banner_message'<\/span>, $homepageBannerMessage);<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$response .= $<\/span>this<\/span>->displayConfirmation($<\/span>this<\/span>->l(<\/span>'Banner message updated.'<\/span>));<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span>\n\u00a0\u00a0\u00a0\u00a0}<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>return<\/span> $response.$<\/span>this<\/span>->displayForm();<\/span>\n}<\/span><\/pre>\n

A questo punto il nostro modulo \u00e8 completo. Possiamo quindi andare all\u2019interno della sezione Moduli<\/strong> ed installarlo.<\/p>\n

\"e-commerce<\/p>\n

Cliccando sul tasto Configura \u00e8 possibile visualizzare il form da noi creato per andare a modificare il messaggio del banner.<\/p>\n

\"e-commerce<\/p>\n

Et voil\u00e0! Il nostro banner in homepage. Noterete che si trova alla fine della pagina.\u00a0\u00c8 possibile cambiare l\u2019ordine di visualizzazione andando a modificarlo all\u2019interno della sezione <\/span>Design -> Posizioni.<\/strong><\/p>\n

\"e-commerce<\/p>\n

Come potrete capire da questa guida, creare un modulo per PrestaShop prevede la conoscenza della sua struttura e dei meccanismi che regolano il funzionamento degli hook<\/strong>.\u00a0Grazie ad essi \u00e8 possibile aggiungere nuove funzionalit\u00e0 e blocchi all’interno delle varie pagine del sito e-commerce. \u00c8 anche possibile registrare nuovi hook personalizzati (avendo cura di aggiungerli nel template del tema in cui vogliamo farlo intervenire) o utilizzare particolari hook per inserire codice JavaScript o aggiungere un foglio di stile CSS. Le possibilit\u00e0 sono infinite, serve solo fantasia, oltre ovviamente a consultare la documentazione ufficiale di PrestaShop.<\/p>\n

Duccio Bottai<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"

PrestaShop \u00e8 un software di Content Management System (CMS) pensato per l\u2019e-commerce. Quest\u2019ultima caratteristica \u00e8 proprio ci\u00f2 che lo contraddistingue dagli altri concorrenti (come ad esempio WordPress): PrestaShop \u00e8 stato progettato appositamente per i siti e-commerce, il suo core contiene nativamente tutte quelle funzionalit\u00e0 necessarie alla gestione di un negozio online. Fin qui tutto ok, […]<\/p>\n","protected":false},"author":1,"featured_media":6004,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"footnotes":""},"categories":[57],"tags":[],"class_list":["post-23782","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sviluppo-software"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/odc.oimmei.dev\/it\/wp-json\/wp\/v2\/posts\/23782","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/odc.oimmei.dev\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/odc.oimmei.dev\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/odc.oimmei.dev\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/odc.oimmei.dev\/it\/wp-json\/wp\/v2\/comments?post=23782"}],"version-history":[{"count":1,"href":"https:\/\/odc.oimmei.dev\/it\/wp-json\/wp\/v2\/posts\/23782\/revisions"}],"predecessor-version":[{"id":24293,"href":"https:\/\/odc.oimmei.dev\/it\/wp-json\/wp\/v2\/posts\/23782\/revisions\/24293"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/odc.oimmei.dev\/it\/wp-json\/wp\/v2\/media\/6004"}],"wp:attachment":[{"href":"https:\/\/odc.oimmei.dev\/it\/wp-json\/wp\/v2\/media?parent=23782"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/odc.oimmei.dev\/it\/wp-json\/wp\/v2\/categories?post=23782"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/odc.oimmei.dev\/it\/wp-json\/wp\/v2\/tags?post=23782"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}