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

Η έννοια των αγκιστριών, των ενεργειών και των φίλτρων είναι υπεύθυνη γι 'αυτό. που είναι η πραγματική καρδιά ολόκληρου του συστήματος plug-in WordPress.

Όλα ξεκινούν από τα "άγκιστρα" που παρέχει ο ίδιος ο πυρήνας.

Τι είναι ένα "άγκιστρο"; Είναι ένα ειδικά σημειωμένο μέρος στον κώδικα (οποιουδήποτε σεναρίου), όπου κάποιες σκόπιμα καταχωρημένες - "συνδεδεμένες σε" - λειτουργίες μπορούν να εκτελεστούν με τη σειρά που ορίζεται κατά την εγγραφή.

Το WordPress έχει δύο τύπους αγκιστριών που διαφέρουν ως προς τον σκοπό τους:

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

Ας δούμε τις λεπτομέρειες ...

Εργασία με ενέργειες

Η κοινή λογική των ενεργειών WordPress είναι πολύ απλή:

  1. Σημειώστε τον τόπο, όπου πρέπει να πάει ο προσαρμοσμένος κώδικας, με ένα "γάντζο" και τις παραμέτρους του
  2. Δημιουργήστε τη λειτουργία δράσης που εκτελεί τον νέο κώδικα χρησιμοποιώντας τις παραμέτρους (αν χρειαστεί) που παρέχονται από το άγκιστρο
  3. Καταχωρίστε την ενέργεια (# 2) που πρέπει να εκτελεστεί όταν το άγκιστρο (# 1) ενεργοποιηθεί με κάποια προτεραιότητα
  4. Όταν το WordPress φορτώνει την απαιτούμενη σελίδα και βρίσκει το άγκιστρο, θα ψάξει για όλες τις λειτουργίες που "συνδέονται με" και τις εκτελεί μία προς μία σύμφωνα με την προτεραιότητά τους

Για να εκτελέσουμε την εργασία # 1 έχουμε τη λειτουργία 'do_action':

do_action($tag, $arg_1, $arg_2, ... , $arg_n);

Αποδέχεται τις ακόλουθες παραμέτρους: $ tag - το "όνομα" γάντζου που βοηθά να αναγνωριστεί το συγκεκριμένο άγκιστρο και να το διακρίνει μεταξύ άλλων. $ arg_1, $ arg_2, ..., $ arg_n - τιμές για τις ενέργειες που δέχονται ως παραμέτρους. Θα μπορούσαν να υπάρχουν τόσα πολλά επιχειρήματα - από το μηδέν μέχρι οποιοδήποτε εύλογο ποσό.

Το ίδιο το WordPress έχει πολλά προκαθορισμένα άγκιστρα για χρήση:

do_action( 'init' );

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

do_action('save_post', $post_id, $post);

Σε αυτό το παράδειγμα ο αγκίσκος ενεργοποιείται όταν αποθηκεύεται η θέση και δίδονται δύο πρόσθετες παράμετροι για να λειτουργούν με - post_id και post αντικείμενο που περιέχουν όλα τα δεδομένα από την αποθηκευμένη θέση.

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

do_action( 'my_truly_custom_hook' );

Όταν βρήκαμε (ή δημιουργήσαμε) ένα σωστό άγκιστρο και δημιουργήσαμε μια προσαρμοσμένη συνάρτηση γι 'αυτό θα πρέπει να καταχωρήσουμε το τελευταίο για την εκτέλεση με το' add_action '.

add_action($tag, $function_to_add, $priority, $accepted_args_number);

Όπως θα μπορούσε να αναμένεται, η μέθοδος add_action δέχεται δύο υποχρεωτικές παραμέτρους: $ tag: το όνομα του κατάλληλου γάντζου και $ function_to_add: το όνομα της συνάρτησης που πρέπει να εκτελεστεί. Οι άλλες δύο παράμετροι είναι προαιρετικές: $ προτεραιότητα: ένας ακέραιος για να καθορίσετε την σειρά με την οποία εκτελούνται οι καταχωρημένες λειτουργίες (από προεπιλογή, 10), $ accepted_args_number: αριθμός επιχειρημάτων που η καταχωρημένη λειτουργία πρόκειται να δεχτεί (από προεπιλογή, 1) .

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

function msp_helloworld_footer_notice(){echo "
Hello, I'm your custom notice
";}add_action('wp_footer', 'msp_helloworld_footer_notice');

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

cnotice

Εργασία με φίλτρα

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

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

apply_filters($tag, $value_to_filter, $arg_1, $arg_2, ... , $arg_n);

Η συνάρτηση 'apply_filter' δημιουργεί ένα άγκιστρο φίλτρου με το όνομα της ετικέτας $ και την υποχρεωτική παράμετρο $ value_to_filter (θα μπορούσε να είναι άδειο, αλλά πρέπει να υπάρχει για την καλύτερη πρακτική). Άλλα επιχειρήματα είναι προαιρετικά και λειτουργούν με τον ίδιο τρόπο όπως για τις ενέργειες.

filter_function($value_to_filter, $arg_1, $arg_2, ... , $arg_n){//filtering code goes herereturn $value_to_filter; //value has to be returned back}

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

add_filter($tag, $function_to_add, $priority, $accepted_args);

Η συνάρτηση 'add_filter' καταχωρεί μια συνάρτηση με ένα όνομα που δίνεται ως το argument $ function_to_add για το άγκιστρο φίλτρου $ tag. Τα προαιρετικά επιχειρήματα - $ priority και $ accepted_args - λειτουργούν με τον ίδιο τρόπο όπως για τους γάντζους δράσης.

Ας επιδείξουμε ολόκληρη τη διαδικασία σε δράση: μια κοινή εργασία plugin είναι να προσθέσετε κάποιο περιεχόμενο στο τέλος μιας ανάρτησης. Αν κοιτάξουμε πιο κοντά στην ετικέτα πρότυπου 'the_content' ( queryposts.com/function/the_content ), που συνήθως χρησιμοποιείται για την εξαγωγή ενός περιεχομένου μιας θέσης σε ένα θέμα, θα διαπιστώσουμε ότι περιέχει το ακόλουθο άγκιστρο φίλτρου:

$content = apply_filters('the_content', $content);

Χρησιμοποιώντας αυτό το άγκιστρο μπορούμε εύκολα να προσθέσουμε κάτι στο τέλος της θέσης με τον ακόλουθο τρόπο:

function msp_helloworld_post_footer($content) {$content .= "";return $content;}  add_filter ('the_content', 'msp_helloworld_post_footer', 100). 

Σημειώστε ότι χρησιμοποιούμε αρκετά μεγάλο αριθμό για προτεραιότητα εδώ για να διασφαλίσουμε ότι όλα τα προεπιλεγμένα φίλτρα έχουν εφαρμοστεί πριν από το 'msp_helloworld_post_footer'. Αφού συμπεριλάβουμε τον κώδικα στο αρχείο του plugin θα δούμε το αποτέλεσμα στον ιστότοπο:

pfooter

Πώς να βρείτε γάντζους

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

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

Μετά από αυτό είστε έτοιμοι για το ταξίδι στον πηγαίο κώδικα. Μπορείτε να πραγματοποιήσετε μια αναζήτηση μέσω των αρχείων WordPress για τις λέξεις-κλειδιά 'do_action' και 'apply_filters' για να βρείτε το άγκιστρο που χρειάζεστε.

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

Τέλος, μπορείτε να ανατρέξετε στο WordPress Hooks Βάση δεδομένων που περιέχει πλήρεις πληροφορίες σχετικά με τα άγκιστρα στα αρχεία πυρήνα.

Προηγμένες λειτουργίες με γάντζους

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

Οι ενέργειες μπορούν να καταργηθούν με τον ακόλουθο τρόπο:

remove_action($tag, $function_to_remove, $priority, $accepted_args);remove_all_actions($tag, $priority);

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

Έχετε πιθανώς ακούσει για μια δημοφιλής σύσταση ασφάλειας για να κρύψετε την έκδοση WordPress από την ενότητα κεφαλής του ιστότοπου. Αυτή είναι μια δουλειά για το 'remove_action'.

Πρώτα απ 'όλα, ας βρούμε τον κώδικα που αγκαλιάζει τη λειτουργία' wp_generator 'για να εκτυπώσει τις πληροφορίες της έκδοσης με περιήγηση /wp-includes/default-filters.php . Ο κώδικας που κάνει αυτό φαίνεται ως εξής:

add_action('wp_head', 'wp_generator');

Για να εξαλείψουμε την επίδραση αυτού του κώδικα θα πρέπει κάπου στο plugin μας, να συμπεριλάβουμε την αντίθετη λειτουργία:

remove_action('wp_head', 'wp_generator');

Τα φίλτρα μπορούν να αφαιρεθούν με παρόμοιο τρόπο:

remove_filter($tag, $function_to_remove, $priority, $accepted_args);remove_all_filters($tag, $priority);

ο Plugin API παρέχει επίσης στους προγραμματιστές έναν τρόπο να ανιχνεύσουν εάν το συγκεκριμένο άγκιστρο έχει καταχωρίσει λειτουργίες για εκτέλεση:

has_action($tag, $function_to_check);has_filter($tag, $function_to_check);

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

if('hook_to_check_name' === current_filter()){//do stuff related to 'hook_to_check_name' hook}

Παρά το όνομα, το 'current_filter' λειτουργεί όχι μόνο με φίλτρα αλλά και με δράσεις. Για το πλήρες σύνολο των λειτουργιών API Plugin ανατρέξτε στο Κώδιξ .

Πραγματική περίπτωση

Ας σκάψουμε τον σκελετό plugin που ετοιμάσαμε το προηγούμενο μέρος της σειράς , και να αναπνεύσει κάποια ζωή σε αυτό.

Θα συμπληρώσουμε το αρχείο 'core.php' (το κεντρικό τμήμα της προσθήκης μας που προορίζεται για την αξιοποίηση των περισσότερων λειτουργιών) με τον κώδικα που επιλύει μια πραγματική εργασία με τη βοήθεια ενεργειών και φίλτρων.

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

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

/** Hook plugin's action and filters **/function msp_helloworld_init(){add_action('init', 'msp_helloworld_taxonomies');add_filter('the_content', 'msp_helloworld_author_block_filter');add_filter('post_class', 'msp_helloworld_post_class');}add_action('plugins_loaded', 'msp_helloworld_init');/** Register custom taxonomy **/function msp_helloworld_taxonomies(){$args = array('labels' => array('name'          => 'Guest authors','singular_name' => 'Guest author'),'show_in_nav_menus' => false);register_taxonomy('gauthor', array('post'), $args);}  / ** Δημιουργία σήμανσης πλαισίου συγγραφέα ** / λειτουργία msp_helloworld_author_block () {global $ post; $ author_terms = wp_get_object_terms ($ post-> ID, 'gauthor'); $ author_terms [0] -> όνομα), $ ur = esc_url (get_term_link ($ author_terms [0])), $ desc = wp_filter_post_kses ($ author_terms [0] 
"$ out. ="
Αυτή είναι μια θέση φιλοξενίας από {$name}
"$ out. ="
{$desc}
"} / ** Προσθήκη πλαισίου συγγραφέα στο τέλος της ανάρτησης ** / λειτουργία msp_helloworld_author_block_filter ($ content) {if (is_single () $ content. = msp_helloworld_author_block (); * Προσθήκη προσαρμοσμένης κλάσης CSS στο κοντέινερ της θέσης ** / function msp_helloworld_post_class ($ post_class) {global $ post; $ author_terms = wp_get_object_terms ($ post-> ID, 'gauthor'); {$post_class[] = 'gauthor';} επιστροφή $ post_class;}

Όπως μπορείτε να δείτε, δημιουργήσαμε μια ενέργεια για την καταχώρηση μιας προσαρμοσμένης ταξινόμησης και την εφαρμόσαμε στο άγκιστρο "init" - αυτή είναι μια συνιστώμενη πρακτική. Μετά από αυτό δημιουργήσαμε την ετικέτα πρότυπου που είναι υπεύθυνη για τη σήμανση του κουτιού συγγραφέα χρησιμοποιώντας τις φυσικές λειτουργίες του WordPress όπως 'wp_get_object_terms'. Στη συνέχεια, επισυνάψαμε αυτό το κουτί στο τέλος του περιεχομένου μετά τη δημοσίευση χρησιμοποιώντας το γάντζο φίλτρου "the_content". Και τελικά έχουμε προσθέσει την προσαρμοσμένη κλάση CSS για το κοντέινερ των επισκεπτών για την ευελιξία του στυλ στο θέμα. Μετά την εφαρμογή ορισμένων στυλ μπορούμε να δούμε το αποτέλεσμα:

gauthor

συμπέρασμα

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

Κάντε κλικ εδώ για να κατεβάσετε το εκτεταμένο παράδειγμα "Hello World" plugin για να το χρησιμοποιήσετε ως σκελετό για τη δική σας ανάπτυξη.

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

Προτεινόμενη εικόνα, Εικόνα ενότητας μέσω Shutterstock