Как удалить action из плагина?

29 сент. 2016 г., 11:24:13
Просмотры: 29.2K
Голосов: 1

У меня есть плагин, который добавляет следующий 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

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

4
Комментарии

Чтобы начать отвечать на ваш второй вопрос, похоже, что ссылки на this никуда не ведут. Если я правильно понимаю код, это не объект $ultimatemember? Если вы замените this на правильное имя объекта, то этого может быть достаточно в данном случае.

Andy Macaulay-Brook Andy Macaulay-Brook
29 сент. 2016 г. 12:33:18

Спасибо. К сожалению, замена this на $ultimatemember не работает. Это находится в class UM_User { function __construct() { $this->id = 0;, поэтому, возможно, это ссылается на объект UM_User?

user2806026 user2806026
29 сент. 2016 г. 13:45:29

Я создам новый вопрос. Спасибо за вашу помощь :-)

user2806026 user2806026
29 сент. 2016 г. 13:48:53

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

Andy Macaulay-Brook Andy Macaulay-Brook
29 сент. 2016 г. 13:49:41
Все ответы на вопрос 2
8

Вы хотите:

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.

29 сент. 2016 г. 11:35:55
Комментарии

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

user2806026 user2806026
29 сент. 2016 г. 11:37:51

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

Andy Macaulay-Brook Andy Macaulay-Brook
29 сент. 2016 г. 11:40:29

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

Andy Macaulay-Brook Andy Macaulay-Brook
29 сент. 2016 г. 11:41:29

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

user2806026 user2806026
29 сент. 2016 г. 11:53:30

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

Andy Macaulay-Brook Andy Macaulay-Brook
29 сент. 2016 г. 11:57:09

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

user2806026 user2806026
29 сент. 2016 г. 12:20:52

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

Andy Macaulay-Brook Andy Macaulay-Brook
29 сент. 2016 г. 12:26:53

Это совершенно другой вопрос, на самом деле.

Andy Macaulay-Brook Andy Macaulay-Brook
29 сент. 2016 г. 12:30:39
Показать остальные 3 комментариев
0
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 приоритет действия должен быть таким же, как при добавлении действия.

19 дек. 2019 г. 05:28:09