Ιστολόγιο

Αρχιτεκτονική Γάντζων WordPress: Επεξήγηση Ενεργειών vs Φίλτρων

Το θεμέλιο κάθε σπουδαίου plugin. Μάθετε πώς το PAGEnza AI χρησιμοποιεί γάντζους και φίλτρα για να δημιουργήσει συντηρήσιμο, επεκτάσιμο κώδικα.

Κάθε plugin του WordPress κάνει ένα από τα δύο πράγματα: εκτελεί κώδικα σε μια συγκεκριμένη στιγμή (ενέργεια), ή τροποποιεί μια τιμή πριν χρησιμοποιηθεί (φίλτρο). Αυτό είναι όλο. Ολόκληρο το οικοσύστημα των plugins του WordPress βασίζεται σε αυτή τη διάκριση.

Η κατανόηση της διαφοράς — και πότε να χρησιμοποιήσετε το καθένα — είναι αυτό που διαχωρίζει τα plugins που λειτουργούν από τα plugins που προκαλούν προβλήματα.

Ενέργειες: κάντε κάτι σε μια χρονική στιγμή

Ένας γάντζος ενέργειας είναι ένα σήμα που στέλνει το WordPress (ή ένα άλλο plugin) σε μια συγκεκριμένη στιγμή. Συνδέετε μια συνάρτηση σε αυτό το σήμα, και η συνάρτησή σας εκτελείται όταν ενεργοποιείται το σήμα.

add_action( 'wp_enqueue_scripts', 'my_plugin_load_assets' );

function my_plugin_load_assets() {
    wp_enqueue_style( 'my-plugin', plugin_dir_url( __FILE__ ) . 'style.css' );
    wp_enqueue_script( 'my-plugin', plugin_dir_url( __FILE__ ) . 'script.js', ['jquery'], '1.0', true );
}

Το wp_enqueue_scripts ενεργοποιείται όταν το WordPress προετοιμάζεται να φορτώσει πόρους για το προσκήνιο. Η σύνδεση σε αυτό είναι ο σωστός τρόπος για να φορτώσετε CSS και JS — όχι η τοποθέτηση ετικετών <script> απευθείας στα πρότυπα.

Συνήθεις γάντζοι ενέργειας που θα χρησιμοποιείτε συνεχώς:

  • init — εκτελείται νωρίς, καλό για την καταχώρηση τύπων αντικειμένων και ταξινομήσεων

  • wp_enqueue_scripts — φόρτωση πόρων προσκηνίου

  • admin_enqueue_scripts — φόρτωση πόρων διαχειριστή

  • save_post — εκτελείται όταν αποθηκεύεται μια ανάρτηση, καλό για την επεξεργασία προσαρμοσμένων πεδίων

  • wp_ajax_{action} — χειρισμός αιτημάτων AJAX από πιστοποιημένους χρήστες

  • wp_ajax_nopriv_{action} — χειρισμός AJAX από μη συνδεδεμένους χρήστες

Φίλτρα: τροποποιήστε μια τιμή πριν χρησιμοποιηθεί

Ένας γάντζος φίλτρου σας δίνει μια τιμή, σας επιτρέπει να την τροποποιήσετε, και περιμένει να επιστρέψετε την τροποποιημένη έκδοση. Στη συνέχεια, το WordPress χρησιμοποιεί την τροποποιημένη τιμή σας αντί για την αρχική.

add_filter( 'the_content', 'my_plugin_append_cta' );

function my_plugin_append_cta( $content ) {
    if ( ! is_single() ) {
        return $content;
    }
    $cta = '<div class="post-cta">Έτοιμοι να δοκιμάσετε το PAGEnza; <a href="#">Ξεκινήστε δωρεάν →</a></div>';
    return $content . $cta;
}

Ο κρίσιμος κανόνας: πάντα να επιστρέφετε κάτι από ένα φίλτρο. Αν ξεχάσετε το return, η τιμή γίνεται null και μόλις σπάσατε ό,τι το χρησιμοποιούσε.

Συνήθεις γάντζοι φίλτρων:

  • the_content — το περιεχόμενο της ανάρτησης πριν την εμφάνιση
  • the_title — ο τίτλος της ανάρτησης
  • wp_nav_menu_items — HTML μενού πλοήγησης
  • upload_mimes — επιτρεπόμενοι τύποι μεταφόρτωσης αρχείων
  • plugin_action_links_{plugin-file} — σύνδεσμοι που εμφανίζονται στη σελίδα λίστας plugins

Πώς το PAGEnza AI χρησιμοποιεί γάντζους

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

class My_Plugin {
    public function __construct() {
        add_action( 'init', [ $this, 'register_post_type' ] );
        add_action( 'wp_enqueue_scripts', [ $this, 'load_assets' ] );
        add_filter( 'the_content', [ $this, 'append_content' ] );
    }

    public function register_post_type() { /* ... */ }
    public function load_assets() { /* ... */ }
    public function append_content( $content ) {
        // always return
        return $content;
    }
}

new My_Plugin();

Η σάρωση ασφαλείας ελέγχει ειδικά ότι οι χειριστές AJAX περιλαμβάνουν τόσο έναν έλεγχο nonce όσο και έναν έλεγχο δικαιωμάτων πριν κάνουν οτιδήποτε:

add_action( 'wp_ajax_my_action', [ $this, 'handle_ajax' ] );

public function handle_ajax() {
    // Security: verify nonce
    check_ajax_referer( 'my_nonce_action', 'nonce' );

    // Security: verify permissions
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( 'Insufficient permissions', 403 );
    }

    // Now safe to process
    $data = sanitize_text_field( $_POST['data'] ?? '' );
    wp_send_json_success( [ 'result' => $data ] );
}

Η παράλειψη ενός από αυτά επισημαίνεται ως πρόβλημα ασφαλείας και εμποδίζει την κυκλοφορία του plugin.

Προτεραιότητα και η ουρά γάντζων

Όταν πολλαπλές συναρτήσεις είναι συνδεδεμένες στον ίδιο γάντζο, εκτελούνται με βάση τη σειρά προτεραιότητας (μικρότερος αριθμός = εκτελείται πρώτος). Η προεπιλεγμένη προτεραιότητα είναι 10.

add_action( 'init', 'runs_first', 5 );
add_action( 'init', 'runs_second', 10 );   // default
add_action( 'init', 'runs_last', 20 );

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

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

Αφαίρεση γάντζων

Μπορείτε να αφαιρέσετε έναν γάντζο που πρόσθεσε κάποιος άλλος — συμπεριλαμβανομένων των γάντζων θέματος και plugin:

remove_action( 'wp_head', 'wp_generator' );  // αφαιρεί την έκδοση WP από το <head>
remove_filter( 'the_content', 'wpautop' );   // αφαιρεί την αυτόματη περιτύλιξη παραγράφων

Το πρόβλημα: μπορείτε να αφαιρέσετε έναν γάντζο μόνο αν καλέσετε remove_action/remove_filter αφού έχει εκτελεστεί ο αρχικός add_action/add_filter. Αυτό συνήθως σημαίνει τη σύνδεση της αφαίρεσής σας σε μια μεταγενέστερη ενέργεια.