Outlet WP: differenze tra le versioni

Da Webmobili Wiki.
 
(34 versioni intermedie di 4 utenti non mostrate)
Riga 1: Riga 1:
== DOKAN Multi-Vendor ==  
== DOKAN Multi-Vendor ==  
Pagina ufficiale https://wedevs.com/ </br>
Pagina ufficiale https://wedevs.com/ </br>
Nuova pagina diretta per Dokan https://app.dokan.co/


Per il nostro utilizzo servirebbe acquistare la versione Professional a 190€/anno.
Per il nostro utilizzo servirebbe acquistare la versione Professional a 190€/anno.
Riga 32: Riga 33:


'''IMPORTANTE'''<br/>
'''IMPORTANTE'''<br/>
Nell'ambiente di ''test'', nel file <code>wp-config.php</code> inserire le costanti
Nell'ambiente di ''test'', nel file <code>wp-config.php</code> inserire la costante
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
define( 'WP_DEBUG', true );
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_LOG', true );
// Importante per Application Passwords da locale
define( 'WP_DEBUG_DISPLAY', true );
define( 'WP_ENVIRONMENT_TYPE', 'local' );
define( 'WP_ENVIRONMENT_TYPE', 'staging' ); // mettere 'local' per sviluppo locale
</syntaxhighlight>
</syntaxhighlight>


Mentre in quello di ''produzione'' oltre a <code>WP_ENVIRONMENT_TYPE</code> rimuovere <code>WP_DEBUG</code> altrimenti vengono caricate le connessioni di test.<br/>
In ''produzione'' rimuovere <code>WP_ENVIRONMENT_TYPE</code> e rimuovere WP_DEBUG e figli.
<code>WP_DEBUG_LOG</code> può rimanere in produzione.


== Server di Produzione ==
== Server di Produzione ==
È necessario che ci siano le seguenti route nel file di loopback <code>/etc/hosts</code>
È necessario che ci siano le seguenti route nel file di loopback <code>/etc/hosts</code>
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
192.168.250.10  ARIEL          ws.designbest.com img.designbest.com immagini.designbest.com
192.168.250.10  ARIEL          ws.designbest.com img.designbest.com
192.168.250.20  JASMINE        ws.dbdemo47.com test.wm4pr.com
192.168.250.20  JASMINE        ws.dbdemo47.com test.wm4pr.com
</syntaxhighlight>
</syntaxhighlight>


E installare [[Memcached - Gestione della cache]]
E installare [[Memcached - Gestione della cache]]<br/><br/>
 
Nel '''Virtual Host''' inserire la direttiva
<syntaxhighlight lang="bash">
TimeOut 900
</syntaxhighlight>
 
 
=== Plugin ===
Dopo la pulizia, scaricare
* '''Child Theme Configurator'''
* '''WooCommerce'''
* '''Dokan'''
 
Attivare tutto.
Scaricare '''Dokan PRO''' dal sito webdevs.com e installarlo e attivarlo.<br/>
Inserire il ''License Code''. La licenza attiva in automatico il modulo obbligatorio '''EU Compliance Fields'''.<br/><br/>
 
