В первой части этой серии, посвященной системе подключений WordPress , мы узнали о системе подключений WordPress, а также о двух типах actions
и filters
ловушек, а также о некоторых примерах кода их работы.
Во второй части этой серии мы узнаем об альтернативных способах запуска событий в WordPress и о том, как подключить статические и нестатические методы класса к actions
и filters
.
В предыдущей статье я сделал следующее заявление:
На различных этапах выполнения 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.
Удачного кодирования!