Archimidis Mertzanos

Πώς κάνω υποβολή WordPress theme στο WordPress.org repo;

Καλησπέρα σας.  Αποφάσισα να γράψω 2-3 πράγματα σχετικά με την υποβολή WordPress Theme στο WordPress.org repo. Αυτό γιατί Έχοντας εμπειρία επιτυχούς υποβολής πάνω από 12 themes μπορώ πλέον να πω ότι μπορεί να φαντάζει και χρονοβόρο και δύσκολο αλλά δεν είναι τόσο. Αυτή τη στιγμή που μιλάμε είναι pending ένα ακόμα WordPress theme το οποίο έχω υποβάλλει εδώ και 3 μήνες στο WordPress.org repo . Το theme αυτό μπορείτε να το κατεβάσετε από το github ,όπως επίσης να το δείτε εδώ. Ένα άλλο WordPress theme με το δικό μου όνομα είναι και αυτό εδώ. Ας ξεκινήσουμε λοιπόν να ξετυλίγουμε το κουβάρι της όλης διαδικασίας υποβολής στο WordPress.org repository.

Περιεχόμενα

Νούμερο 1 ζητούμενο.

Θα το πω όσο πιο απλά μπορώ. Εντελώς απλά. ΑΝ ΔΕΝ ΕΧΕΙΣ ΥΠΟΜΟΝΗ ΜΗΝ ΤΟ ΚΑΝΕΙΣ. Παράτα το εδώ. Αφού λοιπόν έγραψα και τα κεφαλαία μου και προειδοποίησα πάμε παρακάτω.

Θέλει ειδικές γνώσεις για να υποβάλλω ένα WordPress theme στο WordPress.org repo;

Θεωρητικά ένα WordPress Theme μπορεί να αποτελείται από τα εξής 2 αρχεία

  • index.php
  • style.css – Με το «ειδικού τύπου» comment στο header το οποίο προσδιορίζει το όνομα του theme , τα tags του , περιγραφή , έκδοση κλπ.
  • comments.php – Το αρχείο που περιέχει το «template» των comments.
  • screenshot.png – Η εικόνα του WordPress theme.

Πρακτικά φυσικά αυτό δεν ισχύει. Στο WordPress.org θέλουν να υπάρχουν themes τα οποία λειτουργούν με τις default λειτουργίες του WordPress και να διαθέτουν και τα κατάλληλα αρχεία. Για παράδειγμα WordPress theme χωρίς το αρχείο single.php είναι πολύ χλωμή έως ανύπαρκτη η πιθανότητα να περάσει. Άρα λοιπόν το πρώτο που κρατάμε είναι ότι πρέπει να δημιουργήσουμε ένα WordPress theme με τα βασικά αρχεία όπως

  • single.php
  • page.php
  • archive.php
  • tag.php *
  • category.php *
  • header.php
  • search.php
  • searchform.php**
  • comments.php
  • footer.php
  • functions.php
  • Αν έχω ξεχάσει κάποιο μου λέτε..

*Το archive μπορεί να παίξει το ρόλο και του category.php και του tag.php απλά καλό θα είναι για καλύτερο έλεγχο να έχετε και τα τρία είδη αρχείων στο κάθε WordPress theme.

** Το searchform.php διαθέτει στην ουσία την φόρμα αναζήτησης που χρησιμοποιεί το WordPress στις αναζητήσεις του. Αυτό το αρχείο δεν είναι υποχρεωτικό να υπάρχει , αλλά εάν υπάρχει πρέπει να έχει μέσα κώδικα, την φόρμα δλδ.

Τι χρονικό ορίζοντα έχει η υποβολή WordPress Theme;

Εδώ ξεκινάει το πιο αστείο του πράγματος. Στο WordPress.org υπάρχουν κάποιοι reviewers οι οποίοι προσφέρουν στην κοινότητα τα μέγιστα αλλά είναι λίγοι με αποτέλεσμα να καθυστερεί η διαδικασία αρκετά. Το μεγαλύτερο πρόβλημα όμως είναι ότι τις περισσότερες φορές και αφού το WordPress theme γίνει όπως λέμε «assigned» σε ένα reviewer και τελειώσει με το review-και εσύ με τις αλλαγές- , στη συνέχεια αναλαμβάνει συνήθως ένας πιο «παλιός» με αποτέλεσμα είτε να ξανά ανοίγει το ticket που είναι το theme assigned είτε να βρίσκει πολλά errors, που ο «νέος» δεν τα βρήκε και the story goes on.

