Blogg
WordPress Hook-arkitektur: Handlinger vs. Filtre Forklart
Grunnlaget for ethvert flott plugin. Lær hvordan PAGEnza AI bruker kroker og filtre for å lage vedlikeholdbar, skalerbar kode.
Hvert WordPress-plugin gjør én av to ting: det kjører kode på et bestemt tidspunkt (handling), eller det endrer en verdi før den brukes (filter). Det er alt. Hele WordPress-plugin-økosystemet er bygget på denne skillet.
Å forstå forskjellen — og når man skal bruke hver — er det som skiller plugins som fungerer fra plugins som forårsaker problemer.
Handlinger: Gjør noe på et gitt tidspunkt
En handlingskrok (action hook) er et signal som WordPress (eller et annet plugin) sender på et bestemt tidspunkt. Du knytter en funksjon til det signalet, og funksjonen din kjører når signalet utlø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 utløses når WordPress forbereder seg på å laste ressurser for front-end. Å koble seg til det er den riktige måten å laste CSS og JS på — ikke å slippe <script>-tagger direkte inn i maler.
Vanlige handlingskroker du vil bruke konstant:
init— kjører tidlig, bra for å registrere posttyper og taksonomierwp_enqueue_scripts— last front-end-ressurseradmin_enqueue_scripts— last admin-ressursersave_post— kjører når et innlegg lagres, bra for å behandle egendefinerte feltwp_ajax_{action}— håndter AJAX-forespørsler fra autentiserte brukerewp_ajax_nopriv_{action}— håndter AJAX fra ikke-innloggede brukere
Filtre: Endre en verdi før den brukes
En filterkrok gir deg en verdi, lar deg endre den, og forventer at du returnerer den endrede versjonen. WordPress bruker deretter din endrede verdi 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 å prøve PAGEnza? <a href="#">Kom i gang gratis →</a></div>';
return $content . $cta;
}
Den kritiske regelen: returner alltid noe fra et filter. Hvis du glemmer return, blir verdien null, og du har nettopp ødelagt det som brukte den.
Vanlige filterkroker:
the_content— innleggsinnholdet før visningthe_title— innleggstittelenwp_nav_menu_items— navigasjonsmeny HTMLupload_mimes— tillatte filopplastingstyperplugin_action_links_{plugin-file}— lenker vist på plugin-listesiden
Hvordan PAGEnza AI bruker kroker
Når Plugin Builder genererer et plugin, strukturerer den koden rundt en klasse med metoder knyttet til kroker i konstruktøren. Dette mønsteret unngår kollisjoner med globale funksjonsnavn og holder koden organisert.
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 alltid
return $content;
}
}
new My_Plugin();
Sikkerhetsskanningen sjekker spesifikt at AJAX-håndterere inkluderer både en nonce-sjekk og en kapabilitetssjekk før de gjør noe:
add_action( 'wp_ajax_my_action', [ $this, 'handle_ajax' ] );
public function handle_ajax() {
// Sikkerhet: verifiser nonce
check_ajax_referer( 'my_nonce_action', 'nonce' );
// Sikkerhet: verifiser tillatelser
if ( ! current_user_can( 'manage_options' ) ) {
wp_send_json_error( 'Utilstrekkelige tillatelser', 403 );
}
// Nå trygt å behandle
$data = sanitize_text_field( $_POST['data'] ?? '' );
wp_send_json_success( [ 'result' => $data ] );
}
Mangler en av disse blir flagget som et sikkerhetsproblem og blokkerer pluginet fra å bli utgitt.
Prioritet og krok-køen
Når flere funksjoner er knyttet til samme krok, kjører de i rekkefølge etter prioritet (lavere tall = kjører først). Standard prioritet er 10.
add_action( 'init', 'runs_first', 5 );
add_action( 'init', 'runs_second', 10 ); // standard
add_action( 'init', 'runs_last', 20 );
Dette betyr noe når pluginet ditt trenger å kjøre før eller etter koden til et annet plugin. Hvis du endrer noe som et annet plugin også endrer, kontrollerer prioritet hvem som vinner.
Et vanlig mønster: Hvis du overstyrer et temaets filter, bruk prioritet 20 eller høyere for å sikre at du kjører etter temaets kode.
Fjerning av kroker
Du kan fjerne en krok som noen andre har lagt til — inkludert tema- og plugin-kroker:
remove_action( 'wp_head', 'wp_generator' ); // fjerner WP-versjon fra <head>
remove_filter( 'the_content', 'wpautop' ); // fjerner automatisk avsnittsinnpakning
Fangsten: Du kan bare fjerne en krok hvis du kaller remove_action/remove_filter etter at den originale add_action/add_filter har kjørt. Dette betyr vanligvis å koble fjerningen din til en senere handling.