Πρόσθετα WordPress PHP (άγκιστρα, φίλτρα, ενέργειες). Τα συμβάντα και τα φίλτρα στο WordPress Exact κάνουν δράση php

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

Εκδηλώσεις

Τα συμβάντα ή οι ενέργειες στο WordPress μοιάζουν πολύ με συμβάντα στο JavaScript. Ένα συμβάν εκτελείται καλώντας τη συνάρτηση do_action() και μπορείτε να προσθέσετε μια συνάρτηση σε οποιοδήποτε συμβάν χρησιμοποιώντας τη συνάρτηση add_action().

Όταν εκτελείται ένα συμβάν ή μια ενέργεια, όλες οι συναρτήσεις που προστίθενται στο συμβάν εκτελούνται με συγκεκριμένη σειρά. Αυτό γίνεται πιο εύκολα κατανοητό με ένα απλό παράδειγμα. Ορίζουμε τρεις συναρτήσεις που θα βγάζουν 1, 2 και 3 αντίστοιχα:

Συνάρτηση one() ( echo 1; ) function two() (echo 2; ) function three() (echo 3; )

Προσθέτουμε συναρτήσεις στο συμβάν foo χρησιμοποιώντας τη συνάρτηση add_action():

Add_action("foo", "one"); add_action("foo", "two"); add_action("foo", "tree");

Και εκτελούμε το συμβάν μας χρησιμοποιώντας τη συνάρτηση do_action():

Do_action("foo"); // θα βγει 123

Το πρώτο όρισμα στις συναρτήσεις είναι η συμβολοσειρά foo - το όνομα του συμβάντος. Το όνομα μπορεί να είναι οτιδήποτε, αλλά για να αποφύγετε διενέξεις με άλλες προσθήκες και θέματα στα δικά σας συμβάντα, είναι προτιμότερο να χρησιμοποιήσετε ένα πρόθεμα, για παράδειγμα myplugin_foo , όπου myplugin είναι το όνομα της προσθήκης σας.

Το δεύτερο όρισμα στη συνάρτηση add_action() είναι η συνάρτηση που καλείται όταν εκτελείται το συμβάν. Οι συναρτήσεις εντός ενός μεμονωμένου συμβάντος εκτελούνται με την ίδια σειρά με την οποία προστέθηκαν στο συμβάν, εκτός εάν μια συνάρτηση προστίθεται σε ένα συμβάν υψηλότερης ή χαμηλότερης προτεραιότητας. Περισσότερα για τις προτεραιότητες λίγο αργότερα.

Έτσι, το παράδειγμά μας θα καλούσε τις συναρτήσεις one() , two() και three() με τη σειρά, οι οποίες θα εκτυπώσουν 123. Φυσικά, θα μπορούσαμε να καλέσουμε αυτές τις συναρτήσεις μόνοι μας με την ίδια σειρά στη θέση της do_action() , που θα έδινε το ίδιο αποτέλεσμα. Γιατί λοιπόν να χρησιμοποιήσετε τα συμβάντα;

Γιατί να χρησιμοποιήσετε εκδηλώσεις

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

/* Σε άλλο πρόσθετο */ function four() ( echo 4; ) remove_action("foo", "tree"); add_action("foo", "four");

Έτσι, όταν πρόκειται να καλέσετε το συμβάν foo στο πρόσθετό σας, η έξοδος δεν θα είναι πλέον 123, αλλά 124, επειδή το άλλο πρόσθετο αφαίρεσε τη συνάρτηση three() από το συμβάν σας χρησιμοποιώντας τη συνάρτηση remove_action() και πρόσθεσε νέα τέσσερα λειτουργεί στη θέση του ().

Το παράδειγμα με την εμφάνιση αριθμών δεν είναι το πιο χρήσιμο. Στην πράξη, είναι πολύ εύκολο να δημιουργήσετε συμβάντα στο θέμα ή την προσθήκη σας που θα μπορούσαν να είναι χρήσιμα για άλλες προσθήκες, για παράδειγμα:

