Блог
Архитектура хуков WordPress: Действия против Фильтров
Основа каждого отличного плагина. Узнайте, как 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 использует хуки
Когда Plugin Builder генерирует плагин, он структурирует код вокруг класса с методами, прикрепленными к хукам в конструкторе. Этот шаблон позволяет избежать конфликтов имен глобальных функций и сохраняет код организованным.
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 уже выполнился. Обычно это означает подключение вашего удаления к более позднему действию.