Blogg

WordPress Hook-arkitektur: Åtgärder vs. Filter Förklarat

Grunden för varje bra plugin. Lär dig hur PAGEnza AI använder krokar och filter för att skapa underhållbar, skalbar kod.

Varje WordPress-plugin gör en av två saker: den kör kod vid en specifik tidpunkt (åtgärd) eller den modifierar ett värde innan det används (filter). Det är allt. Hela WordPress-plugin-ekosystemet bygger på denna distinktion.

Att förstå skillnaden – och när man ska använda var och en – är det som skiljer plugins som fungerar från plugins som orsakar problem.

Åtgärder: gör något vid en tidpunkt

En åtgärdskrok (action hook) är en signal som WordPress (eller ett annat plugin) skickar vid en specifik tidpunkt. Du kopplar en funktion till den signalen, och din funktion körs när signalen avfyras.

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 avfyras när WordPress förbereder sig för att ladda tillgångar för front-end. Att haka fast vid den är det korrekta sättet att ladda CSS och JS – inte att släppa <script>-taggar direkt i mallar.

Vanliga åtgärdskrokar du kommer att använda ständigt:

  • init – körs tidigt, bra för att registrera inläggstyper och taxonomier
  • wp_enqueue_scripts – ladda tillgångar för front-end
  • admin_enqueue_scripts – ladda tillgångar för admin
  • save_post – körs när ett inlägg sparas, bra för att bearbeta anpassade fält
  • wp_ajax_{action} – hantera AJAX-förfrågningar från autentiserade användare
  • wp_ajax_nopriv_{action} – hantera AJAX från inloggade användare

Filter: modifiera ett värde innan det används

En filterkrok (filter hook) ger dig ett värde, låter dig modifiera det och förväntar sig att du returnerar den modifierade versionen. WordPress använder sedan ditt modifierade värde istället för originalet.

add_filter( 'the_content', 'my_plugin_append_cta' );

function my_plugin_append_cta( $content ) {
    if ( ! is_single() ) {
        return $content;
    }
    $cta = '<div class="post-cta">Redo att prova PAGEnza? <a href="#">Kom igång gratis →</a></div>';
    return $content . $cta;
}

Den kritiska regeln: returnera alltid något från ett filter. Om du glömmer return blir värdet null och du har precis brutit vad som än använde det.

Vanliga filterkrokar:

  • the_content – inläggets innehåll före visning
  • the_title – inläggets titel
  • wp_nav_menu_items – HTML för navigeringsmenyn
  • upload_mimes – tillåtna filuppladdningstyper
  • plugin_action_links_{plugin-file} – länkar som visas på sidan för pluginlistan

Hur PAGEnza AI använder krokar

När Plugin Builder genererar ett plugin strukturerar den koden kring en klass med metoder kopplade till krokar i konstruktorn. Detta mönster undviker kollisioner med globala funktionsnamn och håller koden organiserad.

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

new My_Plugin();

Säkerhetsskanningen kontrollerar specifikt att AJAX-hanterare inkluderar både en nonce-kontroll och en behörighetskontroll innan de gör något:

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

public function handle_ajax() {
    // Säkerhet: verifiera nonce
    check_ajax_referer( 'my_nonce_action', 'nonce' );

    // Säkerhet: verifiera behörigheter
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( 'Otillräckliga behörigheter', 403 );
    }

    // Nu säkert att bearbeta
    $data = sanitize_text_field( $_POST['data'] ?? '' );
    wp_send_json_success( [ 'result' => $data ] );
}

Att sakna någon av dessa flaggas som ett säkerhetsproblem och blockerar pluginet från att släppas.

Prioritet och krok-kön

När flera funktioner är kopplade till samma krok körs de i ordning efter prioritet (lägre nummer = körs först). Standardprioritet är 10.

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

Detta spelar roll när ditt plugin behöver köras före eller efter ett annat plugins kod. Om du modifierar något som ett annat plugin också modifierar, kontrollerar prioritet vem som vinner.

Ett vanligt mönster: om du åsidosätter ett temas filter, använd prioritet 20 eller högre för att säkerställa att du körs efter temats kod.

Ta bort krokar

Du kan ta bort en krok som någon annan har lagt till – inklusive tema- och plugin-krokar:

remove_action( 'wp_head', 'wp_generator' );  // tar bort WP-version från <head>
remove_filter( 'the_content', 'wpautop' );   // tar bort automatisk paragrafformatering

Fångsten: du kan bara ta bort en krok om du anropar remove_action/remove_filter efter att den ursprungliga add_action/add_filter har körts. Detta innebär vanligtvis att du kopplar bort din borttagning till en senare åtgärd.