Scaricare il '''tema Sway''' da themeforest e aggiungerlo tramite Aspetto->Temi<br/>.
Installare nell'ordine
* '''Redux''' (che in Plugin si chiamerà ''Template Library and Redux Framework'')
* '''KeyDesign Addon''' (passare dalla pagina ''Install Required Plugin'' perché il click normale è buggato)
* '''WPBakery Page Builder''' e attivarlo con la licenza ([http://wiki.wmdemo.it/index.php?title=Magazine_WP#Plugin_a_pagamento_-_Aggiornamenti qui dettagli])
* '''EnvatoMarket''' (che manda sul sito e fa scaricare lo zip)
* Inserire il tema '''Sway-child''' e selezionarlo come attivo (si trova nello zippone completo che si carica dal sito)
 
Installare il plugin '''Designbest Outlet''' caricando lo zip.<br/>
 
Installare '''W3 Total Cache'''
 
==== AI Mojo - GPT-3 ====
Una scelta controversa, quella di applicare al sito un plugin che ''genera testi casuali'' affidandosi ad una intelligenza artificiale.<br/>
Nella speranza che Google non ci banni (subito) dai motori di ricerca per truffa, noi lo acquistiamo e paghiamo perfino la licenza.<br/><br/>
 
Per configurarlo è necessario definire la sua '''API Key''' nel file <code>wp-config.php</code>
<syntaxhighlight lang="php">
define( 'WPAIMOJO_OPENAI_API_KEY', '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' );
</syntaxhighlight>


== REST API DOKAN ==
== REST API DOKAN ==
Link alla documentazione per le REST API https://wedevsofficial.github.io/dokan/
Link alla documentazione per le REST API https://wedevsofficial.github.io/dokan/
=== Application Passwords ===
Wordpress fino al 2020 non era pronto alle REST API e non permetteva che vi fossero chiamate dall'esterno del sito (se non con l'uso di plugin).<br/>
Dal 2020 ha introdotto le '''Application Passwords'''.<br/>
In pratica, tramite la dashboard, è possibile generare un numero qualsiasi di password per un utente e utilizzare queste con una normale chiamata in ''Basic Auth''.<br/>
È più sicuro perché non passa in chiaro la vera password ed è gestito nativamente da Wordpress.<br/>
Tramite API è anche possibile generare una Application Password , prendere il valore della nuova password generata, revocare la password.


=== Vendors ===
=== Vendors ===
Riga 180: Riga 225:
<pre>/wp-content/languages/plugins/dokan-lite-it_IT.po
<pre>/wp-content/languages/plugins/dokan-lite-it_IT.po
/wp-content/languages/plugins/dokan-lite-it_IT.mo</pre>
/wp-content/languages/plugins/dokan-lite-it_IT.mo</pre>
=== Traduzioni del Tema ===
Prelevare dal tema padre ad esempio Sway il file .pot in <code>wp-content/themes/sway/languages/sway.pot</code><br/>
Copiare e rinominare il file in <code>it_IT.po</code><br/>
In POEdit creare nuovo file di traduzioni partendo da quest'ultimo <code>it_IT.po</code><br/>
Selezionare tutto e copiare il testo sorgente nella traduzione, successivamente modificare il testo desiderato<br/>
Salvare e generare il file .mo da ca caricare in <code>wp-content/themes/sway-child/languages/it_IT.mo</code><br/>
Godersi le traduzioni.


=== Traduzioni parziali della community ===
=== Traduzioni parziali della community ===
Riga 193: Riga 246:


https://www.cloudways.com/blog/how-to-remove-hide-or-disable-add-to-cart-button-in-woocommerce/#remove-button-from-specific-products
https://www.cloudways.com/blog/how-to-remove-hide-or-disable-add-to-cart-button-in-woocommerce/#remove-button-from-specific-products
== ⚠️ Bug Incredibili, Stranezze, Blasfemie⚠️ ==
=== Sku già in fase di elaborazione ===
Moderando un'occasione abbiamo ricevuto il messaggio
* ''"Lo SKU (119392) che stai tentando di inserire è già in fase di elaborazione"''
incredibilmente abbiamo trovato un record corrispondente nella tabella <code>wp_wc_product_meta_lookup</code> che aveva un ''product_id'' inesistente nella tabella dei post.
<syntaxhighlight lang="sql">
SELECT * FROM wp_designbestoutlet_com.wp_wc_product_meta_lookup where sku = 119392;
</syntaxhighlight>
L'abbiamo eliminato e tutto è tornato a funzionare.<br/>
=== Query di pulizia del database ===
Trovato questo tizio che suggerisce delle query di pulizia.<br/>
Non verificato<br/>
https://gist.github.com/leetdev/02dbf73f6a668e051b237dccf27e440e
=== Funzione wc_get_product_id_by_sku() non affidabile ===
Siamo a ottobre 2024 e la funzione <code>wc_get_product_id_by_sku()</code> ha iniziato a restituire sempre <code>0</code> con qualsiasi parametro.<br/>
In questo modo la sincronizzazione falliva sempre il match con un prodotto già esistente e ogni volta ne creava uno nuovo.
Abbiamo trovato un modo alternativo per trovare un prodotto a partire da uno sku
<syntaxhighlight lang="php">
/**
* Dato uno SKU (productID di Designbest), restituisce il corrispondente ProductID di Wordpress
*
* @param string $sku
* @return int|bool Il productID di Wordpress, false se non esiste
*/
public static function getWpProductIdBySku($sku) {
  $query = new \WC_Product_Query( [
    'limit'    => 1,
    'sku'      => $sku,
    'return'  => 'ids',
    'type'    => ['simple', 'variable', 'variation'] // Include tutti i tipi di prodotti, anche le varianti
  ]);
  $products = $query->get_products();
  return reset($products);
}
</syntaxhighlight>

Versione attuale delle 09:32, 31 ott 2024

DOKAN Multi-Vendor

[modifica]

Pagina ufficiale https://wedevs.com/
Nuova pagina diretta per Dokan https://app.dokan.co/

Per il nostro utilizzo servirebbe acquistare la versione Professional a 190€/anno.

Il pacchetto ha incluso la gestione PIVA sia del Vendor che del Cliente (modulo EU Compliance Fields).
Se non risulta attivo, attivarlo dal sottomenu di Dokan->Modules->EU Compliance.

Registrazione Cliente/Vendor

[modifica]

Nella pagina di registrazione utente, c'è la possibilità di scelta tra CLIENTE e VENDOR.

Per disabilitare la possibilità di registrarsi manualmente come Vendor ho dovuto modificare il tema figlio nascondendolo da css:

/*NASCONDO IL BOX DI REGISTRAZIONE COME CLIENTE O VENDITORE*/
.form-row.form-group.user-role.vendor-customer-registration{
	display:none;
}

Stranezza:
Dopo un aggiornamento di WooCommerce è sparita la possibilità di registrarsi.

Ho notato che non era più flaggata l'opzione Permetti ai clienti di creare un account nella pagina "Il mio account" in WooCommerce --> Impostazioni --> Account & Privacy --> Creazione dell'account

Dominio di Test

[modifica]

https://dokan.dbdemo47.com/
utente: admin
password: W3bm0b1l!

IMPORTANTE
Nell'ambiente di test, nel file wp-config.php inserire la costante

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
define( 'WP_ENVIRONMENT_TYPE', 'staging' );  // mettere 'local' per sviluppo locale

In produzione rimuovere WP_ENVIRONMENT_TYPE e rimuovere WP_DEBUG e figli.

Server di Produzione

[modifica]

È necessario che ci siano le seguenti route nel file di loopback /etc/hosts

192.168.250.10  ARIEL           ws.designbest.com img.designbest.com
192.168.250.20  JASMINE         ws.dbdemo47.com test.wm4pr.com

E installare Memcached - Gestione della cache

Nel Virtual Host inserire la direttiva

TimeOut 900


Plugin

[modifica]

Dopo la pulizia, scaricare

  • Child Theme Configurator
  • WooCommerce
  • Dokan

Attivare tutto. Scaricare Dokan PRO dal sito webdevs.com e installarlo e attivarlo.
Inserire il License Code. La licenza attiva in automatico il modulo obbligatorio EU Compliance Fields.

Scaricare il tema Sway da themeforest e aggiungerlo tramite Aspetto->Temi
. Installare nell'ordine

  • Redux (che in Plugin si chiamerà Template Library and Redux Framework)
  • KeyDesign Addon (passare dalla pagina Install Required Plugin perché il click normale è buggato)
  • WPBakery Page Builder e attivarlo con la licenza (qui dettagli)
  • EnvatoMarket (che manda sul sito e fa scaricare lo zip)
  • Inserire il tema Sway-child e selezionarlo come attivo (si trova nello zippone completo che si carica dal sito)

Installare il plugin Designbest Outlet caricando lo zip.

Installare W3 Total Cache

AI Mojo - GPT-3

[modifica]

Una scelta controversa, quella di applicare al sito un plugin che genera testi casuali affidandosi ad una intelligenza artificiale.
Nella speranza che Google non ci banni (subito) dai motori di ricerca per truffa, noi lo acquistiamo e paghiamo perfino la licenza.

Per configurarlo è necessario definire la sua API Key nel file wp-config.php

define( 'WPAIMOJO_OPENAI_API_KEY', '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' );

REST API DOKAN

[modifica]

Link alla documentazione per le REST API https://wedevsofficial.github.io/dokan/

Application Passwords

[modifica]

Wordpress fino al 2020 non era pronto alle REST API e non permetteva che vi fossero chiamate dall'esterno del sito (se non con l'uso di plugin).
Dal 2020 ha introdotto le Application Passwords.
In pratica, tramite la dashboard, è possibile generare un numero qualsiasi di password per un utente e utilizzare queste con una normale chiamata in Basic Auth.
È più sicuro perché non passa in chiaro la vera password ed è gestito nativamente da Wordpress.
Tramite API è anche possibile generare una Application Password , prendere il valore della nuova password generata, revocare la password.


