Blog

WordPress Hook Arhitektura: Akcije vs Filteri Objašnjeno

Temelj svakog sjajnog dodatka. Naučite kako PAGEnza AI koristi hookove i filtere za kreiranje koda koji se lako održava i skalira.

Svaki WordPress dodatak radi jednu od dvije stvari: pokreće kod u određenom trenutku (akcija) ili modificira vrijednost prije nego što se koristi (filter). To je to. Cijeli ekosistem WordPress dodataka izgrađen je na ovoj razlici.

Razumijevanje razlike — i kada koristiti svaku — ono je što odvaja dodatke koji rade od dodataka koji uzrokuju probleme.

Akcije: uradite nešto u određenom trenutku

Hook akcije je signal koji WordPress (ili drugi dodatak) šalje u određenom trenutku. Priložite funkciju tom signalu, i vaša funkcija se pokreće kada se signal aktivira.

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 se pokreće kada WordPress priprema učitavanje resursa za prednji dio. Korištenje ovog hooka je ispravan način za učitavanje CSS-a i JS-a — ne ubacivanje <script> tagova direktno u predloške.

Uobičajeni hookovi akcija koje ćete stalno koristiti:

  • init — pokreće se rano, dobro za registraciju tipova postova i taksonomija
  • wp_enqueue_scripts — učitavanje resursa za prednji dio
  • admin_enqueue_scripts — učitavanje resursa za administraciju
  • save_post — pokreće se kada se post sačuva, dobro za obradu prilagođenih polja
  • wp_ajax_{action} — obrada AJAX zahtjeva od ovjerenih korisnika
  • wp_ajax_nopriv_{action} — obrada AJAX zahtjeva od korisnika koji nisu prijavljeni

Filteri: modificirajte vrijednost prije nego što se koristi

Hook filter vam daje vrijednost, omogućava vam da je modificirate i očekuje da vratite modificiranu verziju. WordPress zatim koristi vašu modificiranu vrijednost umjesto originalne.

add_filter( 'the_content', 'my_plugin_append_cta' );

function my_plugin_append_cta( $content ) {
    if ( ! is_single() ) {
        return $content;
    }
    $cta = '<div class="post-cta">Spremni isprobati PAGEnza? <a href="#">Počnite besplatno →</a></div>';
    return $content . $cta;
}

Ključno pravilo: uvijek nešto vratite iz filtera. Ako zaboravite return, vrijednost postaje null i upravo ste pokvarili sve što ju je koristilo.

Uobičajeni hookovi filtera:

  • the_content — sadržaj posta prije prikaza
  • the_title — naslov posta
  • wp_nav_menu_items — HTML navigacijskog menija
  • upload_mimes — dozvoljeni tipovi datoteka za učitavanje
  • plugin_action_links_{plugin-file} — linkovi prikazani na stranici liste dodataka

Kako PAGEnza AI koristi hookove

Kada Plugin Builder generiše dodatak, kod struktuira oko klase sa metodama koje su povezane na hookove u konstruktoru. Ovaj obrazac izbjegava sukobe naziva globalnih funkcija i održava kod organizovanim.

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 ) {
        // uvijek vratite
        return $content;
    }
}

new My_Plugin();

Sigurnosni skener posebno provjerava da li AJAX rukovaoci uključuju provjeru nonce-a i provjeru ovlaštenja prije bilo kakvih radnji:

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

public function handle_ajax() {
    // Sigurnost: provjerite nonce
    check_ajax_referer( 'my_nonce_action', 'nonce' );

    // Sigurnost: provjerite dozvole
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( 'Nedovoljne dozvole', 403 );
    }

    // Sada je sigurno za obradu
    $data = sanitize_text_field( $_POST['data'] ?? '' );
    wp_send_json_success( [ 'result' => $data ] );
}

Nedostatak bilo kojeg od ovoga označava se kao sigurnosni problem i blokira izdavanje dodatka.

Prioritet i red čekanja hookova

Kada su više funkcija povezane na isti hook, one se izvršavaju po redu prioriteta (niži broj = prvo se izvršava). Podrazumevani prioritet je 10.

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

Ovo je važno kada vaš dodatak treba da se izvrši prije ili poslije koda drugog dodatka. Ako modificirate nešto što drugi dodatak također modificira, prioritet kontroliše ko pobjeđuje.

Uobičajeni obrazac: ako prepisujete filter teme, koristite prioritet 20 ili veći kako biste bili sigurni da se izvršavate nakon koda teme.

Uklanjanje hookova

Možete ukloniti hook koji je neko drugi dodao — uključujući hookove teme i dodataka:

remove_action( 'wp_head', 'wp_generator' );  // uklanja verziju WP iz <head>
remove_filter( 'the_content', 'wpautop' );   // uklanja automatsko umotavanje u paragrafe

Caka: hook možete ukloniti samo ako pozovete remove_action/remove_filter nakon što se originalni add_action/add_filter izvršio. Ovo obično znači povezivanje vašeg uklanjanja na kasniju akciju.