Emuārs

WordPress Hook Architecture: Darbības pret filtriem skaidroti

Pamats katrai lieliskai spraudņa funkcijai. Uzziniet, kā PAGEnza AI izmanto āķus un filtrus, lai izveidotu uzturēšanai un mērogošanai piemērotu kodu.

Katrs WordPress spraudnis dara vienu no divām lietām: tas izpilda kodu noteiktā brīdī (darbība) vai modificē vērtību pirms tās izmantošanas (filtrs). Tas arī viss. Visa WordPress spraudņu ekosistēma ir balstīta uz šo atšķirību.

Izpratne par atšķirību — un kad ko izmantot — ir tas, kas atšķir spraudņus, kas darbojas, no spraudņiem, kas rada problēmas.

Darbības: kaut ko darīt noteiktā laikā

Darbības āķis ir signāls, ko WordPress (vai cits spraudnis) nosūta noteiktā brīdī. Jūs pievienojat funkciju šim signālam, un jūsu funkcija tiek izpildīta, kad signāls tiek aktivizēts.

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 tiek aktivizēts, kad WordPress gatavojas ielādēt resursus priekšgalam. Savienojoties ar to, ir pareizais veids, kā ielādēt CSS un JS — nevis ievietojot <script> tagus tieši veidnēs.

Izplatīti darbības āķi, ko pastāvīgi izmantosiet:

  • init — tiek izpildīts agri, labs tipu un taksonomiju reģistrēšanai
  • wp_enqueue_scripts — ielādēt priekšgala resursus
  • admin_enqueue_scripts — ielādēt administratora resursus
  • save_post — tiek izpildīts, kad ziņa tiek saglabāta, labs pielāgoto lauku apstrādei
  • wp_ajax_{action} — apstrādāt AJAX pieprasījumus no autentificētiem lietotājiem
  • wp_ajax_nopriv_{action} — apstrādāt AJAX pieprasījumus no nepieteiktiem lietotājiem

Filtri: modificēt vērtību pirms tās izmantošanas

Filtra āķis dod jums vērtību, ļauj to modificēt un sagaida, ka jūs atgriezīsiet modificēto versiju. Pēc tam WordPress izmanto jūsu modificēto vērtību oriģināla vietā.

add_filter( 'the_content', 'my_plugin_append_cta' );

function my_plugin_append_cta( $content ) {
    if ( ! is_single() ) {
        return $content;
    }
    $cta = '<div class="post-cta">Gatavs izmēģināt PAGEnza? <a href="#">Sākt bez maksas →</a></div>';
    return $content . $cta;
}

Kritiskais noteikums: vienmēr kaut ko atgrieziet no filtra. Ja aizmirsīsit return, vērtība kļūs null, un jūs būsiet sabojājuši visu, kas to izmantoja.

Izplatīti filtra āķi:

  • the_content — ziņas saturs pirms attēlošanas
  • the_title — ziņas virsraksts
  • wp_nav_menu_items — navigācijas izvēlnes HTML
  • upload_mimes — atļautie failu augšupielādes tipi
  • plugin_action_links_{plugin-file} — saites, kas parādītas spraudņu saraksta lapā

Kā PAGEnza AI izmanto āķus

Kad spraudņu veidotājs ģenerē spraudni, tas strukturē kodu ap klasi ar metodēm, kas pievienotas āķiem konstruktorā. Šis modelis novērš globālo funkciju nosaukumu sadursmes un uztur kodu organizētu.

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 ) {
        // vienmēr atgrieziet
        return $content;
    }
}

new My_Plugin();

Drošības skenēšana īpaši pārbauda, vai AJAX apdarinātāji pirms kaut kā darīšanas ietver gan nonce pārbaudi, gan atļauju pārbaudi:

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

public function handle_ajax() {
    // Drošība: pārbaudiet nonce
    check_ajax_referer( 'my_nonce_action', 'nonce' );

    // Drošība: pārbaudiet atļaujas
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( 'Nepietiekamas atļaujas', 403 );
    }

    // Tagad droši apstrādāt
    $data = sanitize_text_field( $_POST['data'] ?? '' );
    wp_send_json_success( [ 'result' => $data ] );
}

Šo abu trūkums tiek atzīmēts kā drošības problēma un bloķē spraudņa izlaišanu.

Prioritāte un āķu rinda

Kad vairākas funkcijas ir pievienotas tam pašam āķim, tās tiek izpildītas prioritātes secībā (zemāks skaitlis = darbojas vispirms). Noklusējuma prioritāte ir 10.

add_action( 'init', 'runs_first', 5 );
add_action( 'init', 'runs_second', 10 );   // noklusējums
add_action( 'init', 'runs_last', 20 );

Tas ir svarīgi, kad jūsu spraudnim ir jādarbojas pirms vai pēc cita spraudņa koda. Ja jūs modificējat kaut ko, ko modificē arī cits spraudnis, prioritāte nosaka, kurš uzvar.

Izplatīts modelis: ja jūs pārrakstāt tēmas filtru, izmantojiet prioritāti 20 vai augstāku, lai pārliecinātos, ka darbojaties pēc tēmas koda.

Āķu noņemšana

Jūs varat noņemt āķi, ko pievienojis kāds cits — ieskaitot tēmas un spraudņu āķus:

remove_action( 'wp_head', 'wp_generator' );  // noņem WP versiju no <head>
remove_filter( 'the_content', 'wpautop' );   // noņem automātisko rindkopu iesaiņošanu

Ierobežojums: jūs varat noņemt āķi tikai tad, ja izsaucat remove_action/remove_filter pēc tam, kad sākotnējais add_action/add_filter ir darbojies. Tas parasti nozīmē jūsu noņemšanas pievienošanu vēlākai darbībai.