Vendors

[modifica]

Di default un nuovo Vendor non può pubblicare direttamente i suoi prodotti, ma deve attendere una revisione.
Possiamo cambiare questo comportamento nel menu di gestione Utenti alla voce Publishing -> Publish product directly.

Il Vendor una volta effettuato il login, per vedere la sua dashboard, dovrà andare all'indirizzo /dashboard

Creare un utente Vendor

[modifica]

Prima dobbiamo registrare i seguenti usermeta nel file functions.php del tema figlio:

register_meta( 'user', 'dokan_publishing', array( 'type'=>'string', 'description' => 'Pubblica i prodotti direttamente', 'single' => true,  'show_in_rest' => true) );
register_meta( 'user', 'dokan_enable_selling', array( 'type'=>'string', 'description' => 'Negozio abilitato alla vendita di prodotti', 'single' => true,  'show_in_rest' => true) );
register_meta( 'user', 'dokan_feature_seller', array( 'type'=>'string', 'description' => 'Negozio in evidenza', 'single' => true,  'show_in_rest' => true) );
register_meta( 'user', 'dokan_admin_percentage', array( 'type'=>'string', 'description' => 'Percentuale commissione', 'single' => true,  'show_in_rest' => true) );
register_meta( 'user', 'dokan_admin_percentage_type', array( 'type'=>'string', 'description' => 'Tipo commissione', 'single' => true,  'show_in_rest' => true) );

