Блог

WordPress Hook Архитектура: Акције против Филтера Објашњено

Основа сваког сјајног додатка. Сазнајте како PAGEnza AI користи куке и филтере за креирање одрживог, скалабилног кода.

Сваки WordPress додатак ради једну од две ствари: покреће код у одређеном тренутку (акција) или модификује вредност пре него што се користи (филтер). То је то. Цео екосистем WordPress додатака је изграђен на овој разлици.

Разумевање разлике — и када користити сваки — је оно што разликује додатке који раде од додатака који изазивају проблеме.

Акције: уради нешто у одређеном тренутку

Кука за акцију је сигнал који WordPress (или други додатак) шаље у одређеном тренутку. Прикачите функцију на тај сигнал, и ваша функција се покреће када се сигнал активира.

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 се активира када WordPress припрема учитавање ресурса за предњи део. Прикачивање на њега је исправан начин за учитавање CSS-а и JS-а — не уметање <script> тагова директно у шаблоне.

Уобичајене куке за акције које ћете стално користити:

  • init — покреће се рано, добро за регистрацију типова постова и таксономија
  • wp_enqueue_scripts — учитавање ресурса за предњи део
  • admin_enqueue_scripts — учитавање ресурса за администрацију
  • save_post — покреће се када се пост сачува, добро за обраду прилагођених поља
  • wp_ajax_{action} — руковање AJAX захтевима од аутентификованих корисника
  • wp_ajax_nopriv_{action} — руковање AJAX захтевима од непријављених корисника

Филтери: модификуј вредност пре него што се користи

Кука за филтер вам даје вредност, дозвољава вам да је модификујете и очекује да вратите модификовану верзију. WordPress затим користи вашу модификовану вредност уместо оригиналне.

add_filter( 'the_content', 'my_plugin_append_cta' );

function my_plugin_append_cta( $content ) {
    if ( ! is_single() ) {
        return $content;
    }
    $cta = '<div class="post-cta">Спремни да испробате PAGEnza? <a href="#">Започните бесплатно →</a></div>';
    return $content . $cta;
}

Кључно правило: увек вратите нешто из филтера. Ако заборавите return, вредност постаје null и управо сте прекинули све што ју је користило.

Уобичајене куке за филтере:

  • the_content — садржај поста пре приказивања
  • the_title — наслов поста
  • wp_nav_menu_items — HTML менија за навигацију
  • upload_mimes — дозвољени типови фајлова за отпремање
  • plugin_action_links_{plugin-file} — линкови приказани на страници са листом додатака

Како PAGEnza AI користи куке

Када Градитељ додатака генерише додатак, он структурира код око класе са методама прикаченим на куке у конструктору. Овај образац избегава сукобе имена глобалних функција и одржава код организованим.

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 ) {
        // увек врати
        return $content;
    }
}

new My_Plugin();

Безбедносни скенер посебно проверава да ли AJAX руковаоци укључују проверу nonce-а и проверу дозвола пре него што ураде било шта:

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

public function handle_ajax() {
    // Безбедност: провери nonce
    check_ajax_referer( 'my_nonce_action', 'nonce' );

    // Безбедност: провери дозволе
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( 'Недовољне дозволе', 403 );
    }

    // Сада је безбедно обрадити
    $data = sanitize_text_field( $_POST['data'] ?? '' );
    wp_send_json_success( [ 'result' => $data ] );
}

Недостатак било које од ових се означава као безбедносни проблем и блокира издавање додатка.

Приоритет и ред кука

Када су више функција прикачени на исту куку, оне се покрећу по редоследу приоритета (нижи број = прво се покреће). Подразумевани приоритет је 10.

add_action( 'init', 'runs_first', 5 );
add_action( 'init', 'runs_second', 10 );   // подразумевано
add_action( 'init', 'runs_last', 20 );

Ово је важно када ваш додатак треба да се покрене пре или после кода другог додатка. Ако модификујете нешто што други додатак такође модификује, приоритет одређује ко побеђује.

Уобичајени образац: ако преписујете филтер теме, користите приоритет 20 или виши да бисте се уверили да се покрећете након кода теме.

Уклањање кука

Можете уклонити куку коју је неко други додао — укључујући куке теме и додатака:

remove_action( 'wp_head', 'wp_generator' );  // уклања WP верзију из <head>
remove_filter( 'the_content', 'wpautop' );   // уклања аутоматско пагинирање параграфа

Зачкољица: можете уклонити куку само ако позовете remove_action/remove_filter након што се оригинални add_action/add_filter покренуо. Ово обично значи прикачивање вашег уклањања на каснију акцију.