Αξίζει επίσης να σημειωθεί ότι ο ίδιος ο πυρήνας του WordPress έχει πάνω από 1.500 φίλτρα και συμβάντα που μπορούν να χρησιμοποιηθούν σε θέματα και πρόσθετα.

Φίλτρα

Τα φίλτρα στο WordPress μοιάζουν πολύ με συμβάντα. Η κύρια διαφορά είναι ότι τα φίλτρα έχουν μια τιμή που μεταβιβάζουν σε κάθε δεσμευμένη συνάρτηση, επομένως κάθε συνάρτηση πρέπει να επιστρέψει την ίδια ή μια τροποποιημένη τιμή. Ας δούμε ένα απλό παράδειγμα:

Συνάρτηση plus_one($value) ( $value = $value + 1; return $value; )

Αυτή η συνάρτηση παίρνει ένα όρισμα, προσθέτει ένα σε αυτό και επιστρέφει το αποτέλεσμα. Ας προσθέσουμε τη συνάρτησή μας στο νέο φίλτρο χρησιμοποιώντας την add_filter():

Add_filter("foo", "plus_one");

Τώρα όλες οι συναρτήσεις που προστέθηκαν στο φίλτρο foo (στην περίπτωσή μας είναι μόνο μία συνάρτηση) μπορούν εύκολα να κληθούν ή να "εφαρμοστούν" χρησιμοποιώντας τη συνάρτηση application_filters():

Echo apply_filters("foo", 5); // 6

Περνάμε τη φιλτραρισμένη τιμή ως δεύτερο όρισμα στη συνάρτηση application_filters(). Μπορεί να είναι οτιδήποτε και θα μεταβιβαστεί σε κάθε συνάρτηση που είναι συνδεδεμένη στο φίλτρο και οποιοδήποτε φίλτρο μπορεί να αλλάξει αυτήν την τιμή.

Σε αυτήν την περίπτωση, η τιμή 6 θα εκτυπωθεί επειδή η τιμή 5 πέρασε από τη συνάρτηση plus_one(), η οποία τροποποίησε την αρχική μεταβλητή. Εάν αφαιρέσουμε τη συνάρτηση φίλτρου χρησιμοποιώντας remove_filter() , ο κώδικάς μας θα δώσει την αρχική τιμή 5:

Remove_filter("foo", "plus_one"); echo apply_filters("foo", 5); // 5

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

Παράδειγμα καλού φίλτρου

Ας δούμε ένα πιο ενδιαφέρον παράδειγμα: ας δημιουργήσουμε έναν πίνακα που θα περιέχει συνδέσμους προς τα προφίλ μας στα κοινωνικά δίκτυα και θα εμφανίζει αυτούς τους συνδέσμους στην κεφαλίδα του θέματος WordPress. ΣΕ :

Συνάρτηση get_my_social_profiles() ( $profiles = array("twitter" => "http://twitter.com/wpmagru", "facebook" => "http://facebook.com/wpmagru",); επιστροφή $profiles; )

Ο πίνακας που επιστράφηκε μπορεί να χρησιμοποιηθεί σε βρόχο στο αρχείο header.php:

$profiles = get_my_social_profiles(); foreach ($profiles as $service => $url) ( printf("%s", esc_url($url), $service); )

/* Στο functions.php */ συνάρτηση get_my_social_profiles() ( $profiles = array("twitter" => "http://twitter.com/wpmagru", "facebook" => "http://facebook.com/wpmagru ",); επιστροφή apply_filters("my_social_profiles", $profiles); )

Με αυτόν τον τρόπο, οποιαδήποτε προσθήκη ή θυγατρικό θέμα μπορεί εύκολα να διαχειριστεί τη λίστα των κοινωνικών προφίλ χωρίς να αγγίξει το αρχικό θέμα. Για παράδειγμα, μπορείτε να αφαιρέσετε έναν σύνδεσμο προς το Twitter και να προσθέσετε έναν σύνδεσμο στο Google+ χρησιμοποιώντας τον ακόλουθο κώδικα στην προσθήκη:

Συνάρτηση change_my_social_profiles($profiles) ( unset($profiles["twitter"]); $profiles["google-plus"] = "https://plus.google.com/+wpmagru"; επιστροφή $profiles; ) add_filter( "my_social_profiles", "change_my_social_profiles");