POST -> /wp-json/wp/v2/users

{
    "username": "slm001",
    "email": "salumi@gnam.prova",
    "password": "650",
    "roles": "seller",
    "meta":{        
        "dokan_publishing": "no",
        "dokan_enable_selling": "yes",
        "dokan_feature_seller": "no",
        "dokan_admin_percentage":"",
        "dokan_admin_percentage_type":"flat"        
    }      
  
}

dokan_publishing --> Abilita la pubblicazione di prodotti direttamente senza moderazione.
dokan_enable_selling --> Abilita il Negozio/Vendor alla vendita di prodotti.
dokan_feature_seller --> Negozio in Evidenza.
dokan_admin_percentage e dokan_admin_percentage_type --> Si riferiscono alla commisione da applicare al Vendor (vengono ereditate dalle impostazioni generali se non le mettiamo).

Ora che l'utente/Vendor è stato creato possiamo aggiungergli ulteriori informazioni tramite un update:

PUT-> /wp-json/dokan/v1/settings

Le credenziali saranno quelle del Vendor appena inserito.

{    
 "store_name" : "Prova 018 Arredamenti",
 "phone": "01119211500",
 "banner": false,
 "vat_number": "",
 "address": {
        "street_1": "Via Fasulla 123",
        "street_2": "",
        "city": "Torino",
        "zip": "10100",
        "country": "IT",
        "state": "TO"
    },
 "social":{
     "fb":"https://facebook_social_link.com",
     "gplus":false,
     "twitter": false,
     "pinterest": false,
     "linkedin": false,
     "youtube": false,
     "instagram": "https://instagram_social_link.com",
     "flickr": false
 }
}

Products

[modifica]

Per aggiungere un prodotto ad un Vendor, dobbiamo chiamare la seguente API autenticati con i dati del vendor (se mi autentico con utente piripicchio il prodotto sarà dello store piripicchio).
POST -> /wp-json/dokan/v1/products/

{
    "name": "Sedia chiappona",
    "type": "simple",
    "price": "350",
    "regular_price": "350",
    "sale_price": "299",
    "manage_stock": true,
    "stock_quantity": 1,
    "description": "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.",
    "short_description": "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.",
    "categories": [
      {
        "id": 67
      }
    ],
    "images": [
      {
        "src": "https://litb-cgis.rightinthebox.com/images/640x640/202203/bps/product/inc/uwdagr1647929641933.jpg",
        "position": 0
      },
       {
        "src": "https://litb-cgis.rightinthebox.com/images/640x640/202203/bps/product/inc/stspzs1647929642243.jpg",
        "position": 1
      }
    ]
  }

