Blog

Architektura WordPress Hooků: Vysvětlení akcí vs. filtrů

Základ každého skvělého pluginu. Zjistěte, jak PAGEnza AI používá hooky a filtry k vytváření udržitelného, škálovatelného kódu.

Každý plugin pro WordPress dělá jednu ze dvou věcí: spouští kód ve specifický okamžik (akce) nebo upravuje hodnotu před jejím použitím (filtr). To je vše. Celý ekosystém pluginů pro WordPress je postaven na tomto rozlišení.

Pochopení rozdílu — a kdy který použít — odděluje pluginy, které fungují, od těch, které způsobují problémy.

Akce: něco udělejte v daný okamžik

Akční hook je signál, který WordPress (nebo jiný plugin) vysílá ve specifický okamžik. K tomuto signálu připojíte funkci a vaše funkce se spustí, když signál zazvoní.

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 spustí, když WordPress připravuje načtení prostředků pro front-end. Připojení k němu je správný způsob, jak načíst CSS a JS — nikoli vkládání <script> tagů přímo do šablon.

Běžné akční hooky, které budete neustále používat:

  • init — spustí se brzy, dobré pro registraci typů příspěvků a taxonomií
  • wp_enqueue_scripts — načtení prostředků front-endu
  • admin_enqueue_scripts — načtení prostředků administrace
  • save_post — spustí se při uložení příspěvku, dobré pro zpracování vlastních polí
  • wp_ajax_{action} — zpracování AJAX požadavků od ověřených uživatelů
  • wp_ajax_nopriv_{action} — zpracování AJAX požadavků od nepřihlášených uživatelů

Filtry: upravte hodnotu před jejím použitím

Filtrovací hook vám dá hodnotu, umožní vám ji upravit a očekává, že vrátíte upravenou verzi. WordPress pak použije vaši upravenou hodnotu místo původní.

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

Kritické pravidlo: vždy něco vraťte z filtru. Pokud zapomenete return, hodnota se stane null a právě jste rozbili cokoli, co ji používalo.

Běžné filtrovací hooky:

  • the_content — obsah příspěvku před zobrazením
  • the_title — název příspěvku
  • wp_nav_menu_items — HTML menu navigace
  • upload_mimes — povolené typy nahrávaných souborů
  • plugin_action_links_{plugin-file} — odkazy zobrazené na stránce seznamu pluginů

Jak PAGEnza AI používá hooky

Když Plugin Builder vygeneruje plugin, strukturuje kód kolem třídy s metodami připojenými k hookům v konstruktoru. Tento vzor zabraňuje kolizím názvů globálních funkcí 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í sken specificky kontroluje, zda obslužné rutiny AJAX obsahují kontrolu nonce i kontrolu oprávnění před provedením čehokoli:

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

Chybějící jedna z těchto kontrol je označena jako bezpečnostní problém a blokuje vydání pluginu.

Priorita a fronta hooků

Když je k jednomu hooku připojeno více funkcí, spouštějí se v pořadí priority (nižší číslo = spustí se první). Výchozí priorita je 10.

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

To je důležité, když váš plugin potřebuje běžet před nebo po kódu jiného pluginu. Pokud upravujete něco, co upravuje i jiný plugin, priorita určuje, kdo vyhraje.

Běžný vzor: pokud přepisujete filtr šablony, použijte prioritu 20 nebo vyšší, abyste se ujistili, že se spustíte po kódu šablony.

Odstranění hooků

Můžete odstranit hook, který přidal někdo jiný — včetně hooků šablon a pluginů:

remove_action( 'wp_head', 'wp_generator' );  // odstraní verzi WP z <head>
remove_filter( 'the_content', 'wpautop' );   // odstraní automatické zalamování odstavců

Háček: hook můžete odstranit pouze v případě, že zavoláte remove_action/remove_filter poté, co se původní add_action/add_filter spustil. To obvykle znamená připojení vašeho odstranění k pozdější akci.