Άφησε την παλιά σου δουλειά. Ανακατεύθυνση στη σελίδα εγγραφής που επιθυμείτε

Εργαλείο 08.04.2019
Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει...

Σας επιτρέπει να χρησιμοποιείτε μία εγκατάσταση WordPress για πολλούς ιστότοπους ταυτόχρονα. Σε αυτήν την περίπτωση, κάθε ιστότοπος παίρνει τους δικούς του πίνακες στη βάση δεδομένων με ένα μοναδικό πρόθεμα.

Οι πίνακες με τα δεδομένα των εγγεγραμμένων χρηστών είναι κοινοί σε όλους τους ιστότοπους του δικτύου. Αυτό είναι ένα σαφές πλεονέκτημα και με την εγγραφή σας μόλις αποκτήσετε πρόσβαση σε πολλούς ιστότοπους. Επιπλέον, σε κάθε ιστότοπο ο ίδιος λογαριασμός μπορεί να έχει διαφορετικά δικαιώματα. Για παράδειγμα, σε έναν ιστότοπο ένας χρήστης μπορεί να είναι συντάκτης και σε έναν άλλο διαχειριστής.

ΣΕ κανονική εγκατάσταση Σελίδα WordPressεγγραφή, εξουσιοδότηση και επαναφορά κωδικού πρόσβασης εξάγει το αρχείο wp-login.php.

  • wp-login.php - εξουσιοδότηση
  • wp-login.php?action=register - εγγραφή
  • wp-login.php?action=lostpassword - επαναφορά κωδικού πρόσβασης

Σε λειτουργία πολλαπλών τοποθεσιών Πυρήνας WordPressαρχίζει να συμπεριφέρεται ελαφρώς διαφορετικά και όταν ακολουθήσετε τον σύνδεσμο wp-login.php?action=register θα συμβεί μια ανακατεύθυνση στο wp-signup.php. Αυτή είναι η σελίδα εγγραφής του δικτύου σας που συνοδεύεται από το WordPress από προεπιλογή.

Εκτός από την εγγραφή του συνηθισμένου λογαριασμούς χρηστώνΜπορείτε επίσης να δημιουργήσετε μια νέα τοποθεσία σε αυτήν εάν ο υπερ-διαχειριστής έχει ενεργοποιήσει αυτήν τη δυνατότητα στις ρυθμίσεις δικτύου (Διαχειριστής δικτύου → Ρυθμίσεις → Ρυθμίσεις δικτύου).

Στα περισσότερα θέματα, η σελίδα εγγραφής δεν φαίνεται πολύ καλή. Πολλά θέματα χρησιμοποιούν πλαίσια CSS όπως το Bootstrap και τις δικές τους ειδικές κλάσεις για στυλ διαφορετικά στοιχείασε σελίδες, επομένως είναι δύσκολο να γράψετε ένα ενιαίο HTML που να ταιριάζει σε όλους.

Αλλά μην απελπίζεστε αν η σελίδα φαίνεται ακατάστατη. Το αρχείο wp-signup.php είναι εξαιρετικό πράγμα στην αρχή, όταν δεν έχετε χρόνο να εργαστείτε σε κάθε λεπτομέρεια του ιστότοπου - μπορείτε να εστιάσετε σε άλλα περισσότερα σημαντικές σελίδεςκαι περιεχόμενο.

Όταν είστε έτοιμοι να δημιουργήσετε τη δική σας σελίδα εγγραφής, το wp-signup.php είναι ένα καλό πρότυπο και παράδειγμα για να κατανοήσετε εύκολα το εύρος των δυνατοτήτων που παρέχει το WordPress για την επεξεργασία και την επικύρωση των εισροών των χρηστών και τη δημιουργία νέων λογαριασμών.

Κύρια τοποθεσία του δικτύου

Από προεπιλογή, το WordPress ανοίγει τη σελίδα εγγραφής (wp-signup.php) στον κύριο τομέα (site) του δικτύου. Ωστόσο, μπορείτε να δημιουργήσετε σελίδες εγγραφής για κάθε τοποθεσία στο δίκτυό σας, ακόμα κι αν έχουν θέματα.

Θα εξετάσουμε την περίπτωση όταν όλοι οι ιστότοποι στο δίκτυο χρησιμοποιούν το ίδιο θέμα, αλλά καθένας από αυτούς έχει μια σελίδα εγγραφής. Οι ιστότοποι διαφέρουν ως προς τη γλώσσα (Αγγλικά και Ρωσικά), επομένως η σελίδα εγγραφής θα εμφανίζεται στη "μητρική" γλώσσα του ιστότοπου. Σε περίπτωση που οι ιστότοποι χρησιμοποιούν διαφορετικά θέματα, όλα θα εξαρτηθούν από το τι ακριβώς είναι αυτά τα θέματα, εάν η ίδια διάταξη είναι κατάλληλη για αυτά (μια εξαιρετική κατάσταση που μπορεί να σας ωθήσει να ενοποιήσετε όλα τα θέματα σας) ή αξίζει να εργαστείτε στις σελίδες ξεχωριστά.

Εναλλακτικά του functions.php

Αρχειοθέτηση παραγγελίας

Τα πρόσθετα MU μπορούν να περιέχουν οποιονδήποτε αριθμό αρχείων και μια δομή που σας φαίνεται λογική. Παραμένω σε κάτι σαν αυτή την ιεραρχία:

| mu-plugins | | load.php | | selena-δίκτυο | | | εγγραφή | | | | plugin.php | | | ... | | | jetpack | | | | plugin.php

Το αρχείο load.php περιλαμβάνει μεταφράσεις και όλα τα απαραίτητα "πρόσθετα":

// Φόρτωση μεταφράσεων για προσθήκες MU load_muplugin_textdomain("selena_network", "/selena-network/languages/"); // Η λειτουργικότητα για τη σελίδα εγγραφής απαιτεί WPMU_PLUGIN_DIR. "/selena-network/signup/plugin.php"; // Μια άλλη προσθήκη // απαιτεί WPMU_PLUGIN_DIR ...

Οι φάκελοι των προσθηκών αποθηκεύονται στον κατάλογο του δικτύου selena. Το καθένα έχει το δικό του plugin.php, το οποίο συμπεριλαμβάνουμε στο load.php. Αυτό σας δίνει την ευελιξία και τη δυνατότητα να απενεργοποιείτε και να ενεργοποιείτε άμεσα μεμονωμένα εξαρτήματα σε ένα έργο εργασίας σε περίπτωση έκτακτης ανάγκης.

Σελίδα εγγραφής

Έχοντας καταλάβει πού και πώς θα γράψουμε τον κωδικό, μπορούμε να προχωρήσουμε στη δημιουργία μιας σελίδας εγγραφής.

Ας δημιουργήσουμε μια σελίδα με τη διεύθυνση example.org/signup/ via κανονική διεπαφή. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε διεύθυνση URL που φαίνεται κατάλληλη για το έργο σας.

Ανακατευθυνθείτε στη σελίδα εγγραφής που θέλετε

Για να ενημερώσουμε το WordPress για το δικό μας νέα σελίδαεγγραφή και ανακατεύθυνση ακριβώς σε αυτό, όταν κάνετε κλικ στο σύνδεσμο «Εγγραφή», χρησιμοποιείται το φίλτρο wp_signup_location. Μπορεί να βρεθεί μέσα στο wp-login.php και είναι υπεύθυνο για την ανακατεύθυνση στο wp-signup.php από προεπιλογή.

Υπόθεση "register" : if (is_multisite()) ( wp_redirect(apply_filters("wp_signup_location", network_site_url("wp-signup.php"))); έξοδος; // ...

Όπως θυμάστε, από προεπιλογή, η σελίδα εγγραφής ανοίγει στον κύριο τομέα του δικτύου. Αυτός είναι ο λόγος που χρησιμοποιείται εδώ το network_site_url().

Ας προσθέσουμε τον χειριστή μας στο φίλτρο στο mu-plugins/selena-network/signup/plugin.php, το οποίο θα επιστρέψει τη διεύθυνση της σελίδας εγγραφής στον τρέχοντα ιστότοπο:

Συνάρτηση selena_network_signup_page($url) ( return home_url("signup"); ) add_filter("wp_signup_location", "selena_network_signup_page", 99);

Το selena_network είναι το πρόθεμα που χρησιμοποιώ στα ονόματα όλων των λειτουργιών εντός των προσθηκών MU στον ιστότοπό μου για την αποφυγή συγκρούσεων, θα πρέπει να αντικατασταθεί με το δικό σας μοναδικό πρόθεμα. Η προτεραιότητα της προσθήκης ενός φίλτρου είναι 99, επειδή ορισμένες προσθήκες, για παράδειγμα, το bbPress και το BuddyPress μπορούν να αντικαταστήσουν αυτήν τη διεύθυνση με τη δική τους (τα πρόσθετα MU φορτώνουν νωρίτερα από τα κανονικά πρόσθετα, βλέπε παραπάνω).

Λάβετε υπόψη ότι χρησιμοποιείται το home_url(), το οποίο, σε αντίθεση με το network_site_url(), επιστρέφει τη διεύθυνση της τρέχουσας τοποθεσίας και όχι της κύριας τοποθεσίας του δικτύου.

Λειτουργικότητα wp-signup.php

Το αρχείο wp-signup.php περιέχει μεγάλο αριθμόλειτουργίες και κώδικας. Για να δείτε τη μεγάλη εικόνα, μπορείτε να χρησιμοποιήσετε το δίπλωμα κώδικα. Κατά κανόνα, στα αγγλικά αυτό ονομάζεται "code folding".

Στην αρχή του αρχείου από τις γραμμές 1 έως 80 (στην έκδοση 4.1.1) διάφορους ελέγχουςκαι βγάζοντας την «έναρξη» της σελίδας χρησιμοποιώντας get_header() .

Στη συνέχεια, δηλώνονται πολλές μέθοδοι και πριν αρχίσουμε να εργαζόμαστε με αυτές, αξίζει να κατανοήσουμε τι κάνει κάθε συνάρτηση. Πολλοί από αυτούς χρησιμοποιούν συχνά άλλες συναρτήσεις με το πρόθεμα wpmu_, οι οποίες δηλώνονται στο αρχείο wp-includes/ms-functions.php. Αυτή η ενότητα είναι δύσκολο να κατανοηθεί χωρίς να δείτε μόνοι σας τον κώδικα. Παρακάτω σύντομη περιγραφήβασικές λειτουργίες σε περίπτωση που αντιμετωπίζετε δυσκολίες.

  • wpmu_signup_stylesheet() - Εξάγει επιπλέον CSS στη σελίδα εγγραφής.
  • show_blog_form() - πεδία για εγγραφή ιστότοπου (διεύθυνση, τίτλος, ορατότητα για μηχανές αναζήτησης).
  • validate_blog_form() - επικυρώνει την καταχωρημένη διεύθυνση και τον τίτλο του ιστότοπου χρησιμοποιώντας την wpmu_validate_blog_signup() .
  • show_user_form() - πεδία για εγγραφή χρήστη (σύνδεση και διεύθυνση email).
  • validate_user_form() — έλεγχος της εισαγόμενης διεύθυνσης σύνδεσης και email. αλληλογραφία χρησιμοποιώντας wpmu_validate_user_signup() .
  • signup_another_blog() - πεδία για την εγγραφή νέων τοποθεσιών χρησιμοποιώντας show_blog_form() για χρήστες που είναι ήδη εγγεγραμμένοι στον ιστότοπο.
  • validate_another_blog_signup() - ελέγχει τη διεύθυνση και τον τίτλο του ιστότοπου χρησιμοποιώντας validate_blog_form() .
  • signup_user() είναι η κύρια συνάρτηση για την εμφάνιση των πεδίων της σελίδας εγγραφής.
  • validate_user_signup() - ελέγχει τη σύνδεση και τη διεύθυνση email. αλληλογραφία χρησιμοποιώντας validate_user_form() .
  • signup_blog() - πεδία για την εισαγωγή της διεύθυνσης, του ονόματος και της ορατότητας του ιστότοπου (δεύτερο βήμα εγγραφής) χρησιμοποιώντας show_blog_form() .
  • validate_blog_signup() - ελέγχει τη σύνδεση, τη διεύθυνση email. email, διεύθυνση και όνομα ιστότοπου.

Στο κάτω μέρος του αρχείου wp-signup.php (από τη γραμμή 646 στην έκδοση 4.1.1) βρίσκεται η κύρια λογική της σελίδας εγγραφής, η οποία χρησιμοποιεί όλες τις μεθόδους που περιγράφονται παραπάνω. Αυτό το μέρος του κώδικα δεν περιλαμβάνεται στη συνάρτηση. Στο τέλος καλείται η get_footer().

Αντιγράψτε τη λειτουργικότητα του wp-signup.php

Τα παρακάτω θα περιγράψουν τη διαδικασία για την αντιγραφή του wp-signup.php σε πρόσθετα MU και την πραγματοποίηση αλλαγών στο "fork". Μπορεί να μην φαίνεται και το καλύτερο τον σωστό τρόπο. Αντίθετα, μπορείτε να γράψετε τις δικές σας συναρτήσεις από την αρχή για να επικυρώσετε και να εμφανίσετε φόρμες χρησιμοποιώντας κλάσεις αντί κανονικές λειτουργίες. Κατά τη γνώμη μου, το wp-signup.php έχει ήδη όλη την απαραίτητη λογική για τη σελίδα μας, το μόνο που μένει είναι να κάνουμε κάποιες μικρές αλλαγές.

Όταν το WordPress ενημερώνεται, το wp-signup.php αλλάζει επίσης από καιρό σε καιρό, αλλά αυτό δεν σημαίνει ότι θα πρέπει να συγχρονίζετε το "fork" σας με κάθε κυκλοφορία. Οι συναρτήσεις μέσα στο wp-signup.php αφορούν ουσιαστικά μόνο την έξοδο HTML, την επαλήθευση δεδομένων, τη δημιουργία λογαριασμών και τοποθεσιών και μεθόδους με το πρόθεμα wpmu_, που δηλώνεται στο ms-functions.php.

Ας δημιουργήσουμε μια συνάρτηση που θα εμφανίζει τη φόρμα εγγραφής στη σελίδα. Για να το κάνετε αυτό, αντιγράψτε το wp-signup.php από τη ρίζα του WordPress στο mu-plugings/selena-network/signup/ . Ας το συνδέσουμε μέσα στο mu-plugins/selena-network/signup/plugin.php).