Traduzioni

[modifica]

Per creare le traduzioni è necessario usare poedit.
L' idea è quella di utilizzare la struttura di localizzazioni del plugin che si trova nel file
/wp-content/plugins/dokan/languages/dokan-lite.pot
che espone solo la struttura delle traduzioni nel "linguaggio neutro".

NB
Ricordarsi, in caso di modifica, di riassegnare i permessi 775 e l'owner www-data:www-data
altrimenti durante gli aggiornamenti di Dokan segnala errore.

Una volta aperto con poedit creare una nuova traduzione per la lingua italiana, compilare tutti i campi e salvare per ritrovarsi 2 file

  • it_IT.po leggibile da umani (con poedit)
  • it_IT.mo leggibile dalla macchina (WP)

Piazzare questi due file nella cartella /wp-content/languages/plugins/ con i seguenti nomi:

/wp-content/languages/plugins/dokan-lite-it_IT.po
/wp-content/languages/plugins/dokan-lite-it_IT.mo

Traduzioni del Tema

[modifica]

Prelevare dal tema padre ad esempio Sway il file .pot in wp-content/themes/sway/languages/sway.pot
Copiare e rinominare il file in it_IT.po
In POEdit creare nuovo file di traduzioni partendo da quest'ultimo it_IT.po
Selezionare tutto e copiare il testo sorgente nella traduzione, successivamente modificare il testo desiderato
Salvare e generare il file .mo da ca caricare in wp-content/themes/sway-child/languages/it_IT.mo
Godersi le traduzioni.

Traduzioni parziali della community

[modifica]

Esistono delle traduzioni parziali (al momento italiano è al 55%) sul sito
https://translate.wordpress.org/projects/wp-plugins/dokan-lite
pronte all'uso.
Basta scaricare i file .po e .mo e piazzarli in /wp-content/languages/plugins/.
Per modificare le traduzioni aprire il file .po con poedit e al salvataggio si genera anche il .mo. Sostituire sul server.

Scheda Prodotto/Occasione

[modifica]

Necessità di nascondere il pulsante di acquisto solo per alcuni prodotti outlet, ma non ecommerce.

https://www.cloudways.com/blog/how-to-remove-hide-or-disable-add-to-cart-button-in-woocommerce/#remove-button-from-specific-products

⚠️ Bug Incredibili, Stranezze, Blasfemie⚠️

[modifica]

Sku già in fase di elaborazione

[modifica]

Moderando un'occasione abbiamo ricevuto il messaggio

  • "Lo SKU (119392) che stai tentando di inserire è già in fase di elaborazione"

incredibilmente abbiamo trovato un record corrispondente nella tabella wp_wc_product_meta_lookup che aveva un product_id inesistente nella tabella dei post.

SELECT * FROM wp_designbestoutlet_com.wp_wc_product_meta_lookup where sku = 119392;

L'abbiamo eliminato e tutto è tornato a funzionare.

Query di pulizia del database

[modifica]

Trovato questo tizio che suggerisce delle query di pulizia.
Non verificato
https://gist.github.com/leetdev/02dbf73f6a668e051b237dccf27e440e


Funzione wc_get_product_id_by_sku() non affidabile

[modifica]

Siamo a ottobre 2024 e la funzione wc_get_product_id_by_sku() ha iniziato a restituire sempre 0 con qualsiasi parametro.
In questo modo la sincronizzazione falliva sempre il match con un prodotto già esistente e ogni volta ne creava uno nuovo.

Abbiamo trovato un modo alternativo per trovare un prodotto a partire da uno sku

/**
 * Dato uno SKU (productID di Designbest), restituisce il corrispondente ProductID di Wordpress
 *
 * @param string $sku
 * @return int|bool Il productID di Wordpress, false se non esiste
 */
public static function getWpProductIdBySku($sku) {
  $query = new \WC_Product_Query( [
    'limit'    => 1,
    'sku'      => $sku,
    'return'   => 'ids',
    'type'     => ['simple', 'variable', 'variation'] // Include tutti i tipi di prodotti, anche le varianti
  ]);
  $products = $query->get_products();
  return reset($products);
}