Как удалить action из плагина?
У меня есть плагин, который добавляет следующий action, который помимо прочего отправляет регистрационное письмо при добавлении нового пользователя:
add_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
Я хотел бы удалить этот action, чтобы добавить его снова с дополнительными проверками в вызываемой функции. Я пробовал следующее, но не смог заставить это работать:
add_action( 'um_post_registration_approved_hook', 'remove_my_action', 11 );
function remove_my_action(){
remove_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
}
Есть идеи?
РЕДАКТИРОВАНО
Оказалось, что я неправильно указал приоритет, спасибо! Теперь я могу удалить action и зарегистрировать новый. Однако теперь у меня возникли некоторые проблемы. Вот что я отменил:
add_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
function um_post_registration_approved_hook($user_id, $args){
global $ultimatemember;
$ultimatemember->user->approve();
}
Затем я зарегистрировал следующее:
add_action( 'um_post_registration_approved_hook', 'remove_my_action', 9 );
function remove_my_action(){
remove_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
add_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook_new', 10, 2);
}
function um_post_registration_approved_hook_new($user_id, $args){
newApprove();
}
// Сделать так, чтобы action вызывал другую версию этой функции - проверка user meta - paupress_pp_user_type
function newApprove(){
global $ultimatemember;
$user_id = um_user('ID');
delete_option( "um_cache_userdata_{$user_id}" );
if ( um_user('account_status') == 'awaiting_admin_review' ) {
$this->password_reset_hash();
$ultimatemember->mail->send( um_user('user_email'), 'approved_email' );
} else {
// проверить paupress_pp_user_type перед отправкой
$this->password_reset_hash();
// НЕ ОТПРАВЛЯТЬ ЭТО ПИСЬМО
//$ultimatemember->mail->send( um_user('user_email'), 'welcome_email');
}
$this->set_status('approved');
$this->delete_meta('account_secret_hash');
$this->delete_meta('_um_cool_but_hard_to_guess_plain_pw');
do_action('um_after_user_is_approved', um_user('ID') );
}
Это просто другая версия оригинальной функции approve(), где удалено почтовое уведомление. НО это не работает, так как оригинальный approve() определен внутри класса UM_user и функция зависит от этого. Оригинальный файл находится здесь, с функцией approve(), определенной с строки 941: http://pastebin.com/FknrcxzM
Имеет ли смысл моя проблема? И могу ли я подключиться к классу вместо функции? - Не знаю, какой подход здесь правильный..
Вы хотите:
remove_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
... чтобы это выполнилось после оригинального add_action
, но перед тем, как действие вызовет функцию um_post_registration_approved_hook
Самый простой способ сделать это (хотя я не тестировал) — просто задать вашему удалению более высокий приоритет на том же хуке:
add_action( 'um_post_registration_approved_hook', 'remove_my_action', 9 );
function remove_my_action(){
remove_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
}
Это то, что вы пытались сделать, но приоритет был задан в обратном порядке. 11
выполняется после 10
.

Но разве remove_action не должен выполняться внутри функции, чтобы работать? Кажется, я где-то видел это в документации.

Вам нужно только убедиться, что он выполняется после оригинального add_action и до срабатывания действия. Так что вы можете поместить его в функцию, но использовать более подходящий хук. Какой контекст у add_action? Без этого мы не сможем выбрать хук для remove. Что вызывает um_ действие?

Я немного торможу - я понял, что вам нужно - секунду, пока я редактирую ответ.

Спасибо! Я только что проверил - первый вариант с просто remove_action не работает ни в functions.php, ни в другом плагине.

Да - думаю, у тебя просто неправильный приоритет. Попробуй 9 вместо 11. Если не сработает, тогда нужно использовать другой хук.

Спасибо. Теперь это работает; я могу удалить действие и зарегистрировать другое вместо него. Однако функция, которую я переопределяю, определена внутри класса, и при переопределении она перестает работать. Я отредактировал свой вопрос; объяснение понятно?

Ах. Внутри класса правила меняются! Дай мне немного времени, чтобы разобраться.

if(!function_exists('remove_my_action')){
function remove_my_action(){
remove_action( 'storefront_header', 'storefront_secondary_navigation', 30 );
remove_action( 'storefront_header', 'storefront_header_container_close', 41 );
remove_action( 'storefront_header', 'storefront_primary_navigation_wrapper', 42 );
remove_action( 'storefront_header', 'storefront_primary_navigation', 50 );
remove_action( 'storefront_header', 'storefront_primary_navigation_wrapper_close', 68 );
}
}
add_action( 'init', 'remove_my_action', 99);
Этот код работает корректно, я проверил его с помощью данного фрагмента.
Примечание: В функции Remove Action приоритет действия должен быть таким же, как при добавлении действия.
