Статьи

Альтернативные способы запуска событий в WordPress

В первой части этой серии, посвященной системе подключений WordPress , мы узнали о системе подключений WordPress, а также о двух типах actions и filters ловушек, а также о некоторых примерах кода их работы.

Во второй части этой серии мы узнаем об альтернативных способах запуска событий в WordPress и о том, как подключить статические и нестатические методы класса к actions и filters .

WordPress Hooks

В предыдущей статье я сделал следующее заявление:

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

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

Другие способы do_action_ref_array() функция do_action_ref_array() для ловушек action и apply_filters_ref_array() для ловушек filter .

do_action() , do_action_ref_array() и apply_filters() , apply_filters_ref_array() одинаковы в том apply_filters_ref_array() что каждая пара используется для выполнения функций, привязанных к конкретному действию, и фильтрации соответственно. Разница в том, как они указывают свой аргумент.

В отличие от do_action() и apply_filters() , do_action_ref_array() и apply_filters_ref_array() определяют их аргумент в виде массива.

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

Примеры кода

Действие user_profile_update_errors запускается в WordPress до того, как будут возвращены ошибки обновления профиля пользователя и обновлен профиль.

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

Вот как это определяется в ядре WordPress.

  /** * Fires before user profile update errors are returned. * * @since 2.8.0 * * @param WP_Error &$errors WP_Error object, passed by reference. * @param bool $update Whether this is a user update. * @param WP_User &$user WP_User object, passed by reference. */ do_action_ref_array( 'user_profile_update_errors', array( &$errors, $update, &$user ) ); 

Приведенный ниже код гарантирует, что поле пользовательского профиля с именем city (где пользователи могут вводить свои города) не останется пустым. Если это так, будет отображена ошибка с этой целью.

 add_action( 'user_profile_update_errors', function ( $errors, $update, $user ) { if ( empty( $_POST['city'] ) ) { $errors->add( 'city_empty', __( 'City field cannot be left empty.' ) ); } }, 10, 3 ); 

Давайте посмотрим пример кода apply_filters_ref_array() .

Приведенный ниже код bp_activity_permalink_redirect_url фильтру bp_activity_permalink_redirect_url в bbPress, чтобы изменить целевой URL перенаправления на http://website.com/custom-page/ до того, как перенаправление произойдет для одного элемента действия.

 add_filter( 'bp_activity_permalink_redirect_url', function ( $redirect, $activity ) { $redirect = 'http://website.com/custom-page/'; return $redirect; }, 10, 2 ); 

Когда использовать do_action_ref_array() и apply_filters_ref_array()

Делая ваш плагин или тему расширяемыми другими разработчиками, do_action_ref_array() и apply_filters_ref_array() предпочтительнее do_action() и apply_filters() когда есть много дополнительных переменных или значений, которые должны быть переданы функциям, которые подключаются к action а filter много. ,

Например, вы разрабатываете плагин для регистрации пользователей, и вы определили действие, которое будет запускаться после завершения регистрации, когда имя пользователя, адрес электронной почты, имя, фамилия, адрес, город, штат и страна зарегистрированного пользователя будут доступны для функций, зацепить его Вот как может выглядеть код при использовании do_action()

 do_action('after_user_registration_completed', $username, $email, $firstname, $lastname, $address, $city, $state, $country); 

Обратите внимание, как список аргументов делает строку кода длинной и некрасивой. Теперь сравните вышеописанное с do_action_ref_array() ниже.

 do_action_ref_array( 'after_user_registration_completed', array( $username, $email, $firstname, $lastname, $address, $city, $state, $country ) ); 

Привязка методов класса к действиям и фильтрам

Примеры кода, которые мы изучали, касаются привязки именованных и анонимных функций к action и filter .

Итак, давайте посмотрим, как вызывать или включать хуки с помощью add_action() и add_filter() внутри класса для обработки во время выполнения WordPress, а также как методы класса (статические и нестатические) могут быть подключены к actions и filters .

Большинство разработчиков WordPress включают все вызовы функций add_action() и add_filter() в своем конструкторе классов, который затем выполняется при создании экземпляра следующим образом:

 class DemoPlugin { public function __construct() { add_action( 'wp_head', array( $this, 'google_site_verification' ) ); add_filter( 'the_content', array( $this, 'we_love_sitepoint' ) ); } /** * Include Google site verification meta tag to WordPress header. */ public function google_site_verification() { echo '<meta name="google-site-verification" content="ytl89rlFsAzH7dWLs_U2mdlivbrr_jgV4Gq7wClHDUJ8" />'; } /** * Append and prepend the text "We love SitePoint" to every post content. * * @param string $content * * @return string */ public function we_love_sitepoint( $content ) { $text = sprintf( '<div class="notice alert">%s</div>', __( 'We love SitePoint', 'sp' ) ); $content = $text . $content . $text; return $content; } } new DemoPlugin(); 

Из приведенного выше фрагмента кода вы обнаружите, что метод и метод класса привязан к action или filter в том, что для метода класса второй аргумент add_action() и add_filter() является массив $this (ссылка на текущий объект) и имя метода.

Для статического метода имя класса используется вместо $this .

 class DemoPlugin { public function __construct() { add_action( 'wp_head', array( 'DemoPlugin', 'google_site_verification' ) ); } /** * Include Google site verification meta tag to WordPress header. */ public static function google_site_verification() { echo '<meta name="google-site-verification" content="ytl89rlFsAzH7dWLs_U2mdlivbrr_jgV4Gq7wClHDUJ8" />'; } } new DemoPlugin(); 

Приведенный выше подход, включающий в себя имя класса для каждого статического метода, который вы хотите подключить к фильтру или действию, нарушает принцип « не повторяйте себя» (DRY) и, таким образом, затрудняет рефакторинг.

Вместо этого используйте константу __CLASS__ которая возвращает имя класса, в котором оно было объявлено.

 class DemoPlugin { public function __construct() { add_action( 'wp_head', array( __CLASS__, 'google_site_verification' ) ); } // ... } new DemoPlugin(); 

Хотя я категорически не одобряю это, вот еще один способ включения статического метода в ловушку.

 class DemoPlugin { public function __construct() { add_action( 'wp_head', 'DemoPlugin::google_site_verification' ); } // ... } new DemoPlugin(); 

Вместо того, чтобы включать все вызовы функций add_action() и add_filter() в конструктор класса, я видел, как некоторые разработчики создают метод статического класса, который при вызове инициализирует / выполняет статические методы, подключенные к действию или фильтру.

 class DemoPlugin { public static function init() { add_action( 'wp_head', array( __CLASS__, 'google_site_verification' ) ); add_filter( 'the_content', array( __CLASS__, 'we_love_sitepoint' ) ); } // ... } DemoPlugin::init(); 

В этом подходе все методы, которые нужно подключить к actions и filters должны быть статическими, поскольку $this не доступно в статическом контексте.

Резюме

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

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

Удачного кодирования!