Φίλτρα και συμβάντα στον πυρήνα του WordPress

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

Απενεργοποίηση σχολιασμού

Μπορείτε να απενεργοποιήσετε τον σχολιασμό σε ολόκληρο τον ιστότοπο, ανάλογα με τις ρυθμίσεις στις παραμέτρους, χρησιμοποιώντας τον ακόλουθο κώδικα:

Συνάρτηση my_comments_open() ( return false; ) add_filter("comments_open", "my_comments_open");

Το φίλτρο comments_open χρησιμοποιείται στον πυρήνα του WordPress κάθε φορά για να ελέγχει εάν τα σχόλια σε ένα συγκεκριμένο άρθρο είναι ανοιχτά. Η συνάρτησή μας επιστρέφει πάντα false για αυτό το φίλτρο, επομένως τα σχόλια θα κλείνουν παντού.

Παρεμπιπτόντως, ο πυρήνας του WordPress ορίζει αρκετές βοηθητικές λειτουργίες για την εργασία με τέτοια φίλτρα:

  • __return_true() - επιστρέφει true
  • __return_false() - επιστρέφει false
  • __return_zero() - επιστρέφει 0
  • __return_empty_string() - επιστρέφει μια κενή συμβολοσειρά
  • __return_empty_array() - επιστρέφει έναν κενό πίνακα
  • __return_null() - επιστρέφει null

Δηλαδή, το φίλτρο μας στο comments_open μπορεί να ξαναγραφτεί σε μία γραμμή:

Add_filter("comments_open", "__return_false");

Αλλάξτε το μήκος των αυτόματων εισαγωγικών

Το φίλτρο excerpt_length ελέγχει το μήκος των αυτόματων εισαγωγικών:

Συνάρτηση my_excerpt_length($length) ( $length = 10; return $length; ) add_filter("excerpt_length", "my_excerpt_length");

Χρησιμοποιώντας το φίλτρο excerpt_more, μπορείτε να αλλάξετε το κείμενο που τοποθετείται στο τέλος του αυτόματου εισαγωγικού· από προεπιλογή είναι [...]:

Συνάρτηση my_excerpt_more($more) ( $more = "→"; επιστροφή $more ) add_filter("excerpt_more", "my_excerpt_more");

Προσθέστε ένα banner στο περιεχόμενο κάθε άρθρου

Το φίλτρο_περιεχομένου εκτελείται πριν από την εμφάνιση του περιεχομένου κάθε άρθρου. Το ίδιο το περιεχόμενο του άρθρου περνά μέσα από το φίλτρο, επομένως είναι εύκολο να προσθέσετε ένα banner σε αυτό "εν πτήσει" χρησιμοποιώντας την προσθήκη:

Συνάρτηση my_banner($content) ( $banner = " "; $content = $banner . $content; επιστροφή $content; ) add_filter("the_content", "my_banner");

Προσθέστε το favicon.ico στην ενότητα

Το συμβάν wp_head εκτελείται σε μια ενότητα σε κάθε θέμα. Κατά τη διάρκεια αυτού του συμβάντος, μπορείτε να εμφανίσετε έναν σύνδεσμο προς το αρχείο favicon.ico, να εισαγάγετε αυθαίρετο κώδικα JavaScript ή CSS και πολλά άλλα:

Συνάρτηση my_favicon() ( echo ""; ) add_action("wp_head", "my_favicon");

Λάβετε υπόψη ότι εάν χρειάζεται να συμπεριλάβετε εξωτερικά αρχεία .js ή .css, θα πρέπει να το κάνετε χρησιμοποιώντας τις συναρτήσεις wp_enqueue_script() και wp_enqueue_style() κατά τη διάρκεια του συμβάντος wp_enqueue_scripts και όχι απευθείας στο wp_head .

Κάθε έκδοση του WordPress προσθέτει όλο και περισσότερα νέα και χρήσιμα φίλτρα και συμβάντα. Μπορείτε να βρείτε μια λίστα με τα περισσότερα φίλτρα και συμβάντα στον πυρήνα στον ιστότοπο του Adam Brown ή σαρώνοντας τα αρχεία του πυρήνα για "do_action" και "apply_filters".

