Blog

Architektúra WordPress Hookov: Vysvetlenie Akcií vs. Filtrov

Základ každého skvelého pluginu. Zistite, ako PAGEnza AI používa hooky a filtre na vytváranie udržiavateľného a škálovateľného kódu.

Každý WordPress plugin robí jednu z dvoch vecí: buď spustí kód v špecifickom momente (akcia), alebo upraví hodnotu pred jej použitím (filter). To je všetko. Celý ekosystém WordPress pluginov je postavený na tomto rozdiele.

Pochopenie rozdielu — a kedy ktorý použiť — oddeľuje pluginy, ktoré fungujú, od tých, ktoré spôsobujú problémy.

Akcie: urobte niečo v určitom čase

Hook akcie je signál, ktorý WordPress (alebo iný plugin) pošle v špecifickom momente. K tomuto signálu pripojíte funkciu a táto funkcia sa spustí, keď signál zaznie.

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 sa spustí, keď WordPress pripravuje načítanie zdrojov pre front-end. Pripojenie sa k nemu je správny spôsob načítania CSS a JS — nie vkladanie <script> tagov priamo do šablón.

Bežné akčné hooky, ktoré budete neustále používať:

  • init — spustí sa skoro, dobré na registráciu post typov a taxónomií
  • wp_enqueue_scripts — načítanie front-end zdrojov
  • admin_enqueue_scripts — načítanie admin zdrojov
  • save_post — spustí sa pri uložení príspevku, dobré na spracovanie vlastných polí
  • wp_ajax_{action} — spracovanie AJAX požiadaviek od overených používateľov
  • wp_ajax_nopriv_{action} — spracovanie AJAX požiadaviek od neprihlásených používateľov

Filtre: upravte hodnotu pred jej použitím

Hook filtra vám dá hodnotu, umožní vám ju upraviť a očakáva, že vrátime upravenú verziu. WordPress potom použije vašu upravenú hodnotu namiesto pôvodnej.

add_filter( 'the_content', 'my_plugin_append_cta' );

function my_plugin_append_cta( $content ) {
    if ( ! is_single() ) {
        return $content;
    }
    $cta = '<div class="post-cta">Ready to try PAGEnza? <a href="#">Get started free →</a></div>';
    return $content . $cta;
}

Kľúčové pravidlo: vždy niečo vráťte z filtra. Ak zabudnete na return, hodnota sa stane null a práve ste pokazili všetko, čo ju používalo.

Bežné filtrové hooky:

  • the_content — obsah príspevku pred zobrazením
  • the_title — názov príspevku
  • wp_nav_menu_items — HTML pre navigačné menu
  • upload_mimes — povolené typy nahrávaných súborov

Ako PAGEnza AI používa hooky

Keď Plugin Builder vygeneruje plugin, štruktúruje kód okolo triedy s metódami pripojenými k hookom v konštruktore. Tento vzor zabraňuje kolíziám názvov globálnych funkcií a udržuje kód organizovaný.

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();

Bezpečnostná kontrola špecificky overuje, či AJAX handlery obsahujú kontrolu nonce aj kontrolu oprávnení pred vykonaním čohokoľvek:

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 ] );
}

Chýbanie ktorejkoľvek z týchto kontrol je označené ako bezpečnostný problém a bráni vydaniu pluginu.

Priorita a front hookov

Keď je k rovnakému hooku pripojených viacero funkcií, spustia sa v poradí podľa priority (nižšie číslo = spustí sa skôr). Predvolená priorita je 10.

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

Toto je dôležité, keď váš plugin potrebuje bežať pred alebo po kóde iného pluginu. Ak upravujete niečo, čo upravuje aj iný plugin, priorita určuje, kto vyhrá.

Bežný vzor: ak prepisujete filter témy, použite prioritu 20 alebo vyššiu, aby ste sa uistili, že bežíte po kóde témy.

Odstránenie hookov

Môžete odstrániť hook, ktorý pridal niekto iný — vrátane hookov témy a pluginov:

remove_action( 'wp_head', 'wp_generator' );  // odstráni verziu WP z <head>
remove_filter( 'the_content', 'wpautop' );   // odstráni automatické zalamovanie odsekov

Háčik: hook môžete odstrániť iba vtedy, ak zavoláte remove_action/remove_filter potom, ako sa pôvodný add_action/add_filter spustil. To zvyčajne znamená pripojenie vášho odstránenia k neskoršej akcii.