Blogi

WordPress Hook -arkkitehtuuri: Toiminnot vs. Suodattimet selitettynä

Jokaisen loistavan lisäosan perusta. Opi, kuinka PAGEnza AI käyttää koukkuja ja suodattimia ylläpidettävän, skaalautuvan koodin luomiseen.

Jokainen WordPress-lisäosa tekee yhden kahdesta asiasta: se suorittaa koodia tiettynä hetkenä (toiminto) tai se muokkaa arvoa ennen sen käyttöä (suodatin). Siinä kaikki. Koko WordPress-lisäosaekosysteemi perustuu tähän eroon.

Eron ymmärtäminen – ja milloin kumpaakin käytetään – erottaa lisäosat, jotka toimivat, lisäosista, jotka aiheuttavat ongelmia.

Toiminnot: tee jotain tiettynä hetkenä

Toimintokoukku on signaali, jonka WordPress (tai toinen lisäosa) lähettää tiettynä hetkenä. Liität funktion siihen signaaliin, ja funktiosi suoritetaan, kun signaali laukeaa.

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 laukeaa, kun WordPress valmistautuu lataamaan resursseja etusivulle. Sen käyttäminen on oikea tapa ladata CSS ja JS – ei pudottaa <script>-tageja suoraan malleihin.

Yleisiä toimintokoukkuja, joita käytät jatkuvasti:

  • init — suoritetaan aikaisin, hyvä postaus tyyppien ja taksonomioiden rekisteröintiin
  • wp_enqueue_scripts — lataa etusivun resurssit
  • admin_enqueue_scripts — lataa ylläpidon resurssit
  • save_post — suoritetaan, kun postaus tallennetaan, hyvä mukautettujen kenttien käsittelyyn
  • wp_ajax_{action} — käsittelee AJAX-pyyntöjä todennetuilta käyttäjiltä
  • wp_ajax_nopriv_{action} — käsittelee AJAX-pyyntöjä kirjautumattomilta käyttäjiltä

Suodattimet: muokkaa arvoa ennen sen käyttöä

Suodatinkoukku antaa sinulle arvon, antaa sinun muokata sitä ja odottaa sinun palauttavan muokatun version. WordPress käyttää sitten muokattua arvoasi alkuperäisen sijaan.

add_filter( 'the_content', 'my_plugin_append_cta' );

function my_plugin_append_cta( $content ) {
    if ( ! is_single() ) {
        return $content;
    }
    $cta = '<div class="post-cta">Valmis kokeilemaan PAGEnzaa? <a href="#">Aloita ilmaiseksi →</a></div>';
    return $content . $cta;
}

Tärkeä sääntö: palauta aina jotain suodattimesta. Jos unohdat return-lauseen, arvo muuttuu nulliksi ja olet juuri rikkonut kaiken, mikä sitä käytti.

Yleisiä suodatinkoukkuja:

  • the_content — postauksen sisältö ennen näyttöä
  • the_title — postauksen otsikko
  • wp_nav_menu_items — navigointivalikon HTML
  • upload_mimes — sallitut tiedostojen lataustyypit
  • plugin_action_links_{plugin-file} — linkit, jotka näkyvät lisäosaluettelosivulla

Kuinka PAGEnza AI käyttää koukkuja

Kun Plugin Builder luo lisäosan, se jäsentää koodin luokan ympärille, jonka metodit on liitetty koukkuihin konstruktorissa. Tämä malli välttää globaalien funktioiden nimien törmäykset ja pitää koodin järjestyksessä.

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

new My_Plugin();

Turvallisuustarkistus tarkistaa erityisesti, että AJAX-käsittelijät sisältävät sekä nonce-tarkistuksen että käyttöoikeustarkistuksen ennen minkään tekemistä:

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

public function handle_ajax() {
    // Turvallisuus: tarkista nonce
    check_ajax_referer( 'my_nonce_action', 'nonce' );

    // Turvallisuus: tarkista käyttöoikeudet
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( 'Riittämättömät käyttöoikeudet', 403 );
    }

    // Nyt turvallista käsitellä
    $data = sanitize_text_field( $_POST['data'] ?? '' );
    wp_send_json_success( [ 'result' => $data ] );
}

Kummankin puuttuminen merkitään turvallisuusongelmaksi ja estää lisäosan julkaisun.

Prioriteetti ja koukkujono

Kun useita funktioita on liitetty samaan koukkuun, ne suoritetaan prioriteetin mukaan (pienempi numero = suoritetaan ensin). Oletusprioriteetti on 10.

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

Tämä on tärkeää, kun lisäosasi tarvitsee suorittua ennen toisen lisäosan koodia tai sen jälkeen. Jos muokkaat jotain, mitä toinen lisäosa myös muokkaa, prioriteetti määrää, kuka voittaa.

Yleinen malli: jos ohitat teeman suodattimen, käytä prioriteettia 20 tai korkeampaa varmistaaksesi, että suoritus tapahtuu teeman koodin jälkeen.

Koukkujen poistaminen

Voit poistaa jonkun muun lisäämän koukun – mukaan lukien teeman ja lisäosien koukut:

remove_action( 'wp_head', 'wp_generator' );  // poistaa WP-version <head>-osiosta
remove_filter( 'the_content', 'wpautop' );   // poistaa automaattisen kappaleen rivityksen

Haaste: voit poistaa koukun vain, jos kutsut remove_action/remove_filter sen jälkeen, kun alkuperäinen add_action/add_filter on suoritettu. Tämä tarkoittaa yleensä koukun liittämistä myöhäisempään toimintoon.