Προτεραιότητες

Οι συναρτήσεις που προστέθηκαν σε φίλτρα και συμβάντα εκτελούνται με την ίδια σειρά με την οποία προστέθηκαν, αλλά η σειρά μπορεί εύκολα να αλλάξει χρησιμοποιώντας προτεραιότητες. Η προτεραιότητα υποδεικνύεται από το τρίτο όρισμα στις συναρτήσεις add_action() και add_filter().

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

Ας επιστρέψουμε στο παράδειγμα με τους αριθμούς:

Add_action("foo", "one"); add_action("foo", "two"); add_action("foo", "tree"); do_action("foo"); // θα βγει 123

Εάν αλλάξετε την προτεραιότητα εκτέλεσης της συνάρτησης three() σε 9, τότε θα εκτελεστεί πριν από τις άλλες:

Add_action("foo", "one"); add_action("foo", "two"); add_action("foo", "tree", 9); do_action("foo"); // θα βγει 312

Ομοίως, εάν ορίσετε την προτεραιότητα 11 στη συνάρτηση one(), θα εκτελεστεί αργότερα από όλες τις άλλες, παρόλο που προστέθηκε πρώτα χρησιμοποιώντας την add_action():

Add_action("foo", "one", 11); add_action("foo", "two"); add_action("foo", "tree", 9); do_action("foo"); // θα βγει 321

Επιπλέον επιλογές

Είναι εύκολο να περάσετε πρόσθετες παραμέτρους σε κάθε συνάρτηση που είναι συνδεδεμένη σε ένα φίλτρο ή συμβάν. Αυτό γίνεται καλώντας τις συναρτήσεις do_action() ή application_filters(), για παράδειγμα:

Do_action("foo", $arg1, $arg2, $arg3); $value = apply_filters("foo", $value, $arg1, $arg2, $arg3);

Το βασικό σημείο είναι ότι όταν προσθέτουμε μια συνάρτηση σε ένα φίλτρο ή συμβάν, πρέπει να καθορίσουμε τον αριθμό των ορισμάτων που θα αποδεχθούμε, αυτή είναι η τέταρτη παράμετρος των συναρτήσεων add_action() και add_filter().

Για παράδειγμα, εάν στη συνάρτηση του συμβάντος foo θέλουμε να πάρουμε και τα τρία ορίσματα, πρέπει να καθορίσουμε το 3 ως την τέταρτη παράμετρο στην add_action():

Συνάρτηση my_func($arg1, $arg2, $arg3) ( ... ) add_action("foo", "my_func", 10, 3);

Ομοίως, εάν σε μια συνάρτηση που προστίθεται σε ένα φίλτρο θέλουμε να πάρουμε μόνο το $arg1 ως πρόσθετο όρισμα, τότε ζητάμε από την add_filter() να περάσει μόνο δύο ορίσματα - το πρώτο όρισμα είναι $value και το δεύτερο πρόσθετο όρισμα είναι $arg1:

Συνάρτηση my_func($value, $arg1) ( ... ) add_filter("foo", "my_func", 10, 2);

Παράδειγμα

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

Add_filter("allow_password_reset", "__return_false");

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

Συνάρτηση my_filter($allow, $user_id) ( if (is_super_admin($user_id)) $allow = false; return $allow; ) add_filter("allow_password_reset", "my_filter", 10, 2);

Λάβετε υπόψη ότι οι συναρτήσεις που συνδέονται με φίλτρα μπορούν να αλλάξουν μόνο το πρώτο όρισμα που μεταβιβάστηκε στο φίλτρο. Δηλαδή, η παραπάνω συνάρτηση μπορεί να αλλάξει μόνο το όρισμα $allow, αλλά όχι το $user_id.

Για να επιτρέπεται στις συναρτήσεις να τροποποιούν περισσότερα από ένα ορίσματα που έχουν περάσει, τα φίλτρα (και τα συμβάντα) μπορούν να επωφεληθούν από τη μετάβαση μεταβλητών και αντικειμένων με αναφορά στην PHP, όπως το συμβάν pre_get_posts.