Πριν 2 χρόνια κάθε theme από τη στιγμή της υποβολής μέχρι να γίνει reviewed , έπαιρνε 3 μήνες. Τώρα είμαστε αισίως στους 6-8 μήνες. Πριν λίγο καιρό είχα διαβάσει ότι το WordPress.org προσπαθεί να μειώσει δραστικά τους χρόνους για τα theme reviews αλλά ακόμα δεν το έχει καταφέρει.

Ποια διαδικασία ακολουθείται κατά την υποβολή του WordPress Theme στο WordPress.org repo;

Αν υποθέσουμε ότι έχουμε έτοιμο το theme και ελεγμένο – θα τα δούμε αναλυτικά πιο κάτω – αυτό που έχουμε να κάνουμε είναι το εξής:

  • Δημιουργούμε ,αν δεν έχουμε , προφίλ στο WordPress.org.
  • Έχοντας κάνει zip το WordPress theme μας , το ανεβάζουμε εδώ.
  • Υπάρχει ένας πρώτος ,αυτοματοποιημένος έλεγχος ο οποίος ελέγχει το theme κατά το upload του στο WordPress.org repo.
  • Αφού ανέβει δημιουργείται ένα ticket το οποίο είναι σαν και αυτό εδώ https://themes.trac.wordpress.org/ticket/24072
  • Μετά από καιρό , κάποιος reviewer αναλαμβάνει να κάνει την κριτική στο theme σας.
  • Αν δεν απαντήσετε μέσα σε 7 μέρες , τότε το ticket το κλείνει ο reviewer και δεν το ανοίγει παρά μόνο σε ειδικές συνθήκες. Μπορείτε να επικοινωνήσετε με τον reveiwer και μέσω του καναλιού του slack .
  • Αν απαντήσετε ,σας αναφέρει τι είναι λάθος και εσείς πρέπει να το διορθώσετε.
  • Υπάρχει πιθανότητα ,ειδικά αν έχετε 2 και πάνω WordPress themes να σας λένε κάποιες φορές λίγο αλλοπρόσαλλα πράγματα . Για παράδειγμα 2 reviewers μπορεί να συγκρούονται οι απόψεις τους. Εκεί μπορείτε να το αναφέρετε και στον slack αλλά και να αναφερθείτε σε ένα άλλο πιο «μεγάλο» reviewer. Υπάρχει πιθανότητα να ζητηθεί η βοήθεια ενός reviewer και από άλλους reviewers.

Προετοιμασία του WordPress theme μας πριν την υποβολή.

Όλοι οι WordPress theme authors πρέπει να έχουν κάποια Plugins εγκατεστημένα τα οποία τους κάνουν τη ζωή πολύ πιο εύκολη σχετικά με το review που θα επακολουθήσει. Τα plugins αυτά είναι τα:

  1. Theme Check – Χωρίς αυτό το plugin δεν πάμε πουθενά. Σκανάρει τα theme files και σου επισημαίνει σφάλματα, required και recommended. Προσοχή: Αν αυτό το plugin σας δείχνει ότι δεν «περνάει» το theme σας , τότε δεν πρόκειται να ανέβει ούτε μέσω του WordPress theme uploader.
  2. Debug Bar – Κάνει debugging στον κώδικα και βασίζεται για να λειτουργήσει στο setting που βρίσκεται στο wp-config.php  DEFINE('WP_DEBUG',false);  Φυσικά πρέπει να το αλλάξετε σε «true» και με τη βοήθεια του plugin αυτού ,μαζεύονται όλα τα errors του κώδικα σε ένα σημείο για να τα διορθώσετε καλύτερα.
  3. FakerPress – Πολύ σημαντικό plugin. Δημιουργεί ψεύτικο περιεχόμενο για να ελέγξετε πώς το εμφανίζει το WordPress theme σας. Είναι σημαντικό αυτό, διότι αν δεν εμφανίζεται σωστά το περιεχόμενο, τότε ένας reviewer θα μπορούσε να σας δημιουργήσει μικροπροβλήματα και να χάσετε χρόνο.
  4. Monster Widget – Σε περίπτωση που το theme σας έχει sidebar , αυτό το WordPress plugin είναι must. Δημιουργεί ένα widget με όλα τα πιθανά default WordPress widgets και έτσι μπορείτε να ελέγξετε αν το theme σας «σπάει» σε κάποιο σημείο η sidebar.

