$30 off During Our Annual Pro Sale. View Details »

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. April 2022, WordCamp Greece
    Scaling
    WooCommerce

    View Slide

  2. Εισαγωγή
    Τι εννοούμε με το Scaling WooCommerce;
    Ποιο είναι το πρόβλημα που καλούμαστε να λύσουμε;

    View Slide

  3. Προηγούμενες σχετικές ομιλίες
    (links από τις ομιλίες στις εικόνες)

    View Slide

  4. Ας αναλύσουμε το παράδειγμά μας…

    View Slide

  5. Οι προμηθευτές μας δίνουν τα εξής στοιχεία:
    ● 2 προμηθευτές μας δίνουν XML που έχουν όλα τα προϊόντα
    ● Ένας μας δίνει ένα XML με τα βασικά στοιχεία ενός προϊόντος και
    δύο έξτρα XML, ένα για τα χαρακτηριστικά ( attributes) και ένα για
    τις περιγραφές
    ● Και ένας προμηθευτής δουλεύει με API όπου φέρνουν τα
    προϊόντα.

    View Slide

  6. XML αρχείο
    ● Μοιάζει με html αρχείο
    ● Χρησιμοποιείται για τη
    μεταφορά δεδομένων
    μεταξύ δύο μερών
    ● Ανοίγει με οποιοδήποτε
    πρόγραμμα κειμένου ή
    browser
    ● Αποτελείται από nodes
    Extensible Markup Language

    View Slide

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

    View Slide

  8. JSON
    ● Μία ελαφριά μορφή για την αποθήκευση
    και τη μεταφορά δεδομένων
    ● Χρησιμοποιείται για αποστολή δεδομένων
    από server σε μία ιστοσελίδα

    {
    “name”: “wordpress.org”,
    “url”: “https://wordpress.org/news/wp-json/wp/v2/posts?per_page=3”,
    “posts”: []
    }
    JavaScript Object Notation

    View Slide

  9. Μέθοδοι Εισαγωγής (Import)
    Προϊόντων

    View Slide

  10. 1) php import με την κλάση WC_Product
    ● Η πιο τεχνική επιλογή
    ● Ταχύτητα στο συγχρονισμό
    ● Με get & set συναρτήσεις
    μπορείς να θέσεις και να
    πάρεις τις πληροφορίες
    $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");
    ?>

    View Slide

  11. 2) WooCommerce API
    ● Μπορούμε να διαβάσουμε
    ή να γράψουμε σε ένα
    e-shop χωρίς να
    γνωρίζουμε τον κώδικα
    ● Πολύ εύκολο στη χρήση για
    προγραμματιστές
    ● Δεν χρειάζεται καν να
    δημιουργήσεις plugin για
    το WordPress
    Χρήσιμα Links
    https://woocommerce.com/document/woocommerce-rest-api/
    https://woocommerce.github.io/woocommerce-rest-api-docs/

    View Slide

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

    View Slide

  13. WP All Import Νέο Import
    Επιλογή που διαλέγουμε για να
    δημιουργήσουμε συγχρονισμό
    Γράφουμε το URL XML εδώ
    Για νέα προϊόντα επιλέγουμε εδώ

    View Slide

  14. WP All Import Νέο Import (2)
    Σύνολο προϊόντων
    Οπτικοποίηση των
    εγγραφών του XML
    Διαθέσιμα nodes του XML

    View Slide

  15. WP All Import Νέο Import (3)
    Επιλογή για ενημέρωση
    προϊόντων
    Επιλογή για διαγραφή προϊόντων
    Επιλογή για δημιουργία νέων προϊόντων
    Επιλογή για να
    ενημερώνει μόνο τα
    προϊόντα που έχουν
    αλλάξει
    Επιλέγουμε ποια
    στοιχεία θέλουμε να
    ενημερωθούν
    Επιλέγοντας από εδώ, ενημερώνουμε
    μόνο την τιμή και το custom πεδίο της
    διαθεσιμότητας

    View Slide

  16. Επιλογές για τον συγχρονισμό των
    προϊόντων

    View Slide

  17. Βασικός στόχος:
    Να πάρουμε τις πληροφορίες από τον προμηθευτή και να τις
    εισάγουμε στο e-shop.
    ● Όπως και να μας έρθει η πληροφορία, μπορούμε να τη
    μετατρέψουμε στη μορφή που μας βολεύει για τον
    συγχρονισμό.
    ● Από κάθε προμηθευτή, θα χρειαστούμε να κατανοήσουμε τις
    πληροφορίες που μας παρέχει για να τις χρησιμοποιήσουμε
    σωστά.

    View Slide

  18. Πληροφορίες προϊόντων:
    ● Τίτλος προϊόντος
    ● SKU/ΕΑΝ/Barcode
    ● Περιγραφή
    ● Τιμές (χονδρική, προτεινόμενη
    λιανικής, τιμή μετά έκπτωσης)
    ● Φωτογραφίες
    ● Βάρος & διαστάσεις
    ● Κατηγορία
    ● Χαρακτηριστικά (attributes)
    ως ιδιότητες
    ● Κατασκευαστής
    ● Μεταφορικά & κλάσεις
    μεταφορικών
    ● Διαθεσιμότητα ή stock

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. Μεταφορικά & κλάσεις μεταφορικών
    ● Συνήθως βολεύει να ομαδοποιούμε προϊόντα (π.χ. μικρά δέματα,
    μικρά έπιπλα, μεγάλα έπιπλα)
    ● Κάθε κλάση μεταφορικών έτσι έχει δικούς της κανόνες
    μεταφορικών και δικές της χρεώσεις.
    Εδώ περνάμε την κλάση μεταφορικών
    μέσα από ένα php function στο WP All
    Import

    View Slide

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

    View Slide

  27. Διαθεσιμότητα & stock
    Παράδειγμα καταχώρησης με 4 διαφορετικούς προμηθευτές στην
    επεξεργασία ενός προϊόντος

    View Slide

  28. Διαθεσιμότητα & stock
    Η αντίστοιχη εμφάνιση στην σελίδα προϊόντος που βλέπει ο πελάτης στο
    front-end του e-shop

    View Slide

  29. Διαθεσιμότητα & stock
    Αντίστοιχα η επιλογή που στέλνουμε μέσω του XML που παράγουμε για το
    Marketplace για τον συγχρονισμό του προϊόντος

    View Slide

  30. Για πιο εξειδικευμένες ανάγκες

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  34. Για πιο εξειδικευμένες ανάγκες
    3. Η εισαγωγή πεδίου για να γνωρίζουμε ποιος είναι ο προμηθευτής του κάθε
    προϊόντος (προσοχή, όχι ο κατασκευαστής):
    ● Χρήσιμο για να γνωρίζουμε από ποιο import προήλθε το προϊόν
    ● Εξυπηρετεί για μαζικές ενημερώσεις αν χρειαστεί ώστε να μην αλλάξει ο
    συγχρονισμός
    ● Βοηθάει επίσης να φιλτράρουμε διαφορετικά τα προϊόντα και να τα δείξουμε
    αλλιώς όπου εμείς το θέλουμε.
    Παράδειγμα:
    Προμηθευτής 1 - διαθεσιμότητα 1 = Διαθεσιμότητα 4-10 μέρες
    Προμηθευτής 2 - διαθεσιμότητα 1 = Διαθεσιμότητα 1-3 μέρες

    View Slide

  35. Performance Tips
    Ας μπούμε και λίγο πιο βαθιά τώρα για όσους αντέχουν…

    View Slide

  36. Performance Tip No.1
    Σύμπτυξη XML και υπολογισμός όλα σε php script πριν το WP All Import
    ● Mapping κατηγοριών, χαρακτηριστικών κ.ά.
    ● Υπολογισμός όπου χρειάζεται λειτουργικότητα
    ● Αφαίρεση nodes που δεν θα χρησιμοποιήσουμε

    View Slide

  37. Performance Tip No.2
    Συντονισμός πολλαπλών συγχρονισμών
    ● Θέλουμε να αποφεύγουμε έστω και δύο συγχρονισμοί να τρέχουν παράλληλα
    ● Τρέχουμε bash script ώστε να ελέγχει πότε τελειώνει ο ένας συγχρονισμός ώστε
    να ξεκινάει ο επόμενος
    Αποτέλεσμα:
    ● Δεν υπάρχει επικάλυψη των συγχρονισμών, άρα δεν βαραίνει ο server
    ● Δεν υπάρχουν κενά διαστήματα μεταξύ των συγχρονισμών, άρα τελειώνουν πιο
    γρήγορα οι συγχρονισμοί

    View Slide

  38. Performance Tip No.3
    Error handling
    ● Το WP All Import δίνει επιλογή να κάνεις μια ενέργεια όταν τελειώσει ο
    συγχρονισμός (π.χ. αποστολή email)
    ● Έχουμε δημιουργήσει υλοποίηση που ελέγχει τους συγχρονισμούς και μας
    ενημερώνει αν κάτι δεν τρέξει για μια ολόκληρη μέρα

    View Slide

  39. April 2022, WordCamp Greece
    Thank you!
    Questions?
    Dimitris Chatzimichailidis
    dicha.gr

    View Slide