OOP, κλάσεις, αντικείμενα και ανώνυμες συναρτήσεις

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

Κλάση My_Class ( συνάρτηση __construct() ( add_filter("the_content", array($this, "filter_content")); ) συνάρτηση filter_content($content) ( // ... return $content; ) ) new My_Class();

Με παρόμοιο τρόπο, μπορείτε να περάσετε μια μέθοδο στατικής κλάσης:

Add_filter("the_content", array("My_Class", "filter_content")); add_filter("the_content", "My_Class::filter_content"); // PHP >= 5.2.3

Τα φίλτρα και τα συμβάντα υποστηρίζουν επίσης ανώνυμες λειτουργίες, για παράδειγμα:

Add_filter("the_content", create_function("$content", "return $content;")); add_filter("the_content", function($content) ( return $content; )); // PHP >= 5.3

Δεν συνιστούμε τη χρήση ανώνυμων συναρτήσεων με φίλτρα και συμβάντα στο WordPress, καθώς είναι δύσκολο να εντοπιστούν σφάλματα (για παράδειγμα, χρησιμοποιώντας μια προσθήκη) και η συνάρτηση create_function() δεν αποθηκεύεται προσωρινά σε επίπεδο bytecode, για παράδειγμα στο APC.

συμπέρασμα

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

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

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

Αυτό το άρθρο περιγράφει λεπτομερώς τη χρήση της μεταβλητής PHP _SELF.

Τι είναι η μεταβλητή PHP _SELF;

Η μεταβλητή PHP _SELF επιστρέφει το όνομα και τη διαδρομή του τρέχοντος αρχείου (σε σχέση με τη ρίζα του εγγράφου). Μπορείτε να χρησιμοποιήσετε αυτήν τη μεταβλητή στο χαρακτηριστικό action της φόρμας. Υπάρχουν επίσης ορισμένες αποχρώσεις που πρέπει να γνωρίζετε. Φυσικά, δεν μπορούμε να αγνοήσουμε αυτές τις αποχρώσεις.

Ας δούμε μερικά παραδείγματα.

Echo $_SERVER["PHP_SELF"];

1) Ας υποθέσουμε ότι το αρχείο php βρίσκεται στην ακόλουθη διεύθυνση:

Http://www.yourserver.com/form-action.php

Σε αυτήν την περίπτωση, η μεταβλητή PHP _SELF θα περιέχει:

"/form-action.php"

2) Ας υποθέσουμε ότι το αρχείο php βρίσκεται σε αυτή τη διεύθυνση:

Http://www.yourserver.com/dir1/form-action.php

Το PHP_SELF θα είναι:

"/dir1/form-action.php"

PHP _SELF στο χαρακτηριστικό action της φόρμας. Γιατί χρειαζόταν εκεί;

Συνήθως η μεταβλητή PHP _SELF χρησιμοποιείται στο χαρακτηριστικό action της ετικέτας φόρμας. Το χαρακτηριστικό action καθορίζει τη διεύθυνση στην οποία θα σταλούν τα περιεχόμενα της φόρμας μετά την επιβεβαίωση (ο χρήστης κάνει κλικ στο κουμπί με type="submit"). Κατά κανόνα, αυτή είναι η ίδια σελίδα από την οποία έφυγε η φόρμα.

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

Η μεταβλητή PHP _SELF θα σας γλιτώσει από περιττές διορθώσεις, αφού η διεύθυνση της σελίδας θα δημιουργηθεί αυτόματα με βάση το όνομα του αρχείου.

Ας υποθέσουμε ότι έχετε ένα αρχείο φόρμας που ονομάζεται form-action.php και θέλετε η φόρμα να υποβληθεί στο ίδιο αρχείο μετά την επιβεβαίωση. Συνήθως γράφουν ως εξής:

Αλλά μπορείτε να χρησιμοποιήσετε τη μεταβλητή PHP _SELF αντί για το form-action.php. Σε αυτή την περίπτωση ο κώδικας θα μοιάζει με αυτό: