Blog

WordPress Hook-Architektur: Aktionen vs. Filter erklärt

Das Fundament jedes großartigen Plugins. Erfahren Sie, wie PAGEnza AI Hooks und Filter verwendet, um wartbaren, skalierbaren Code zu erstellen.

Jedes WordPress-Plugin tut eines von zwei Dingen: Es führt Code zu einem bestimmten Zeitpunkt aus (Aktion) oder es modifiziert einen Wert, bevor er verwendet wird (Filter). Das ist alles. Das gesamte WordPress-Plugin-Ökosystem basiert auf dieser Unterscheidung.

Das Verständnis des Unterschieds – und wann man jeden einzelnen verwendet – trennt Plugins, die funktionieren, von Plugins, die Probleme verursachen.

Aktionen: Etwas zu einem bestimmten Zeitpunkt tun

Ein Aktions-Hook ist ein Signal, das WordPress (oder ein anderes Plugin) zu einem bestimmten Zeitpunkt sendet. Sie hängen eine Funktion an dieses Signal an, und Ihre Funktion wird ausgeführt, wenn das Signal ausgelöst wird.

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 wird ausgelöst, wenn WordPress die Assets für das Frontend lädt. Das Einhaken hier ist der richtige Weg, um CSS und JS zu laden – nicht das direkte Einfügen von <script>-Tags in Vorlagen.

Allgemeine Aktions-Hooks, die Sie ständig verwenden werden:

  • init — läuft früh, gut für die Registrierung von Post-Typen und Taxonomien
  • wp_enqueue_scripts — lädt Frontend-Assets
  • admin_enqueue_scripts — lädt Admin-Assets
  • save_post — wird beim Speichern eines Beitrags ausgeführt, gut für die Verarbeitung benutzerdefinierter Felder
  • wp_ajax_{action} — verarbeitet AJAX-Anfragen von authentifizierten Benutzern
  • wp_ajax_nopriv_{action} — verarbeitet AJAX von nicht angemeldeten Benutzern

Filter: Einen Wert modifizieren, bevor er verwendet wird

Ein Filter-Hook gibt Ihnen einen Wert, lässt Sie ihn modifizieren und erwartet, dass Sie die modifizierte Version zurückgeben. WordPress verwendet dann Ihren modifizierten Wert anstelle des Originals.

add_filter( 'the_content', 'my_plugin_append_cta' );

function my_plugin_append_cta( $content ) {
    if ( ! is_single() ) {
        return $content;
    }
    $cta = '<div class="post-cta">Bereit, PAGEnza auszuprobieren? <a href="#">Kostenlos starten →</a></div>';
    return $content . $cta;
}

Die entscheidende Regel: Geben Sie immer etwas von einem Filter zurück. Wenn Sie das return vergessen, wird der Wert null und Sie haben alles, was ihn verwendet hat, kaputt gemacht.

Allgemeine Filter-Hooks:

  • the_content — der Beitragstext vor der Anzeige
  • the_title — der Beitragstitel
  • wp_nav_menu_items — HTML für Navigationsmenüs
  • upload_mimes — erlaubte Dateiupload-Typen
  • plugin_action_links_{plugin-file} — Links, die auf der Plugin-Liste angezeigt werden

Wie PAGEnza AI Hooks verwendet

Wenn der Plugin Builder ein Plugin generiert, strukturiert er den Code um eine Klasse mit Methoden, die im Konstruktor an Hooks angehängt sind. Dieses Muster vermeidet Kollisionen bei globalen Funktionsnamen und hält den Code organisiert.

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 ) {
        // immer zurückgeben
        return $content;
    }
}

new My_Plugin();

Der Sicherheits-Scan prüft speziell, ob AJAX-Handler sowohl eine Nonce-Prüfung als auch eine Berechtigungsprüfung enthalten, bevor sie etwas tun:

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

public function handle_ajax() {
    // Sicherheit: Nonce überprüfen
    check_ajax_referer( 'my_nonce_action', 'nonce' );

    // Sicherheit: Berechtigungen überprüfen
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( 'Unzureichende Berechtigungen', 403 );
    }

    // Jetzt sicher zu verarbeiten
    $data = sanitize_text_field( $_POST['data'] ?? '' );
    wp_send_json_success( [ 'result' => $data ] );
}

Das Fehlen einer dieser Prüfungen wird als Sicherheitsproblem markiert und verhindert die Veröffentlichung des Plugins.

Priorität und die Hook-Warteschlange

Wenn mehrere Funktionen an denselben Hook angehängt sind, werden sie in der Reihenfolge der Priorität ausgeführt (niedrigere Zahl = zuerst ausgeführt). Die Standardpriorität ist 10.

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

Dies ist wichtig, wenn Ihr Plugin vor oder nach dem Code eines anderen Plugins ausgeführt werden muss. Wenn Sie etwas modifizieren, das ein anderes Plugin ebenfalls modifiziert, steuert die Priorität, wer gewinnt.

Ein gängiges Muster: Wenn Sie einen Filter eines Themes überschreiben, verwenden Sie die Priorität 20 oder höher, um sicherzustellen, dass Sie nach dem Code des Themes ausgeführt werden.

Hooks entfernen

Sie können einen Hook entfernen, den jemand anderes hinzugefügt hat – einschließlich Theme- und Plugin-Hooks:

remove_action( 'wp_head', 'wp_generator' );  // entfernt die WP-Version aus der <head>
remove_filter( 'the_content', 'wpautop' );   // entfernt die automatische Absatzformatierung

Der Haken: Sie können einen Hook nur entfernen, wenn Sie remove_action/remove_filter aufrufen, nachdem der ursprüngliche add_action/add_filter ausgeführt wurde. Dies bedeutet normalerweise, dass Sie Ihre Entfernung in eine spätere Aktion einhaken.