Blog

Arhitektura WordPress kljuke: Akcije proti filtrom, pojasnjeno

Temelj vsakega odličnega vtičnika. Naučite se, kako PAGEnza AI uporablja kljuke in filtre za ustvarjanje vzdržljive, razširljive kode.

Vsak vtičnik za WordPress naredi eno od dveh stvari: izvede kodo ob določenem času (akcija) ali modificira vrednost, preden se uporabi (filter). To je vse. Celoten ekosistem vtičnikov za WordPress je zgrajen na tej razliki.

Razumevanje razlike — in kdaj uporabiti vsako — je tisto, kar loči vtičnike, ki delujejo, od vtičnikov, ki povzročajo težave.

Akcije: naredi nekaj ob določenem času

Kljuka akcije je signal, ki ga WordPress (ali drug vtičnik) pošlje ob določenem času. Na ta signal pripnete funkcijo, vaša funkcija pa se izvede, ko signal sproži.

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 se sproži, ko se WordPress pripravlja naložiti sredstva za sprednji del. Pripetje nanj je pravilen način nalaganja CSS in JS — ne vstavljanje oznak <script> neposredno v predloge.

Pogoste kljuke akcij, ki jih boste nenehno uporabljali:

  • init — se izvede zgodaj, dobro za registracijo vrst objav in taksonomij
  • wp_enqueue_scripts — nalaganje sredstev za sprednji del
  • admin_enqueue_scripts — nalaganje sredstev za skrbniški vmesnik
  • save_post — se izvede ob shranjevanju objave, dobro za obdelavo polj po meri
  • wp_ajax_{action} — obravnavanje AJAX zahtevkov avtenticiranih uporabnikov
  • wp_ajax_nopriv_{action} — obravnavanje AJAX zahtevkov neprijavljenih uporabnikov

Filtri: modificiraj vrednost, preden se uporabi

Kljuka filtra vam da vrednost, vam omogoči, da jo modificirate, in od vas pričakuje, da vrnete modificirano različico. WordPress nato uporabi vašo modificirano vrednost namesto izvirne.

add_filter( 'the_content', 'my_plugin_append_cta' );

function my_plugin_append_cta( $content ) {
    if ( ! is_single() ) {
        return $content;
    }
    $cta = '<div class="post-cta">Ste pripravljeni preizkusiti PAGEnza? <a href="#">Začnite brezplačno →</a></div>';
    return $content . $cta;
}

Ključno pravilo: vedno nekaj vrnite iz filtra. Če pozabite return, vrednost postane null in preprosto ste pokvarili vse, kar jo je uporabljalo.

Pogoste kljuke filtrov:

  • the_content — vsebina objave pred prikazom
  • the_title — naslov objave
  • wp_nav_menu_items — HTML menija za navigacijo
  • upload_mimes — dovoljeni tipi nalaganj datotek
  • plugin_action_links_{plugin-file} — povezave, prikazane na strani seznama vtičnikov

Kako PAGEnza AI uporablja kljuke

Ko graditelj vtičnikov ustvari vtičnik, kodno strukturo postavi okoli razreda z metodami, pripetimi na kljuke v konstruktorju. Ta vzorec se izogne kolizijam imen globalnih funkcij in ohranja kodo organizirano.

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

new My_Plugin();

Varnostni pregled posebej preverja, ali obravnavala AJAX vključujejo preverjanje nonce in preverjanje zmožnosti, preden naredijo karkoli:

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

public function handle_ajax() {
    // Varnost: preveri nonce
    check_ajax_referer( 'my_nonce_action', 'nonce' );

    // Varnost: preveri dovoljenja
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( 'Nezadostna dovoljenja', 403 );
    }

    // Zdaj je varno za obdelavo
    $data = sanitize_text_field( $_POST['data'] ?? '' );
    wp_send_json_success( [ 'result' => $data ] );
}

Manjkanje katerega koli od teh je označeno kot varnostna težava in preprečuje izdajo vtičnika.

Prednost in čakalna vrsta kljuk

Ko je več funkcij pripetih na isto kljuko, se izvedejo po vrstnem redu prednosti (nižje število = izvede se najprej). Privzeta prednost je 10.

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

To je pomembno, ko mora vaš vtičnik delovati pred ali po kodi drugega vtičnika. Če modificirate nekaj, kar modificira tudi drug vtičnik, prednost določa, kdo zmaga.

Običajen vzorec: če prepišete filter teme, uporabite prednost 20 ali višjo, da zagotovite, da se izvede po kodi teme.

Odstranjevanje kljuk

Lahko odstranite kljuko, ki jo je dodal nekdo drug — vključno s kljukami teme in vtičnikov:

remove_action( 'wp_head', 'wp_generator' );  // odstrani verzijo WP iz <head>
remove_filter( 'the_content', 'wpautop' );   // odstrani samodejno zlaganje odstavkov

Ulov: kljuko lahko odstranite le, če pokličete remove_action/remove_filter po tem, ko se je prvotni add_action/add_filter že izvedel. To običajno pomeni, da morate odstranitev pripeti na poznejšo akcijo.