Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scaling WooCommerce - Δημήτρης Χατζημιχαηλίδης

Scaling WooCommerce - Δημήτρης Χατζημιχαηλίδης

Η παρουσίασή μου θα εξηγεί πως καταφέρνουμε σε ένα WooCommerce eshop να έχουμε δεκάδες χιλιάδες κωδικoύς προϊόντων, με καθημερινά updates των προϊόντων από πολλούς προμηθευτές και με διάφορους τρόπους διασύνδεσης (XML, CSV, API).

Κύριες ενότητες θα είναι προβλήματα που αντιμετωπίζουμε και πως τα λύνουμε για τα εξής:

Κατηγορίες προϊόντων
Διαθεσιμότητες Τιμές & profit margins
Μεταφορικά & κλάσεις
Ώρες συγχρονισμού, συχνότητα και παράλληλα requests καθώς ενημέρωση μόνο των απολύτως απαραίτητων στοιχείων
Τεχνικές παραμετροποιήσεις για βελτίωση απόδοσης
Παραδείγματα λύσεων που έχουμε δώσει
Εργαλεία που χρησιμοποιούμε
Extra bonus: e-shop βιβλιοπωλείου με 260.000+, 10.000 κωδικούς προϊόντων και συγχρονισμό με 7 προμηθευτές

WordPress Greek Community

April 09, 2022
Tweet

More Decks by WordPress Greek Community

Other Decks in Technology

Transcript

  1. Εισαγωγή Τι εννοούμε με το Scaling WooCommerce; Ποιο είναι το

    πρόβλημα που καλούμαστε να λύσουμε;
  2. Οι προμηθευτές μας δίνουν τα εξής στοιχεία: • 2 προμηθευτές

    μας δίνουν XML που έχουν όλα τα προϊόντα • Ένας μας δίνει ένα XML με τα βασικά στοιχεία ενός προϊόντος και δύο έξτρα XML, ένα για τα χαρακτηριστικά ( attributes) και ένα για τις περιγραφές • Και ένας προμηθευτής δουλεύει με API όπου φέρνουν τα προϊόντα.
  3. XML αρχείο • Μοιάζει με html αρχείο • Χρησιμοποιείται για

    τη μεταφορά δεδομένων μεταξύ δύο μερών • Ανοίγει με οποιοδήποτε πρόγραμμα κειμένου ή browser • Αποτελείται από nodes Extensible Markup Language
  4. API Automatic Programming Interface • Μια εφαρμογή μπορεί να επικοινωνεί

    με άλλες • Προβολή δεδομένων, επεξεργασία ή καταχώριση νέων • Συνήθως δέχεται και απαντάει με JSON
  5. JSON • Μία ελαφριά μορφή για την αποθήκευση και τη

    μεταφορά δεδομένων • Χρησιμοποιείται για αποστολή δεδομένων από server σε μία ιστοσελίδα • { “name”: “wordpress.org”, “url”: “https://wordpress.org/news/wp-json/wp/v2/posts?per_page=3”, “posts”: [] } JavaScript Object Notation
  6. 1) php import με την κλάση WC_Product • Η πιο

    τεχνική επιλογή • Ταχύτητα στο συγχρονισμό • Με get & set συναρτήσεις μπορείς να θέσεις και να πάρεις τις πληροφορίες <?php $wc_product = new WC_Product(); $wc_product->set_name("Product Title"); $wc_product->set_status("publish"); $wc_product->set_catalog_visibility("visible"); $wc_product->set_description("Product Desc"); $wc_product->set_sku("Product Sku"); $wc_product->set_price("Product price"); $wc_product->set_stock_status("instock"); ?>
  7. 2) WooCommerce API • Μπορούμε να διαβάσουμε ή να γράψουμε

    σε ένα e-shop χωρίς να γνωρίζουμε τον κώδικα • Πολύ εύκολο στη χρήση για προγραμματιστές • Δεν χρειάζεται καν να δημιουργήσεις plugin για το WordPress Χρήσιμα Links https://woocommerce.com/document/woocommerce-rest-api/ https://woocommerce.github.io/woocommerce-rest-api-docs/
  8. 3) WP All Import (Προτεινόμενη επιλογή) • Συμφέρει από άποψη

    κόστους, με lifetime value για unlimited sites • Εύκολη μετατροπή των δεδομένων από οποιοδήποτε αρχείο • Μπορεί να χρησιμοποιηθεί κυρίως από developers • Τemplates για παρόμοιες εργασίες • Αυτοματισμός με έτοιμη λειτουργία για crons • Logging (καταγραφή ιστορικού)
  9. WP All Import Νέο Import Επιλογή που διαλέγουμε για να

    δημιουργήσουμε συγχρονισμό Γράφουμε το URL XML εδώ Για νέα προϊόντα επιλέγουμε εδώ
  10. WP All Import Νέο Import (2) Σύνολο προϊόντων Οπτικοποίηση των

    εγγραφών του XML Διαθέσιμα nodes του XML
  11. WP All Import Νέο Import (3) Επιλογή για ενημέρωση προϊόντων

    Επιλογή για διαγραφή προϊόντων Επιλογή για δημιουργία νέων προϊόντων Επιλογή για να ενημερώνει μόνο τα προϊόντα που έχουν αλλάξει Επιλέγουμε ποια στοιχεία θέλουμε να ενημερωθούν Επιλέγοντας από εδώ, ενημερώνουμε μόνο την τιμή και το custom πεδίο της διαθεσιμότητας
  12. Βασικός στόχος: Να πάρουμε τις πληροφορίες από τον προμηθευτή και

    να τις εισάγουμε στο e-shop. • Όπως και να μας έρθει η πληροφορία, μπορούμε να τη μετατρέψουμε στη μορφή που μας βολεύει για τον συγχρονισμό. • Από κάθε προμηθευτή, θα χρειαστούμε να κατανοήσουμε τις πληροφορίες που μας παρέχει για να τις χρησιμοποιήσουμε σωστά.
  13. Πληροφορίες προϊόντων: • Τίτλος προϊόντος • SKU/ΕΑΝ/Barcode • Περιγραφή •

    Τιμές (χονδρική, προτεινόμενη λιανικής, τιμή μετά έκπτωσης) • Φωτογραφίες • Βάρος & διαστάσεις • Κατηγορία • Χαρακτηριστικά (attributes) ως ιδιότητες • Κατασκευαστής • Μεταφορικά & κλάσεις μεταφορικών • Διαθεσιμότητα ή stock
  14. Τίτλος, Περιγραφή, Βάρος, Διαστάσεις Συνήθως τα περνάμε ως έχουν στα

    αντίστοιχα πεδία του WooCommerce SKU/ΕΑΝ/Barcode Στο SKU του προϊόντος ή σε custom πεδίο αν έχει το e-shop δική του κωδικοποίηση Φωτογραφίες Συνήθως οι φωτογραφίες έχουν μια σειρά, οπότε χρησιμοποιούμε την 1η για βασική φωτογραφία και τις υπόλοιπες τις προσθέτουμε στο gallery των εικόνων.
  15. Τιμές (χονδρική, προτεινόμενη λιανικής, τιμή μετά έκπτωσης) Επιλογές που μπορεί

    να έχουμε για να χρησιμοποιήσουμε: ➔ Προτεινόμενη τιμή λιανικής ➔ Υπολογισμός από τιμή χονδρικής με γενικό κανόνα (π.χ. *2) ➔ Διαφορετικό margin (περιθώριο κέρδους) ανά κατηγορία ◆ Τιμές margin σε php script χωρίς δυνατότητα αλλαγής από διαχειριστές αλλά πιο γρήγορο ◆ Τιμές margin σε custom πεδίο σε κάθε κατηγορία του e-shop ώστε να μπορεί να το αλλάζουν οι διαχειριστές αλλά πιο μεγάλο “κόστος” για τη βάση δεδομένων και τον server μας
  16. Κατηγορία Εδώ πρέπει να γίνει mapping(αντιστοίχιση) των κατηγοριών των προμηθευτών

    με το e-shop Παράδειγμα: Κατηγορίες προμηθευτή Κατηγορίες e-shop Τραπέζια Είδη Τραπεζαρίας Τραπεζαρίες Καρέκλες Οι κατηγορίες του e-shop πρέπει να προκύψουν μετά από μελέτη των κατηγοριών των προμηθευτών για καλύτερη αντιστοίχιση
  17. Κατηγορία Παράδειγμα μία κατηγορία προμηθευτή σε πολλές δικές μας. Σε

    αυτήν την περίπτωση δεν μπορεί να γίνει η αντιστοίχιση. Πώς θα το λύσουμε; Κατηγορίες προμηθευτή Κατηγορίες e-shop Τραπέζια Τραπεζαρίες Καρέκλες Είδη Τραπεζαρίας Εδώ περνάμε την τελική κατηγορία στο WP All Import όπως το έχουμε φτιάξει
  18. Χαρακτηριστικά/ιδιότητες (ομοίως και για τους κατασκευαστές) Βήματα για αντιστοίχιση, όμοια

    με κατηγορίες: 1. Ελέγχουμε όλα τα χαρακτηριστικά των προμηθευτών 2. Επιλέγουμε ποια από αυτά θα χρησιμοποιήσουμε στο e-shop 3. Αντιστοιχίζουμε τα όμοια από διαφορετικούς προμηθευτές 4. Επιλέγουμε ποια από αυτά θα χρησιμοποιηθούν για φιλτράρισμα και indexing Σημαντική επιλογή για το αν θα γίνει indexing μία νέα ιδιότητα
  19. Χαρακτηριστικά/ιδιότητες (ομοίως και για τους κατασκευαστές) Γιατί να μην τα

    επιλέξουμε όμως όλα; • Ένα custom attribute έχει μικρότερο κόστος στη βάση κατά την αποθήκευση • Για σκοπούς SEO, δεν πρέπει να δημιουργούμε σελίδες που δεν υπάρχει περίπτωση να στοχεύσουμε ως keyword στη Google π.χ. δεν πρόκειται να στοχεύσουμε ποτέ το keyword “Γραφεία μήκους 110-120 εκατοστά” Πολύ σημαντικό να γίνει αντιστοίχιση και των τιμών των χαρακτηριστικών για καλύτερο φιλτράρισμα & SEO perfomance Εμφάνιση custom attribute στην επεξεργασία προϊόντος
  20. Μεταφορικά & κλάσεις μεταφορικών • Συνήθως βολεύει να ομαδοποιούμε προϊόντα

    (π.χ. μικρά δέματα, μικρά έπιπλα, μεγάλα έπιπλα) • Κάθε κλάση μεταφορικών έτσι έχει δικούς της κανόνες μεταφορικών και δικές της χρεώσεις. Εδώ περνάμε την κλάση μεταφορικών μέσα από ένα php function στο WP All Import
  21. Διαθεσιμότητα & stock • Διαφορετικό πεδίο από το instock, outofstock

    του WooCommerce • Συνήθως κατασκευάζουμε ένα custom πεδίο για τις διαθεσιμότητες • Ουσιαστικά πρόκειται για ημέρες αναμενόμενης παράδοσης Επιλογές σχετικές με marketplaces • Διαθέσιμο στο μαγαζί, Παράδοση σε 1-3 ημέρες • Παράδοση σε 1-3 ημέρες • Παράδοση σε 4-10 ημέρες • Παράδοση μέχρι 30 ημέρες
  22. Διαθεσιμότητα & stock Αντίστοιχα η επιλογή που στέλνουμε μέσω του

    XML που παράγουμε για το Marketplace για τον συγχρονισμό του προϊόντος
  23. Για πιο εξειδικευμένες ανάγκες 1. Η επιλογή του να μην

    συγχρονίζεις ένα προϊόν 2. Η επιλογή του προμηθευτή να μας δίνει σε πακέτα τα προϊόντα (π.χ. να τα πουλάει σε 2άδες, 4άδες κτλ) 3. Η εισαγωγή πεδίου για να γνωρίζουμε ποιος είναι ο προμηθευτής του κάθε προϊόντος (προσοχή, όχι ο κατασκευαστής)
  24. Για πιο εξειδικευμένες ανάγκες 1. Η επιλογή του να μην

    συγχρονίζεις ένα προϊόν • Χρήσιμο πεδίο για τη διαχείριση του πραγματικού stock για τα καταστήματα • Παράδειγμα, παραγγέλνουμε 4 και πουλάμε το 1 και μας μένουν 3 στην αποθήκη • Ο προμηθευτής μπορεί να αφαιρέσει το προϊόν αλλά το e-shop μπορεί να συνεχίσει να το πουλάει και μάλιστα με διαφορετική τιμολογιακή πολιτική
  25. Για πιο εξειδικευμένες ανάγκες 2. Η επιλογή του προμηθευτή να

    μας δίνει σε πακέτα τα προϊόντα (π.χ. να τα πουλάει σε 2άδες, 4άδες κτλ) μας δίνει δύο επιλογές: • Να πουλάει το e-shop σε πακέτα με τον αριθμό αυτό (μπορεί π.χ. να είναι καρέκλες σε σετ των 4) • Να μην επιτρέπει την εισαγωγή προϊόντων που είναι σε πακέτο από κάποιο αριθμό και πάνω (π.χ. από 6 και πάνω)
  26. Για πιο εξειδικευμένες ανάγκες 3. Η εισαγωγή πεδίου για να

    γνωρίζουμε ποιος είναι ο προμηθευτής του κάθε προϊόντος (προσοχή, όχι ο κατασκευαστής): • Χρήσιμο για να γνωρίζουμε από ποιο import προήλθε το προϊόν • Εξυπηρετεί για μαζικές ενημερώσεις αν χρειαστεί ώστε να μην αλλάξει ο συγχρονισμός • Βοηθάει επίσης να φιλτράρουμε διαφορετικά τα προϊόντα και να τα δείξουμε αλλιώς όπου εμείς το θέλουμε. Παράδειγμα: Προμηθευτής 1 - διαθεσιμότητα 1 = Διαθεσιμότητα 4-10 μέρες Προμηθευτής 2 - διαθεσιμότητα 1 = Διαθεσιμότητα 1-3 μέρες
  27. Performance Tip No.1 Σύμπτυξη XML και υπολογισμός όλα σε php

    script πριν το WP All Import • Mapping κατηγοριών, χαρακτηριστικών κ.ά. • Υπολογισμός όπου χρειάζεται λειτουργικότητα • Αφαίρεση nodes που δεν θα χρησιμοποιήσουμε
  28. Performance Tip No.2 Συντονισμός πολλαπλών συγχρονισμών • Θέλουμε να αποφεύγουμε

    έστω και δύο συγχρονισμοί να τρέχουν παράλληλα • Τρέχουμε bash script ώστε να ελέγχει πότε τελειώνει ο ένας συγχρονισμός ώστε να ξεκινάει ο επόμενος Αποτέλεσμα: • Δεν υπάρχει επικάλυψη των συγχρονισμών, άρα δεν βαραίνει ο server • Δεν υπάρχουν κενά διαστήματα μεταξύ των συγχρονισμών, άρα τελειώνουν πιο γρήγορα οι συγχρονισμοί
  29. Performance Tip No.3 Error handling • Το WP All Import

    δίνει επιλογή να κάνεις μια ενέργεια όταν τελειώσει ο συγχρονισμός (π.χ. αποστολή email) • Έχουμε δημιουργήσει υλοποίηση που ελέγχει τους συγχρονισμούς και μας ενημερώνει αν κάτι δεν τρέξει για μια ολόκληρη μέρα