Blog

WordPress Hook Arkitektur: Handlinger vs. Filtre Forklaret

Grundlaget for ethvert fantastisk plugin. Lær hvordan PAGEnza AI bruger hooks og filtre til at skabe vedligeholdelsesvenlig, skalerbar kode.

Ethvert WordPress-plugin gør en af to ting: det kører kode på et bestemt tidspunkt (handling), eller det modificerer en værdi, før den bruges (filter). Det er det hele. Hele WordPress-plugin-økosystemet er bygget på denne skelnen.

At forstå forskellen — og hvornår man skal bruge hver — er det, der adskiller plugins, der virker, fra plugins, der forårsager problemer.

Handlinger: Gør noget på et bestemt tidspunkt

En action hook er et signal, som WordPress (eller et andet plugin) sender på et bestemt tidspunkt. Du knytter en funktion til det signal, og din funktion kører, når signalet udløses.

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 udløses, når WordPress forbereder sig på at indlæse aktiver til front-end. At hooke ind i det er den korrekte måde at indlæse CSS og JS på — ikke at droppe <script>-tags direkte i skabeloner.

Almindelige action hooks, du vil bruge konstant:

  • init — kører tidligt, godt til at registrere posttyper og taksonomier
  • wp_enqueue_scripts — indlæs front-end aktiver
  • admin_enqueue_scripts — indlæs admin aktiver
  • save_post — kører, når et indlæg gemmes, godt til at behandle brugerdefinerede felter
  • wp_ajax_{action} — håndter AJAX-anmodninger fra godkendte brugere
  • wp_ajax_nopriv_{action} — håndter AJAX fra ikke-loggede brugere

Filtre: Modificer en værdi, før den bruges

En filter hook giver dig en værdi, lader dig modificere den og forventer, at du returnerer den modificerede version. WordPress bruger derefter din modificerede værdi i stedet for den originale.

add_filter( 'the_content', 'my_plugin_append_cta' );

function my_plugin_append_cta( $content ) {
    if ( ! is_single() ) {
        return $content;
    }
    $cta = '<div class="post-cta">Klar til at prøve PAGEnza? <a href="#">Kom i gang gratis →</a></div>';
    return $content . $cta;
}

Den kritiske regel: returner altid noget fra et filter. Hvis du glemmer return, bliver værdien null, og du har lige ødelagt, hvad end der brugte den.

Almindelige filter hooks:

  • the_content — indlæggets indhold før visning

  • the_title — indlæggets titel

  • wp_nav_menu_items — navigation menu HTML

  • upload_mimes — tilladte filuploadtyper

  • plugin_action_links_{plugin-file} — links vist på plugins-listen

Hvordan PAGEnza AI bruger hooks

Når Plugin Builder genererer et plugin, strukturerer den koden omkring en klasse med metoder knyttet til hooks i konstruktøren. Dette mønster undgår globale funktionsnavnekonflikter og holder koden organiseret.

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

new My_Plugin();

Sikkerhedsscanningen kontrollerer specifikt, at AJAX-håndteringsfunktioner inkluderer både en nonce-kontrol og en capability-kontrol, før de gør noget:

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

public function handle_ajax() {
    // Sikkerhed: verificer nonce
    check_ajax_referer( 'my_nonce_action', 'nonce' );

    // Sikkerhed: verificer tilladelser
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( 'Utilstrækkelige tilladelser', 403 );
    }

    // Nu sikkert at behandle
    $data = sanitize_text_field( $_POST['data'] ?? '' );
    wp_send_json_success( [ 'result' => $data ] );
}

Mangler en af disse, markeres det som et sikkerhedsproblem og blokerer frigivelsen af plugin'et.

Prioritet og hook-køen

Når flere funktioner er knyttet til den samme hook, kører de i rækkefølge efter prioritet (lavere tal = kører først). Standardprioritet er 10.

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

Dette betyder noget, når dit plugin skal køre før eller efter et andet plugins kode. Hvis du modificerer noget, som et andet plugin også modificerer, styrer prioritet, hvem der vinder.

Et almindeligt mønster: Hvis du overskriver et temas filter, skal du bruge prioritet 20 eller højere for at sikre, at du kører efter temaets kode.

Fjernelse af hooks

Du kan fjerne en hook, som en anden har tilføjet — inklusive tema- og plugin-hooks:

remove_action( 'wp_head', 'wp_generator' );  // fjerner WP-version fra <head>
remove_filter( 'the_content', 'wpautop' );   // fjerner automatisk indpakning af afsnit

Faldgruben: Du kan kun fjerne en hook, hvis du kalder remove_action/remove_filter, efter at den oprindelige add_action/add_filter er kørt. Dette betyder normalt at hooke din fjernelse ind i en senere handling.