Статьи

Демистификация системы WordPress Hook

Если вы разрабатывали веб-сайты с помощью WordPress (включая разработку плагинов и тем), скорее всего, вы слышали эти термины: Hooks , Actions и Filters . Они являются частью шаблона управляемой событиями архитектуры , который использует WordPress.

Вы новичок в разработке WordPress или вам трудно понять основные понятия? Я не могу рекомендовать достаточно руководство Саймона Кодрингтона « Введение в разработку плагинов для WordPress» . Он проделал большую работу, объясняя Actions и Filters .

В этом уроке я буду демистифицировать систему хуков WordPress, не оставляя камня на камне. Без дальнейших церемоний, давайте начнем.

Крючки, Акции, Фильтры. Кто они такие?

«Хуки» — это, по сути, события, запускаемые ядром WordPress, темами и плагинами на разных этапах их исполнения или интерпретации PHP. Когда эти события запускаются, все функции и / или методы класса, подключенные к ним или присоединенные к ним, выполняются в правильном порядке.

Крючки бывают двух видов: действия и фильтры. В то время как первый используется для добавления и удаления функций или функциональных возможностей на различных этапах выполнения процесса, второй изменяет поведение различных функций и реализаций. Не волнуйтесь, если вы все еще не понимаете. Вы увидите, когда мы начнем видеть некоторые примеры кода ниже.

Важность системы хуков в WordPress

Важность системы хуков в WordPress — это просто расширяемость . Это позволяет добавлять и удалять функции, а также настраивать / изменять реализацию функций в ядре WordPress, плагинах и темах.

Когда вы пишете расширяемые плагины и темы, вы позволяете другим разработчикам улучшать и расширять их, даже не редактируя основной исходный код.

WordPress Hooks

Позвольте мне привести пример. В отличие от большинства платежных шлюзов, мой плагин 2Checkout Payment Gateway для WooCommerce не включает значок, отображающий поддерживаемые типы кредитных карт на странице оформления заказа, потому что я чувствовал, что это не нужно. Но вы знаете, что; Я добавил filter на случай, если пользователь будет чувствовать себя иначе.

Так уж получилось, что мы получили запрос в службу поддержки от клиента с просьбой о включении иконки. Мы смогли предоставить клиенту фрагмент кода, который подключается к фильтру и включает значок.

Погружение в систему WordPress Hook

На различных этапах выполнения WordPress большое количество событий запускается обычно с использованием PHP-функций do_actions() и apply_filters() . Эти события могут быть подписаны или подключены через add_action() и add_filter() .

Пожалуйста, обратите внимание на использование слова «обычно». Есть и другие способы запуска событий. Мы рассмотрим это во второй части этого урока.

Ниже приведен пример action в плагине. Это действие запускается после успешной регистрации пользователя в моем плагине для регистрации пользователя ProfilePress .

 /** * Fires after a user registration is completed. * * @param int $form_id ID of the registration form. * @param mixed $user_data array of registered user info. * @param int $user_id ID of the registered user. */ do_action( 'pp_after_registration', $form_id, $user_data, $user_id ); 

Во время выполнения WordPress все функции, подключенные к этому действию, будут обработаны.

Примером ловушки фильтра является the_content в ядре WordPress, который фильтрует содержимое каждого сообщения.

  /** * Filter the post content. * * @since 0.71 * * @param string $content Content of the current post. */ $content = apply_filters( 'the_content', $content ); 

Принять к сведению

В do_action() первый аргумент — это имя ловушки действия, а последующие аргументы — это переменные, доступные для функций, которые подключаются к действию.

А в apply_filters() первый аргумент — это имя ловушки фильтра, второй — данные или значение, для которых функции, подключенные к фильтру, модифицируются или применяются. Последующие аргументы — это переменные / значения, доступные для функций, которые подключаются к фильтру.

Не волнуйтесь, все это будет иметь больше смысла при рассмотрении примеров кода.

Примеры хуков действий

Пример № 1

pp_after_registration действия pp_after_registration моего плагина pp_after_registration для вращения; скажем, мы хотим реализовать функцию, при которой пользователи будут получать SMS (через предполагаемую службу обмена сообщениями под названием Dolio ), приветствуя их на вашем сайте сразу после регистрации. Наша функция ловушка может быть в этой форме:

 add_action( 'pp_after_registration', 'send_users_welcome_sms', 20, 3 ); function send_users_welcome_sms( $form_id, $user_data, $user_id ) { global $service_locator; $username = $user_data['username']; $firstName = $user_data['first_name']; $lastName = $user_data['last_name']; $phoneNumber = $user_data['phone_number']; $text = <<<SMS_CONTENT Hello $firstName $lastName, Welcome to SitePoint. "\r\n" User ID: $user_id "\r\n" Username: $username "\r\n" Password: The password you sign up with "\r\n" SMS_CONTENT; $dolio = $service_locator->get( 'dolio_sdk' ); $dolio->phone_number( $phoneNumber ); $dolio->sms_content( $text ); $dolio->send(); } 