Υποβολή WordPress theme . Υποχρεωτικά features που θέτει το ίδιο το WordPress.

Εννοείται ότι το ίδιο το WordPress θέτει τα δικά του standards για κάθε υποβολή WordPress theme. Υπάρχει ένα URL το οποίο θα πρέπει να το έχετε πάντα στα αγαπημένα αν θέλετε να επιτύχετε σε αυτό . Παρακαλώ πλοηγηθείτε εδώ και στη συνέχεια θα αναλύσουμε 1 προς 1 αυτά που είναι υποχρεωτικά να τηρούνται για κάθε μία υποβολή WordPress theme.

Accesibility – Προσβασιμότητα

Σε όλα τα WordPress themes, μέσα στο style.css υπάρχουν κάποια tags τα οποία περιγράφουν τo theme. Για παράδειγμα το TwentySixteen WordPress theme έχει τα επόμενα tags:

Υπάρχει ένα tag, το «accesibility-ready» το οποίο δείχνει ότι αυτό το WordPress theme έχει προγραμματιστεί για να λειτουργεί σωστά και σε περιπτώσεις που ο χρήστης της ιστοσελίδας είναι AMEΑ και ίσως χρησιμοποιεί κάποιον screen-reader κλπ. Αν το WordPress theme μας ανήκει σε αυτή την κατηγορία τότε πρέπει να ακολουθήσετε τις οδηγίες που υπάρχουν σε αυτή την σελίδα.

Κώδικας Theme

Είναι προφανές ότι το WordPress theme δεν πρέπει να έχει κανένα PHP και JS σφάλμα. Γι αυτό πιο πάνω ανέφερα την χρήση του WP Debug Bar Plugin η οποία είναι καθοριστική για να λύσετε όλα τα errors. Προσοχή , οι theme reviewers δεν δέχονται ούτε σφάλμα επιπέδου notice. Για παράδειγμα αν κάπου στον κώδικά σας χρησιμοποιείται μεταβλητές πρέπει οπωσδήποτε να έχουν αρχικές τιμές κλπ.

Ένα σημαντικό κομμάτι στην ενότητα αυτή είναι το παρακάτω:

Validate and/or sanitize untrusted data before entering into the database. All untrusted data should be escaped before output. (See: Data Validation)

Αυτό είναι πάρα πολύ σημαντικό γιατί ΌΛΟΙ οι theme reviewers εμμένουν σε αυτό. Πριν κάνω κάποιο παράδειγμα παρακαλώ διαβάστε και αποθηκεύστε το άρθρο που μιλάει και εξηγεί για data validation στο WordPress. Με απλά ελληνικά , κάθε input και κάθε output στο theme θα πρέπει να φροντίζουμε να είναι καθαρή ώστε να μην υπάρξει πρόβλημα με τα δεδομένα του χρήστη. Όταν λέμε για input μιλάμε για δεδομένο που μπαίνει προς τη βάση δεδομένων και όταν λέμε για output είναι δεδομένο που μας παρουσιάζεται ή χρησιμοποιείται αλλού για να μας παρουσιαστεί συνήθως.

Παράδειγμα data validation σε theme

Έστω ότι σε ένα σημείο του theme πρέπει να εμφανίσω κάποιο image URL από το customizer .

Προσέξτε το «esc_url» που χρησιμοποιώ στον κώδικα. Αν στη μεταβλητή $image δεν έχω URL , τότε επιστρέφει ένα κενό string. Έτσι προστατευόμαστε .

Στο κομμάτι του κώδικα υπάρχουν ακόμα 2 πολύ σημαντικά στοιχεία που κανείς theme author δεν πρέπει να παραλείψει.

  1. Unique prefixing
  2. Να μην έχουν διαγραφεί η να έχουν τροποποιηθεί κάποια non-presentational WordPress hooks.

Unique prefixing

Στο theme που φτιάχνετε όλα τα functions κλπ που θα χρησιμοποιήσετε πρέπει να έχουν μοναδικά prefixes. Μία προσφιλής τακτική είναι να χρησιμοποιούμε το theme-slug, η το textdomain. Για παράδειγμα:

To unique prefixing πρέπει να το κάνετε σε constant μεταβλητές, option values, settings στο customizer κλπ. Δεν χρειάζεται prefixing στα εξής:

  • CSS properties κλπ
  • Enqueue handles όταν κάνετε enqueue κάποιο js ή css που δεν το έχετε φτιάξει . Για παράδειγμα αν στο theme χρησιμοποιείτε κάποιο custom js script που δεν το έχετε φτιάξει εσείς, τότε δεν χρειάζεται prefixing.

Παράδειγμα για τα παραπάνω:

Όχι τροποποιημένα core hooks – non presentational

Όπως ξέρουμε το WordPress παρέχει μία σειρά από hooks. Απαγορεύεται να τροποποιήσουμε ή και να διαγράψουμε hooks που δεν έχουν σχέση με το περιεχόμενο που προβάλλουμε όπως πχ το «wp_head()» ή και άλλα action hooks.

Core χαρακτηριστικά και λειτουργίες

Το αμέσως επόμενο κομμάτι που πρέπει να προσέξουμε είναι να χρησιμοποιούμε functions που μας προσφέρει το WordPress καταρχας και εν συνεχεία δικές μας. Για παράδειγμα για να δημιουργούμε το title tag σε μία σελίδα δεν χρειάζεται να φτιάξουμε δικό μας function αφού το WordPress μας το παρέχει. Επίσης πρέπει το theme μας να έχει δυνατότητα για δημιουργία child theme. Επίσης πάντα μα πάντα για το frontend χρησιμοποιούμε τα template tags του WordPress καθώς actions/filters του WordPress και μόνο. Εννοείται φυσικά ότι μπορούμε να τοποθετήσουμε και δικά μας actions / filters όχι όμως για να αντικαταστήσουμε core functions.

Παρουσίαση vs Λειτουργικότητα & Plugin Territory

Ένα πολύ σημαντικό κομμάτι είναι να αποφύγουμε με κάθε κόστος το να χρησιμοποιήσουμε functions και λειτουργίες που παραπέμπουν στο λεγόμενο plugin territory του WordPress. Με απλά ελληνικά δεν πρέπει να εμφανίζουμε περιεχόμενο που βασίζεται σε custom post types , η να δημιουργούμε custom widgets. Επίσης απαγορεύεται η δημιουργία metaboxes αλλά και των dashboard widgets.

Εάν λοιπόν αναρωτιέστε πώς κάποια Free WordPress Themes έχουν μία αρχική σελίδα η οποία έχει πχ sections κλπ, αυτό που κάνουν οι theme authors είναι το εξής. Δημιουργούν customizer settings και με χρήση υπάρχουσων σελίδων τις προβάλλουν πχ στην αρχική σελίδα η  οποία μπορεί να είναι custom page template.

Το βασικό που πρέπει να έχετε στο μυαλό σας για το WordPress.org είναι ότι το content πρέπει να μεταφέρεται αυτούσιο από το ένα WordPress theme στο άλλο. Καταλαβαίνετε ότι αν υπάρχουν κάποια custom fields ή post types που ορίζουν το περιεχόμενο με το που θα γίνει το theme switch θα χαθεί το περιεχόμενο αυτό.

Documentation

Κατά την υποβολή του WordPress theme πρέπει στο readme.txt που διαθέτει να έχει ένα απλό documentation σχετικά με τα features ή και τους περιορισμούς. Κάτι που μου έχει τύχει είναι ότι ο reviewer μου ζήτησε να δηλώσω ότι το navigation menu που είχα φτιάξει έχει μόνο 2 επίπεδα και δεν υποστηρίζει τρίτο επίπεδο.

Δήλωση εξωτερικών scripts,styles ,libraries και εικόνων που εμφανίζουμε και στο demo.

Στο documentation πρέπει να δηλώνονται με ακρίβεια όλα τα scripts , τα libraries κλπ τα CSS styles τα οποία δεν είναι δικά μας αλλά τα χρησιμοποιούμε. Ένα παράδειγμα για το πώς το δηλώνουμε είναι παρακάτω.

Απαγορεύονται scripts που δεν είναι GPL licenced, είτε MIT είτε να έχουν κάποια άδεια χρήσης που δεν σου δίνει απόλυτη ελευθερία χρήσης.