Απαιτείται WPMU_PLUGIN_DIR . "/selena-network/signup/wp-signup.php";

Ας αφαιρέσουμε από την αρχή του αντιγραμμένου αρχείου όλα απαιτούν και περιττούς ελέγχους. Στην έκδοση 4.1.1 αυτός είναι όλος ο κώδικας από τις γραμμές 1 έως 80.

Τώρα είμαστε έτοιμοι να δημιουργήσουμε κύρια λειτουργίαγια να εμφανίσετε τη φόρμα εγγραφής. Για να γίνει αυτό, θα μεταφέρουμε όλη τη λογική από τη γραμμή 646 μέχρι το τέλος του αρχείου σε μια συνάρτηση που ονομάζεται selena_network_signup_main. Στο τέλος, θα αφαιρέσουμε δύο επιπλέον κλεισίματα

(γραμμές 722 και 723), καθώς και η κλήση get_footer().

Στη νεοδημιουργηθείσα selena_network_signup_main(), στην αρχή θα δηλώσουμε την καθολική μεταβλητή active_signup, η οποία χρησιμοποιείται από όλες τις άλλες μεθόδους από αυτό το αρχείο. Και ας προσθέσουμε μια κλήση στο συμβάν before_signup_form, το οποίο αφαιρέσαμε από την αρχή του αρχείου.