Третий аргумент add_action в приведенном выше коде — это приоритет перехвата, который определяет порядок, в котором будет выполняться функция, подключенная к действию pp_after_registration . Если оставить это поле пустым, по умолчанию будет 10 . В то время как четвертый аргумент указывает количество аргументов, которые будет принимать функция hook. По умолчанию 1 если пусто.

Предполагая, что я пропустил четвертый аргумент, то есть по $user_data $user_id переменные $user_data и $user_id будут null потому что мы только сказали функции принимать только один аргумент.

Пример № 2

WordPress включает в себя следующие хуки actionwp_head и wp_footer — которые оба запускаются в теге head и перед закрывающим тегом body на переднем конце соответственно.

Эти хуки могут использоваться для отображения сценария и данных в этих стратегических точках.

Давайте проверим несколько примеров кода.

Приведенный ниже код использует wp_head для включения метатега проверки сайта Google в заголовок внешнего интерфейса WordPress.

 add_action( 'wp_head', 'google_site_verification' ); function google_site_verification() { echo '<meta name="google-site-verification" content="ytl89rlFsAzH7dWLs_U2mdlivbrr_jgV4Gq7wClHDUJ8" />'; } 

Все подключаемые функции будут анонимными вместо именованной функции, чтобы избежать ненужного повторения имен функций. Например, код для мета-тега проверки сайта Google выше теперь станет:

 add_action( 'wp_head', function () { echo '<meta name="google-site-verification" content="ytl89rlFsAzH7dWLs_U2mdlivbrr_jgV4Gq7wClHDUJ8" />'; }); 

Код ниже использует wp_footer для добавления JavaScript в область wp_footer колонтитула wp_footer WordPress.

 add_action( 'wp_footer', function () { echo '<script type="text/javascript" src="http://example.com/wp-content/plugins/site-specific-plugin/hello-bar.js"></script>'; }); 

Достаточно примера кода ловушек действий, давайте проверим фильтры.

Примеры фильтрующих зацепок

Пример № 1

Скажем, мы разрабатываем плагин для вставки рекламы, который будет программно вставлять рекламу до и после каждого содержимого the_content нам нужен фильтр the_content .

Код ниже включает текст «Мы любим SitePoint» до и после каждого содержимого публикации.

 add_filter( 'the_content', function ( $content ) { $text = sprintf( '<div class="notice alert">%s</div>', __( 'We love SitePoint', 'sp' ) ); $content = $text . $content . $text; return $content; }); 

Объяснение кода: содержимое переменной $text совпадает с <div class="notice alert">We love SitePoint</div> хотя и интернационализированы, чтобы его можно было локализовать. Смущенный? Пожалуйста, ознакомьтесь с моими руководствами по WordPress i18n и l10n .

Имейте в виду, параметр функции $content — это переменная, которая предоставляет содержимое публикации.

Затем мы добавляем пользовательский текст до и после содержимого публикации, сохраняем полученные данные в $content и затем возвращаем их.

Примечание: все функции ловушки filter должны возвращать параметр переменной после манипуляции или модификации.

Пример № 2

Другой пример фильтра, который мы рассмотрим — the_title . Ниже описано, как это определяется в строке 158 wp-includes/post-template.php .

  /** * Filter the post title. * * @since 0.71 * * @param string $title The post title. * @param int $id The post ID. */ return apply_filters( 'the_title', $title, $id ); 

Приведенный ниже код изменяет только заголовок сообщения с идентификатором 5978, добавляя к нему - WeLoveSitePoint . Это возможно благодаря аргументу $id .

 add_filter( 'the_title', function ( $title, $id ) { if ( $id == '5978' ) { $title .= ' - WeLoveSitePoint'; } return $title; }, 10, 2 ); 

Вывод

Причина, по которой WordPress продолжает оставаться ведущей системой управления контентом, заключается в ее расширяемости.

Система WordPress Hook позволила превратить WordPress в мощные веб-приложения, будь то магазин электронной коммерции с WooCommerce, форум с bbPress или даже сайт социальной сети с BuddyPress.

Во второй части этого руководства я поделюсь некоторыми интересными и малоизвестными фактами о системе перехвата в WordPress, например, о том, как: использовать их в классе, связывать статические и нестатические методы с действиями и фильтрами, использовать пространства имен и пояснения к ним. и решения и многое другое. Так что следите за обновлениями и счастливого кодирования.