Γλώσσα και μεταφράσεις

Όλα τα strings και εννοούμε όλα πρέπει να έχουν τη δυνατότητα να είναι μεταφράσιμα. Έτσι λοιπόν αν μέσα στο theme έχουμε κάποιο string όπως :

όπου το text domain το δηλώνουμε στο style.css στο κομμάτι με τα σχόλια στο πάνω μέρος του. Υπάρχουν διάφορα functions που μας δίνονται για να κάνουμε μεταφράσιμα τα διάφορα hardcoded strings . Επίσης σε όλα τα strings πρέπει να έχουμε την ίδια γλώσσα. Επίσης μεταφράσιμα πρέπει να είναι όλα τα headings κλπ που φτιάχνουμε στο customizer και είναι δικά μας.

Παράδειγμα

Έστω ότι φτιάχνουμε ένα customizer control:

Η γραμμή που ορίζει το label έχει και το text-domain «restaurant-pt«. Χρησιμοποιώντας κάποιο πολυγλωσσικό Plugin μπορούμε να το μεταφράσουμε. Επίσης μπορούμε και πρέπει να έχουμε .pot file με όλα μας τα strings έτοιμα προς μετάφραση με το poedit .

Άδεια χρήσης του WordPress Theme

Η άδεια χρήσης που θα αναγράφεται ρητώς στο WordPress theme πρέπει να είναι GPLv2 ή GPLv3. Απαγορεύεται ένα WordPress theme να είναι ολόιδιο με ένα άλλο.

Custom Options

Τον τελευταίο χρόνο έχει απαγορευτεί η χρήση των theme options στα themes που είναι προς υποβολή στο WordPress.org. Για να έχετε options πρέπει να χρησιμοποιηθεί ο WordPress customizer. Όλα τα settings που φτιάχνουμε οφείλουμε να τα «καθαρίζουμε»- sanitization που αναφέραμε πιο πάνω- και επίσης πρέπει όλα τα settings να έχουν default values. Το API του customizer μας τα προσφέρει όλα απλόχερα.

Screenshot του theme.

Υποχρεωτικά το κάθε theme πρέπει να συνοδεύεται από screenshot και η ονομασία του αρχείου υποχρεωτικά είναι «screenshot.png». Δύο πράγματα πρέπει να έχουμε κατά νου.

  1. Η διάσταση της εικόνας πρέπει να είναι είτε 880×660 είτε 1200×900 , σε pixels.
  2. Αυτό που απεικονίζει θα πρέπει να είναι το ίδιο το theme , και όχι κάτι άλλο . Μπορεί για παράδειγμα το theme μας να έχει μία πολύ όμορφη αρχική η οποία δημιουργείται βασιζόμενη σε contents και κάποια settings του customizer. Επειδή όμως όταν κάποιος κάνει activate το theme δεν βλέπει συνήθως τίποτα, πρέπει στο documentation να υπάρχουν ακριβείς οδηγίες για το πώς θα σεταριστεί η αρχική αυτή.
  3. Κάτι πάρα πολύ σημαντικό . Έστω ότι στο screenshot απεικονίζονται και εικόνες, πχ ένα header image . Αυτή η εικόνα ΠΡΕΠΕΙ να είναι είτε με άδεια CC0 είτε να είναι δικό μας δημιούργημα. Αυτά τα γράφουμε στο αρχείο readme.txt που βρίσκεται στο root του φακέλου που περιέχει το theme μας.

Πωλήσεις υπηρεσιών ή κάποιας pro έκδοσης του ίδιου theme, μέσα από το WordPress theme.

Κακά τα ψέμματα είναι σίγουρο ότι στα 10 themes που θα κατεβάσετε από το .org repository τα 8 διαθέτουν το λεγόμενο upsell . Ο theme authors έχουν φροντίσει να εμφανίζουν κάποια call to action buttons όπως «Buy Pro Now» κλπ τα οποία τα τοποθετούν είτε μέσα στον customizer είτε αλλού, αλλά δεν επηρεάζουν σε καμία περίπτωση τη λειτουργία του theme. Προσοχή στο εξής. Αν υποθέσουμε ότι στην Pro έκδοση έχει κάποια έξτρα settings κλπ ΑΠΑΓΟΡΕΥΕΤΑΙ να εμφανίζονται και στην FREE και να είναι μη λειτουργικά, πχ να είναι disabled. Διαβάστε και εδώ τι απαγορεύεται στο upselling.