Συνάρτηση selena_network_signup_main() ( καθολική $active_signup; do_action("before_signup_form"); // ... )

Τώρα το μόνο που μένει είναι να αλλάξουμε τη διάταξη σε όλα τα σημεία που είναι απαραίτητο και η σελίδα εγγραφής είναι έτοιμη.

Έξοδος της φόρμας εγγραφής

Υπάρχουν τουλάχιστον δύο επιλογές εδώ. Περισσότερο βολικό τρόπο— δημιουργήστε έναν σύντομο κώδικα και τοποθετήστε τον στη σελίδα χρησιμοποιώντας ένα κανονικό πρόγραμμα επεξεργασίας.

// Δημιουργήστε έναν σύντομο κώδικα network_signup add_shortcode("network_signup", "selena_network_signup_main");

Η δεύτερη επιλογή είναι να δημιουργήσετε στο φάκελο παιδικό θέμαπρότυπο σελίδας page-signup.php . Αντί για τη λέξη "εγγραφή" μπορείτε να χρησιμοποιήσετε το μοναδικό αναγνωριστικό που έχει εκχωρηθεί στη σελίδα. Μέσα στο πρότυπο, προσθέστε την απαραίτητη διάταξη και καλέστε τη selena_network_signup_main() στη σωστή θέση.

Ως αποτέλεσμα, η σελίδα εγγραφής μου φαινόταν πολύ καλύτερη και καθαρότερη.

Σελίδα ενεργοποίησης

Από προεπιλογή, το WordPress χωρίζει υπό όρους τη διαδικασία εγγραφής στο Multisite σε δύο βήματα - συμπληρώνοντας μια φόρμα στον ιστότοπο και ενεργοποιώντας τον λογαριασμό σας κάνοντας κλικ στον σύνδεσμο που αποστέλλεται στο e-mail. Αφού συμπληρώσετε τη φόρμα που δημιουργήθηκε στην προηγούμενη ενότητα, το WordPress στέλνει ένα email με σύντομες οδηγίες και έναν σύνδεσμο για την ενεργοποίηση του λογαριασμού σας.

Το αρχείο wp-activate.php που βρίσκεται στον ριζικό κατάλογο του WordPress είναι υπεύθυνο για την εμφάνιση της σελίδας ενεργοποίησης. Το wp-activate.php μπορεί επίσης να αλλάξει εντελώς. Η διαδικασία είναι παρόμοια με αυτή που κάναμε ήδη για το wp-signup.php.

Ας δημιουργήσουμε τη σελίδα example.org/activate/ μέσω της κανονικής διεπαφής. Για τη διεύθυνση, χρησιμοποιήστε οποιαδήποτε διεύθυνση URL που σας φαίνεται κατάλληλη.

Ας αντιγράψουμε το αρχείο wp-activate.php στις προσθήκες MU και ας το συνδέσουμε στο mu-plugins/selena-network/signup/plugin.php.

Απαιτείται WPMU_PLUGIN_DIR . "/selena-network/signup/wp-activate.php";

Δεν υπάρχει πολύ περιεχόμενο μέσα, σε αντίθεση με το wp-signup.php. Το αρχείο εκτελεί μία μόνο λειτουργία - ενεργοποιεί τον λογαριασμό εάν ληφθεί το σωστό κλειδί και εμφανίζει ένα μήνυμα σχετικά με το σφάλμα ή την επιτυχή ολοκλήρωση της λειτουργίας.

Ας καταργήσουμε όλους τους περιττούς ελέγχους και ας απαιτήσουμε - από τις γραμμές 1 έως 69 στο WordPress 4.1.1. Στο τέλος, θα καταργήσουμε την κλήση get_footer(). Θα μεταφέρουμε τα υπόλοιπα περιεχόμενα στη συνάρτηση selena_network_activate_main().

Είναι ενδιαφέρον να σημειωθεί ότι εδώ πριν φόρτωση του WordPress(wp-load.php) δηλώθηκε η σταθερά WP_INSTALLING. Η παρουσία του κάνει το WordPress να μην φορτώνει πρόσθετα.

Όπως και στην περίπτωση της σελίδας εγγραφής, το μόνο που μένει είναι να διορθώσετε τη διάταξη όπου χρειάζεται. Μπορείτε επίσης να αλλάξετε το κείμενο των μηνυμάτων που εμφανίζονται (σε ​​αυτήν την περίπτωση, μην ξεχάσετε να προσθέσετε τον τομέα κειμένου των προσθηκών MU σε όλες τις λειτουργίες του μεταφραστή· από προεπιλογή, δεν είναι εγκατεστημένο πουθενά).

Η έτοιμη συνάρτηση μπορεί να χρησιμοποιηθεί σε μια προ-δημιουργημένη σελίδα μέσω ενός σύντομου κώδικα ή ενός ξεχωριστού προτύπου σε ένα θυγατρικό θέμα.

Γράμματα ενεργοποίησης με σωστούς συνδέσμους

Η σελίδα ενεργοποίησης είναι έτοιμη, αλλά το WordPress δεν το γνωρίζει και θα εξακολουθεί να στέλνει μηνύματα ηλεκτρονικού ταχυδρομείου ενεργοποίησης με έναν σύνδεσμο στο wp-activate.php. Σε αντίθεση με το wp-signup.php, δεν υπάρχει φίλτρο που να σας επιτρέπει να αλλάξετε τη διεύθυνση. Αντίθετα, πρέπει να γράψετε τη δική σας λειτουργία που θα στέλνει email με τους σωστούς συνδέσμους.

Όταν συμπληρώνετε και υποβάλετε τη φόρμα στη σελίδα εγγραφής, το WordPress καλεί το wpmu_signup_ μεταχειριζόμενος() ή wpmu_signup_ blog() ανάλογα με τον τύπο εγγραφής. Και οι δύο λειτουργίες δημιουργούν νέα καταχώρησηστον πίνακα wp_signups, συμπληρώνοντάς τον με το απαραίτητο περιεχόμενο, συμπεριλαμβανομένου του κλειδιού ενεργοποίησης λογαριασμού.

Στη συνέχεια, ανάλογα με τη συνάρτηση, καλείται το wpmu_signup_ μεταχειριζόμενος _notification() ή wpmu_signup_ blog _notification() . Και οι δύο συναρτήσεις έχουν παρόμοια λειτουργικότητα - δημιουργούν και στέλνουν ένα email με έναν σύνδεσμο ενεργοποίησης, αλλά λαμβάνουν διαφορετικά επιχειρήματα. Και οι δύο έχουν φίλτρα για να «αναχαιτίσουν» το συμβάν.

Εάν (! apply_filters("wpmu_signup_user_notification", $user, $user_email, $key, $meta)) επιστρέψει false;

Για να ενεργοποιήσετε λογαριασμούς με τη δημιουργία ιστολογίου:

Εάν (! apply_filters("wpmu_signup_blog_notification", $domain, $path, $title, $user, $user_email, $key, $meta)) ( return false; )

Το μόνο που μένει είναι να γράψετε τους δικούς σας χειριστές, μέσα στους οποίους στέλνετε γράμματα μέσω wp_mail() , και στο τέλος, φροντίστε να επιστρέψετε false έτσι ώστε το WordPress να μην στείλει μια επιστολή ενεργοποίησης δύο φορές - η μία είναι δική σας, η άλλη είναι η προεπιλογή επιστολή με σύνδεσμο στο wp-activate.php .

Συνάρτηση selena_network_wpmu_signup_user_notification($user, $user_email, $key, $meta = array()) ( // Δημιουργία της κεφαλίδας, του κειμένου και των κεφαλίδων του γράμματος // ... // Στείλτε το γράμμα ή προσθέστε μια εργασία Cron για να στείλετε το letter wp_mail($user_email , wp_specialchars_decode($subject), $message, $message_headers // Δώστε false ώστε το WordPress να μην στείλει το email ενεργοποίησης δύο φορές return false("wpmu_signup_user_notification", "selena_1notwork"); ;

Εάν στέλνετε μηνύματα ηλεκτρονικού ταχυδρομείου μέσω διακομιστή SMTP ή ο αριθμός των εγγραφών είναι πολύ μεγάλος, θα πρέπει να σκεφτείτε να μην στείλετε άμεσα email. Αντίθετα, μπορείτε να προσθέσετε εργασίες Cron χρησιμοποιώντας το WordPress Cron.

Κλείνουμε την πρόσβαση στα wp-signup.php και wp-activate.php

Έχοντας δημιουργήσει το δικό σας δικές του σελίδεςεγγραφή και ενεργοποίηση, ίσως χρειαστεί να κλείσετε τα «πρωτότυπα». Για παράδειγμα, εάν υπάρχουν επιπλέον πεδία στη σελίδα εγγραφής που πρέπει να συμπληρωθούν. Επίσης, πολλοί ιστότοποι WordPress υπόκεινται σε εγγραφές ανεπιθύμητων μηνυμάτων.

Μπορείτε να λύσετε δύο προβλήματα σε μία ενέργεια ζητώντας από τον Apache να επιστρέψει ένα 404 εάν προσπαθήσετε να ανοίξετε αυτές τις σελίδες. Για να το κάνετε αυτό, χρειάζεται απλώς να προσθέσετε μερικά επιπλέον RewriteRules στο αρχείο διαμόρφωσής σας ή .htaccess.

RewriteEngine On RewriteBase / # Γνώση κανονικές εκφράσειςδεν θα είναι ποτέ περιττό :) RewriteRule ^wp-signup\.php - RewriteRule ^wp-activate\.php - # BEGIN WordPress # Δεν αγγίζουμε τους κανόνες από το WordPress από προεπιλογή :) # ... # ΤΕΛΟΣ WordPress

Σύναψη

Υπάρχουν πολλές λύσεις για αυτό και πολλά άλλα «προβλήματα» του WordPress στο Διαδίκτυο. Για παράδειγμα, για να δημιουργήσετε σελίδες εγγραφής και ενεργοποίησης, ορισμένοι προτείνουν να ξαναγράψετε τα πρωτότυπα wp-signup.php και wp-activate.php . Αυτό δεν πρέπει να γίνει, γιατί εάν ενημερώσετε το WordPress, θα χάσετε όλες τις αλλαγές που έγιναν στα αρχεία και επίσης δεν θα μπορείτε να ελέγξετε την ακεραιότητα του πυρήνα χρησιμοποιώντας το .

Κατά την ανάπτυξη οποιουδήποτε πρόσθετου, θέματος ή λύσης, θα πρέπει να αφιερώσετε λίγο χρόνο για να κατανοήσετε τι συμβαίνει μέσα στο WordPress. Υπάρχουν πολλά χρήσιμα εργαλεία εντοπισμού σφαλμάτων για αυτό.

P.S.

Για αυτόματη ανάθεσηΟι νέοι χρήστες μπορούν να χρησιμοποιήσουν την προσθήκη Multisite User Management για διαφορετικούς ρόλους.

Εάν έχετε οποιεσδήποτε ερωτήσεις ή δυσκολίες κατά τη δημιουργία σελίδων εγγραφής και ενεργοποίησης μετά την ανάγνωση του άρθρου, αφήστε ένα σχόλιο και σίγουρα θα σας απαντήσουμε.

27.03.2015 27.03.2015

Προγραμματιστής WordPress. Λατρεύει την τάξη σε όλα και την κατανόηση νέων εργαλείων. Εμπνευσμένο από την αρχιτεκτονική στοιχείων Symfony.

  • Ένας ευγενής παρανοϊκός και για κάποιο λόγο αποφάσισαν να εγκαταστήσουν το Wordpress, τότε... Το πρώτο πράγμα που μου ήρθε στο μυαλό ήταν "πρέπει να περιορίσουμε την ελευθερία αυτής της δημιουργίας!"

    Ρυθμίσεις λογαριασμός, όπως και τις ρυθμίσεις php5-fpm, θα παραλείψω, αφού ο καθένας έχει τις δικές του κατσαρίδες, και κάποιοι τις τρέχουν ακόμα και σε apache. Θα περιγράψω όμως τα κοινά για το Wordpress σε αυτό το μέρος. Θα γράψω για το τι έκανα, τι έγινε και γιατί.

    Φάκελοι
    • wp-admin
    • wp-content
    • wp-περιλαμβάνει
    php αρχεία

    Αυτό τυπικό σύνολογια το Wordpress 4.0.

    Τι χρειαζόμαστε; Πρέπει να περιορίσουμε την πρόσβαση σε php αρχείο m και τον πίνακα διαχείρισης, αφαιρέστε το στατικό, κλείστε το xmlrpc.

    Περιορίζουμε την πρόσβαση στον πίνακα διαχείρισης και στα αρχεία php

    Στο δικό μου έκδοση wordpressΔεν αποθηκεύω σχόλια χρηστών και δεν χρησιμοποιώ xmlrpc. Πώς να παρέχετε με ασφάλεια πρόσβαση σε σχόλια, καθώς και μια σειρά από άλλα πιεστικά ζητήματα σχετικά με το nginx και το wordpress, θα συζητηθούν στο δεύτερο μέρος αυτού του άρθρου, το οποίο, φυσικά, θα δημιουργηθεί εάν είναι διαθέσιμα. Δεδομένου ότι δεν υπάρχει apache εδώ, το αρχείο .htaccess είναι άχρηστο.
    Επομένως, κλείνουμε τους παραπάνω πληροφοριοδότες:

    Τοποθεσία ~* ^/(\.htaccess|xmlrpc\.php)$ (επιστροφή 404; )

    Μετά από αυτό, όταν ζητάμε xmlrpc.php και .htaccess, θα λάβουμε ένα σφάλμα 404. Αν και μπορείτε να εκδώσετε 403 και 200 ​​"trololo", αυτό είναι θέμα γούστου.

    Στη συνέχεια, περιορίζουμε την πρόσβαση στα υπόλοιπα. Με τον περιορισμό εννοώ το αίτημα εξουσιοδότησης, δηλαδή auth_basic .

    Τοποθεσία ~* ^/wp-admin/(.*(?

    *αυτός ο κώδικας θα αναγκάσει το nginx να ζητήσει εξουσιοδότηση όταν ζητά στατικό περιεχόμενο από το /wp-admin/.

    Τοποθεσία ~* (/wp-admin/|/wp-cron\.php|/wp-config\.php|/wp-config-sample\.php|/wp-mail\.php|/wp-settings\. php|/wp-signup\.php|/wp-trackback\.php|/wp-activate\.php|/wp-links-opml\.php|/wp-load\.php|/wp-comments-post \.php|/wp-blog-header\.php|/wp-login\.php|/wp-includes/.*?\.php|/wp-content/.*?\.php) ( auth_basic "προστατεύεται με κωδικό"; auth_basic_user_file users/somefile; root /path/to/site/root; #more parameters )

    Μια καταχώρηση όπως /wp-includes/.*?\.php περιλαμβάνει τα πάντα php αρχείαστο wp-includes και παρακάτω.

    Έγινε, έχουμε κλειστή πρόσβαση. Τώρα θα συμπεριλάβουμε επιλεκτικά τα στοιχεία που χρειαζόμαστε για τη δημόσια έκδοση, και αυτό είναι περαιτέρω στο κείμενο.

    Ενεργοποιήστε τις προστατευμένες αναρτήσεις στο ασφαλές Wordpress μας

    Αφού κλείσαμε το wp-login.php με εξουσιοδότηση, τότε γράφοντας μια ασφαλή ανάρτηση και αφήνοντας τον σύνδεσμο και τον κωδικό πρόσβασης (από την ανάρτηση) στον σωστό χρήστη, ο χρήστης... θα φοβάται ένα άγνωστο παράθυρο. Δεδομένου ότι ο κωδικός πρόσβασης μεταβιβάζεται στο αρχείο wp-login.phpΠως ανάρτηση αιτήματοςΜε GET παραμέτρους ?action=postpass.

    nginxεπιβάλλει ορισμένους περιορισμούς:

    • Στην τοποθεσία nginx δεν μπορούμε να περιγράψουμε τις παραμέτρους αιτήματος.
    • δεν μπορείτε να χρησιμοποιήσετε το auth_basic σε μια δήλωση if.
    • παίζοντας με μια μεταβλητή στο config, η οποία περνάει 1 σε περίπτωση επιτυχούς εξουσιοδότησης, δεν θα φέρει τίποτα, αφού η μεταβλητή ζει μόνο στο τρέχον αίτημα.
    Τι να κάνουμε;

    Υπάρχει λύση! Δημιουργήστε έναν συμβολικό σύνδεσμο προς wp-login.phpστον ίδιο φάκελο. Έχω αυτό wp-postpass.php. Συμβολικός σύνδεσμοςχρειάζεται ώστε αν ενημερώσουμε το wordpress, τότε wp-login.phpθα ενημερωθεί και αυτό και θα ενημερωθεί το αρχείο στο link... Γι' αυτό μου αρέσει το linux.

    Στη συνέχεια γράφουμε στη διαμόρφωση nginx:

    Τοποθεσία ~* (/wp-postpass\.php) ( if ($args ~ "^action=postpass$") ( ορίστε $wppostpass 1; ) if ($wppostpass ~ 0) ( return 403; ) #more parameters )

    Στην περίπτωση αυτή, κατόπιν αιτήματος /wp-postpass.php?action=postpassη μεταβλητή wppostpass θα πάρει την τιμή 1 και η τοποθεσία θα λειτουργεί μέχρι το τέλος. Σε περίπτωση απλού αιτήματος wp-postpass.phpή με άλλες παραμέτρους (όπως μπορείτε να δείτε εδώ, ελέγχεται από την αρχή ^ έως το τέλος $ της γραμμής) θα υπάρχει ένα σφάλμα 403, που σημαίνει ότι δεν επιτρέπεται η πρόσβαση.

    Για να λειτουργήσει αυτό το σχήμα, χρειαζόμαστε το ngx_http_substitutions_filter_module . Στο config πρέπει να γράψετε

    Subs_filter "https://example.com/wp-login.php\?action=postpass" "https://example.com/wp-postpass.php?action=postpass" gi;

    Μετακινούμε τα στατικά δεδομένα σε ξεχωριστό διακομιστή και συνδέουμε το CDN

    Στο φόρτο εργασίας, τα js, css και μικρά gif δεν παίζουν ρόλο, αφού αν υπάρχει μνήμη, το nginx τα αποθηκεύει στην κρυφή του μνήμη και αν υπάρχει αρκετή μνήμη, ολόκληρη η στατική τοποθεσία του ιστότοπου μπορεί να μεταφερθεί σε ένα διαμέρισμα tmpfs (3,8 GB ανάγνωσης-εγγραφής και 745k iops" ov για παράδειγμα).

    Αλλά στην περίπτωση ενός διακομιστή, κάποιος θα λάβει το αρχείο νωρίτερα, κάποιος αργότερα, και αν έχουμε πολλούς πελάτες, τότε όταν διανέμουμε 1000 αρχεία 1 MB το καθένα, το κανάλι θα στραγγίσει σημαντικά εάν δεν εισαγάγετε τον ρυθμό.

    Είναι για αυτές τις περιπτώσεις που εφευρέθηκαν οι πάροχοι CDN προσωρινής αποθήκευσης. Για παράδειγμα - cloudflare.

    Η αρχή της λειτουργίας απεικονίζεται υπέροχα στην εικόνα τους:

    Χωρίς CDN, όλα τα αιτήματα πηγαίνουν στον τελικό ιστότοπο και με ένα CDN, τα αιτήματα πηγαίνουν στον πάροχο CDN, ο οποίος λειτουργεί ως ενδιάμεσος σύνδεσμος. Και σε αυτήν την περίπτωση, εάν 1000 χρήστες ζητήσουν ένα αρχείο 1 MB, τότε αυτό το αρχείο θα ζητηθεί από τον πάροχο CDN μία φορά για την προσωρινή μνήμη του και στη συνέχεια θα διανεμηθεί σε αυτούς τους 1000 χρήστες. Επιλογές DDoS σε στυλ à la google docsόταν ζητηθεί big_photo.jpg?ver=1, τότε big_photo.jpg?ver=2κ.λπ. δεν θα λειτουργήσει εάν έχει επιλεγεί η λειτουργία μέτρια προσωρινή αποθήκευση (το έχει το cloudflare) και προσωρινή αποθήκευση μόνο στατικών, στη συνέχεια όταν ζητάτε big_photo.jpg, big_photo.jpg?ver=1ή big_photo.jpg?ver=123ζητήθηκε από τον διακομιστή big_photo.jpgκαι μετά διανέμεται αυτός και μόνο αυτός, ακόμα κι αν ο πελάτης ζητήσει ένα αρχείο με επιχειρήματα (απλά αγνοούνται). Αυτό λύνει το πρόβλημα του DDoS από τον πάροχο cdn, ο οποίος ουσιαστικά θα πρέπει επίσης να προστατεύει από DDoS.

    Δεν έκανα πολύ ψάξιμο, αλλά διαπίστωσα ότι τα προεπιλεγμένα στατικά είναι αποθηκευμένα σε:

    • /wp-content/uploads/
    • /wp-content/themes/
    • /wp-content/plugins/
    • /wp-includes/js/
    • /wp-includes/css/
    • /wp-includes/certificates/
    • /wp-includes/fonts/
    • /wp-includes/images/
    Αντίστοιχα, θα δημιουργήσουμε νέους κανόνες για αυτούς στην τοποθεσία και θα χρησιμοποιήσουμε το nginx με το ngx_http_substitutions_filter_module .
    Δεν είναι απαραίτητο να εγκαταστήσετε αυτήν την ενότητα, μπορείτε να τα βγάλετε πέρα ​​με απλά επανεγγραφές, αλλά από μόνη της είναι χρήσιμη και μέσω αυτής μπορείτε να βελτιώσετε αυτό ή εκείνο το αποτέλεσμα από το backend.

    Προσθήκη στη διαμόρφωση:

    Subs_filter_types text/html;

    subs_filter_types text/xml; Για φιλτράρισμαΈξοδος html

    Subs_filter "https://example.com/wp-content/uploads/" "https://static.example.com/uploads/" gi; subs_filter "https://example.com/wp-content/themes/" "https://static.example.com/themes/" gi; subs_filter "https://example.com/wp-content/plugins/" "https://static.example.com/plugins/" gi; subs_filter "https://example.com/wp-includes/js/" "https://static.example.com/js/" gi; subs_filter "https://example.com/wp-includes/css/" "https://static.example.com/css/" gi; subs_filter "https://example.com/wp-includes/certificates/" "https://static.example.com/certificates/" gi; subs_filter "https://example.com/wp-includes/fonts/" "https://static.example.com/fonts/" gi; subs_filter "https://example.com/wp-includes/images/" "https://static.example.com/images/" gi;

    Τοποθεσία ~* ^/wp-content/themes/(.*(?

    Ως αποτέλεσμα, όταν ζητάτε οποιοδήποτε αρχείο php, δεν θα συμβεί τίποτα. Και όταν ζητάτε στατικό περιεχόμενο (οτιδήποτε δεν είναι php στην περίπτωση του WP, που είναι λογικό), ο χρήστης θα ανακατευθυνθεί στον στατικό διακομιστή.

    Θα συζητηθεί η ρύθμιση ενός προφίλ nginx για έναν στατικό διακομιστή.

    Στη συνέχεια, το μόνο που μένει είναι να δημιουργήσετε έναν λογαριασμό στο cloudflare (ή οποιονδήποτε άλλο) πάροχο cdn που πρόκειται να χρησιμοποιήσετε, να καταχωρήσετε το DNS του στον εαυτό σας και να ενεργοποιήσετε την προσωρινή αποθήκευση του τομέα static.example.com, χωρίς caching example.com, όπου εκτελείται το wordpress.

    Ρύθμιση στατικού διακομιστή

    Εφόσον μεταφέραμε την έξοδο στον στατικό διακομιστή, είναι απαραίτητο να ρυθμιστεί σωστά.

    Να επιτρέπεται 127.0.0.1; επιτρέπονται διακομιστές IPv4. να επιτρέπεται ο διακομιστής IPv6. Να επιτρέπεται η IP/υποδίκτυο διακομιστών CDN. ... να επιτρέπεται η IP/υποδίκτυο διακομιστών CDN. αρνούνται όλα?

    Πρέπει να επιτρέψετε την πρόσβαση στον localhost, την πρόσβαση στον ίδιο τον διακομιστή από μια εξωτερική IP (για παράδειγμα, ένα σενάριο) και τους διακομιστές του παρόχου CDN. Για παράδειγμα, τα υποδίκτυα CloudFlare βρίσκονται σε αυτόν τον σύνδεσμο. Και, φυσικά, αρνηθείτε την πρόσβαση σε όλους τους άλλους. Γιατί αν το CDN αποφασίσει ξαφνικά να στείλει απευθείας κίνηση... αφήστε ένα δωρεάν κανάλι.

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

    Root /path/to/site/dummy;

    Έτσι ώστε τα αιτήματα που έρχονται στον στατικό διακομιστή τοποθεσία/ή =/ και τα οποία δεν αντιστοιχούν στην τοποθεσία που ορίζεται εκεί, πήγαν στο ίδιο ανδρείκελοτηλεφωνικός κατάλογος. Αυτός ο κατάλογος είναι γραμμένος μέσα υπηρέτης().

    Τοποθεσία =/ ( default_type text/html; επιστροφή 200 "c"est static, c"est simple:P"; )

    Αυτό είναι το κείμενο που θα δει ο χρήστης που ζητά το root. Μπορείτε να γράψετε οτιδήποτε, το κύριο πράγμα είναι όταν χρησιμοποιείται μέσα " διαφυγής εισαγωγικά όπως \" .

    Τότε θα πρέπει να γράψετε τοποθεσία"s σε στατική:

    Τοποθεσία ~* ^/uploads/.*(?

    Κατόπιν αιτήματος static.example.com/images/pic.pngο διακομιστής θα δώσει το αρχείο από τον κατάλογο /wp-includes/images/αρχείο pic.png, αλλά όταν ρωτήθηκε static.example.com/images/pic.phpΗ τοποθεσία θα κάνει κλικ και ως αποτέλεσμα θα δοθεί στον χρήστη ένα αρχείο από το dummy/images/pic.php, το οποίο δεν υπάρχει και ως αποτέλεσμα ένα σφάλμα 404.

    Πρέπει επίσης να προσθέσετε ρυθμούς ταχύτητας.

    Όριο_ποσοστό_μετά από 16μ. limit_rate 2m;

    Μετά από 16 megabyte η ταχύτητα μειώνεται στα 2 MB ανά δευτερόλεπτο στο ρεύμα. Αυτό συμβαίνει ώστε το CDN να μην φράζει ολόκληρο το κανάλι κατά την προσωρινή αποθήκευση ενός τεράστιου αρχείου.

    Στην περίπτωση του cloudflare μέγιστο μέγεθοςΤο αρχείο (τη στιγμή της σύνταξης αυτού του υλικού) είναι 512 megabyte και οι υποστηριζόμενες μορφές είναι δωρεάν τιμολογιακό σχέδιοπεριλαμβάνουν: css, js, jpg, jpeg, gif, ico, png, bmp, pic, csv, doc, pdf, pls, ppt, tif, tiff, eps, ejs, swf, midi, mid, ttf, eot, woff, otf, svg, svgz, webp, docx, xlsx, xls, pptx, ps, class, jar.

    Αίτημα φιλτραρίσματος

    Υπάρχουν δύο περιπτώσεις εδώ:
    1. Κατά τη λήψη αρχείων πολυμέσων, λαμβάνουν έναν σύνδεσμο όπως example.com/?attachment_id=XX, Πού XXΑυτό ταυτότητασελίδες για αυτό το αρχείο πολυμέσων. Περνώντας τα 1, 2, 3... αντίστοιχα, ο χρήστης μπορεί να κατεβάσει όλο το περιεχόμενο, συμπεριλαμβανομένου αυτού του τμήματός του που δεν προορίζεται για αυτόν.
    2. php είναι γεμάτη προβλήματα. Πιθανώς, δεν είναι τόσο η αρχιτεκτονική της γλώσσας, αλλά οι δεξιότητες των προγραμματιστών και οι ρυθμίσεις του περιβάλλοντος στο οποίο περιστρέφεται αυτή η δημιουργία. Αλλά από τότε που εγκαταστήσαμε το WordPress, θα προετοιμαστούμε για μελλοντικά σφάλματα.
    Για να γίνει αυτό, θα γράψουμε υπηρέτης()τις ρυθμίσεις μας για τον κώδικα nginx:

    If ($args ~* "(attachment_id|eval|duplicate|base64|substring|preg_replace|create_function)") (επιστροφή 403; )

    Στη συνέχεια, εάν τα ορίσματα αιτήματος περιέχουν attachment_id, eval, duplicate, base64, substring, preg_replace, create_functionΤο nginx θα επιστρέψει ένα σφάλμα 403 και το αίτημα δεν θα σταλεί στο δυναμικό για την εκτέλεση της πιθανής ευπάθειας.

    Μπόνους μέσω subs_filter από το nginx

    Ο σκοπός αυτής της ενότητας έχει συζητηθεί.

    Εργο:Το wordpress ανοίγει από προεπιλογή συνδέσμους αρχείων πολυμέσων τρέχον παράθυρο. Αλλά πρέπει να είναι σε ένα νέο.

    Διάλυμα:

    Subs_filter " " ""gi;subs_filter" " ""gi;

    Διάλυμα:προσθέστε λίγο κώδικα στο nginx cogfig.

    Subs_filter "https://example.com/xmlrpc.php" "https://example.com/xmlrpc.txt" gi;

    Λοιπόν, μπορείτε να βάλετε ένα πασχαλινό αυγό στο xmlrpc.txt.

    Επίλογος

    Καλή σου τύχη!

    Ετικέτες:

    • wordpress
    • nginx
    • σύνθεση
    • τοποθεσία
    • τεμ
    Προσθήκη ετικετών

    Γενικός

    Γίνετε προγραμματιστής PHP Junior

    Γεια σε όλους. Εργάστηκα ως ειδικός SEO, αλλά τα πράγματα ήταν... πρόσφατατα πράγματα δεν πάνε πολύ καλά και επομένως για να ζήσεις πρέπει να προχωρήσεις. Σε όλη μου τη ζωή ονειρευόμουν να βοηθάω τους πάντες και να με χρειάζεται κάποιος ή για κάτι στη δουλειά. Το αγάπησε από την παιδική ηλικία υλικό υπολογιστή, αποσυναρμολογώ, συναρμολογώ. Μπορείτε ακόμη να πείτε ότι έχω περάσει την ενήλικη ζωή μου χρησιμοποιώντας υπολογιστές. Εγκαταστήστε και εμβαθύνετε σε διάφορα λογισμικό. Αποφοίτησα από το κολέγιο ως μηχανικός λογισμικού, τώρα σπουδάζω σε ένα πανεπιστήμιο για να γίνω μηχανικός. εξ αποστάσεως εκπαίδευση. Όλοι οι προγραμματιστές το γνωρίζουν πολύ καλά καλός προγραμματισμόςΔεν σας διδάσκουν, αλλά πρέπει να μάθετε τα πάντα μόνοι σας :-) Τώρα είμαι 21 ετών και έχω μεγάλη επιθυμία να βρω τη δουλειά των ονείρων μου και να ξεκινήσω να χτίζω μια καριέρα.

    Επιπλέον, δουλεύω παράλληλα στη δουλειά, αλλά δυστυχώς, κάτι που δεν με ενδιαφέρει. Βοηθώ στη συντήρηση μηχανών CNC και παρακολουθώ το τμήμα υπολογιστών 30 ατόμων (βοηθώ πού και πού να πατήσω ποιο κουμπί).

    P.S. Δεν ξέρω αν περιέγραψα σωστά τους στόχους και τους στόχους. Θα χαρώ να βοηθήσω τόσο στην προπόνησή μου όσο και εντός σωστό σχέδιοστόχους. Σας ευχαριστώ!

    Κριτήρια επίτευξης στόχων

    βρείτε δουλειά ως κατώτερος προγραμματιστής και ξεκινήστε την ανάπτυξη της καριέρας σας

    Προσωπικοί πόροι

    γνώση σε περιοχές html, css, προώθηση ιστοσελίδων, μηχανές αναζήτησης και διάφορες διαφημιστικές ανταλλαγές

    Στόχος οικολογική συμβατότητα

    Αυτό είναι απαραίτητο για να βρεις επιτέλους τον εαυτό σου στη ζωή και να πάρεις μια θέση στην κοινωνία. Φυσικά, όλα εξαρτώνται από εμένα και θέλουν λίγη τύχη.

    1. Ξεκινήστε να μαθαίνετε PHP από τα βασικά χρησιμοποιώντας την υπηρεσία phpdocs.net

    2. Προγραμματισμός σε PHP 5.3 (επίπεδα 1,2,3,4)

      Βρήκα αυτά τα εκπαιδευτικά βίντεο για συμβουλές από άλλους σκοπούς. Σίγουρα θα το μελετήσουμε, γιατί ο κόσμος είναι ευχαριστημένος με αυτό! :)

    3. Μάθετε επιπλέον γλώσσες

      Δεδομένου ότι έχω εμπειρία και γνώσεις εργασίας με HTML, CSS, νομίζω ότι θα χρειαστεί επίσης να μελετήσω ερωτήματα βάσης δεδομένων SQL, ερωτήματα και κάθε είδους συναφή πλαίσια. Νομίζω ότι είναι αρκετό για την Τζουνιούρα, αλλά ποιος ξέρει; :-)

    4. Άφησε την παλιά σου δουλειά

      Δυστυχώς, στη δουλειά μου ο κανόνας είναι ότι οι νέοι λαμβάνουν υψηλότερους μισθούς και μετά μειώνονται. Παράλογος; - Απολύτως. Αλλά τι να κάνουμε; - Ψάξτε για μια νέα έκθεση χώρο εργασίας. Επομένως μου φαίνεται ότι είναι αλήθεια και η σωστή επιλογήθα μάθει τη γλώσσα, θα βρει δουλειά στις διακοπές και θα ξεκινήσει τη διαδικασία της «περιπλάνησης» από το ένα μέρος στο άλλο :-)



  • Συνιστούμε να διαβάσετε

    Κορυφή