Styles και scripts

Απλά και κατανοητά απαγορεύεται το hardcoding των scripts στο header ή στο footer του site. Χρησιμοποιείστε το wp_enqueue_styles/scripts για να χρησιμοποιήσετε τα scripts που θέλετε.

Templates

Στα WordPress themes που ετοιμάζουμε για το WordPres repo μπορούμε φυσικά να δημιουργήσουμε και custom page templates. Εννοείται ότι κάποια standard κομμάτια templates όπως το header ή το footer τα καλούμε με το  <?php get_header(); ?> και το

<?php get_footer(); ?> αντίστοιχα. Custom template parts τα καλούμε με το

<?php get_template_part('template-name'); ?>

Προσωπικά tips για την υποβολή WordPress Theme.

Μετά από την παραπάνω ανάλυση θα σας δώσω και μερικά προσωπικά tips για να πάει όσο το δυνατόν καλύτερα η υποβολή του WordPress theme σας.

  1. Πριν ανεβάσετε το theme βεβαιωθείτε ότι περνάει το Theme Check που γίνεται από το συγκεκριμένο plugin.
  2. Εάν το theme σας περνάει , προσπαθήστε να προσθέσετε και τα recommended items. Το theme check σας έχει και προτάσεις για να το κάνετε ακόμα καλύτερο το theme σας.
  3. Εάν ανεβάσετε το theme στον tracker του WordPress μην κάνετε τίποτα παρά μόνο κρατήστε τα emails που σας ήρθαν γιατί δίνουν πληροφορίες για το ticket που έχει ανοίξει για το theme κλπ.
  4. Μην πτοηθείτε αν δείτε ότι περνάει καιρός μέχρι το πρώτο σας review. Εμένα το τελευταίο μου WordPress theme είναι ήδη 3μιση μήνες μέσα.
  5. Αν πιστεύετε ότι κάτι κάνατε λάθος τότε μπορείτε πολύ απλά να κάνετε update το ανεβασμένο theme. Απλά αλλάζεται τον κώδικα στα σημεία που θέλετε και το version number στο style.css. Προσοχή , ούτε κατά διάνοια δεν αλλάζετε το όνομα του theme και το όνομα φακέλου του theme.
  6. Όταν με το καλό σας απαντήσει ο reviewer κάντε τις διορθώσεις που θα σας πει. Αν κάπου πιστεύετε ότι υπερβάλλει ρωτήστε τον να σας δείξει ακριβώς που βρίσκεται αυτό το θέμα για το οποίο έχετε διαφωνίες.
  7. Κάντε τις αλλαγές μέσα σε 4-6 μέρες και πάντα γράφετε μηνύματα στο ίδιο το ticket για να δείξετε ότι δεν το έχετε ξεχάσει. Προσοχή αν αφήσετε αναπάντητο ticket 7 μέρες τότε το theme γίνεται closed και απορρίπτεται.
  8. Μην τσακωθείτε με τον reviewer. Κάποιες πολλές και ο ίδιος είναι theme author και πουλάει και themes. Απλά κάντε τις αλλαγές και συμβουλευτείτε και άλλον και πιστέψτε με, δεν μπορεί να κάνει κάτι άλλο.
  9. Υπομονή .

Αυτά είχα να σας πω σχετικά με την υποβολή ενός WordPress theme στο org repo. Παρακαλώ πολύ γράψτε σχόλια και κάντε και ερωτήσεις και με χαρά θα σας απαντήσω ,όπου γνωρίζω. Μοιραστείτε και το άρθρο όλο και κάποιος θα το έχει ανάγκη και θα θέλει να μάθει τι και πώς. Σας υπερ ευχαριστώ για την υπομονή σας και την ανάγνωσή σας!

 

Leave a Reply

2 Σχόλια on "Πώς κάνω υποβολή WordPress theme στο WordPress.org repo;"

Ενημέρωσε με για..
avatar
Sort by:   νεότερα | παλαιότερα | πιο πολύ ψηφισμένα
Luka
Guest

καλό άρθρο μπράβο!

wpDiscuz