WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

remove_action() WP 1.2.0

Удаляет хук (событие или фильтр). Удаляет функцию прикрепленную к указанному хуку.

Удалять хук нужно после того, как он был добавлен. А значит: если вы удаляете хук, а он не удаляется, то скорее всего вы удаляете его до того как он добавляется в коде.

// удаляем хук
remove_action( 'wp_head', 'my_function', 20 );

// здесь подключаемые файлы и где-то в них этот хук 
// добавляется так: add_action( 'wp_head', 'my_function', 20 );
// в результате ваше удаление не работает!

В этом случае удалить хук можно повесив удаление на другой, более поздний хук например wp_loaded:

add_action( 'wp_loaded', function(){
	remove_action( 'wp_head', 'my_function');
} );

ВАЖНО: При удалении хука, приоритет (параметр $priority) должен совпадать с указанным при создании хука. При несовпадении, вы не увидите никаких предупреждений об этом - функция просто вернет false.

Работает на основе: remove_filter()
✈ 1 раз = 0.00001с = скорость света | 50000 раз = 0.06с = скорость света

Хуков нет.

Возвращает

true/false. true — хук был удален. false — хук не был удален.

Использование

remove_action( $tag, $function_to_remove, $priority );
$tag(строка) (обязательный)
Название фильтра, функцию которого нужно будет удалить.
По умолчанию: нет
$function_to_remove(строка) (обязательный)
Название функции, которую нужно удалить.
По умолчанию: нет
$priority(число)
Приоритет хука (функции), который был установлен во время добавления.
По умолчанию: 10
$accepted_args(удален)
Удален с версии 3.5.

Примеры

#1. Пример отключения хука-события:

Отключим действие wpautop у хука the_content:

remove_action( 'the_content', 'wpautop' );

точно также его можно отключить через remove_filter() - это идентичная функция:

remove_filter( 'the_content', 'wpautop' );

#2 Пример удаления хука-события для PHP класса

Если событие было добавлено из класса (например, плагин добавил какое-то событие), то чтобы его удалить вам нужно знать конкретный экземпляр класса, который добавил хук. Часто эти экземпляры классов хранятся в глобальных переменных.

Пример удаления хука вызванного из класса, который был записан в глобальную переменную $my_class:

global $my_class; // это сохраненный экземпляр класса
remove_action( 'the_content', array( $my_class, 'class_filter_function' ) );

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

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

#3 Удаление хука со статическим методом класса

Допустим хук был добавлен таким кодом:

class My_Class {

	function __construct(){
		// add hook
		add_action( 'checkout_init', [ __CLASS__, 'force_login' ], 10, 1 );
	}

	static function force_login(){
		// function code
	}
}

new My_Class();

Чтобы удалить этот хук нужно: во-первых вызвать функцию удаление позже и во-вторых правильно передать название метода:

add_action( 'wp_loaded', function(){
	remove_action( 'checkout_init', [ 'My_Class', 'force_login' ], 10, 1 );
} );

#4 Другие примеры

Еще примеры смотрите в описании функции: remove_filter().

Список изменений

С версии 1.2.0 Введена.

Код remove action: wp-includes/plugin.php WP 5.4.2

<?php
function remove_action( $tag, $function_to_remove, $priority = 10 ) {
	return remove_filter( $tag, $function_to_remove, $priority );
}

Cвязанные функции

Из метки: События (хуки)

Еще из раздела: Хуки: события, фильтры

11 комментов
Полезные 2 Вопросы 1 Все
  • @ campusboy3554 www.youtube.com/c/wpplus

    Друзья, расскажите побольше про удаления хука-события для PHP класса. Вот хочу убрать со страницы редактирования пользователя в админке мета-поля, добавленные плагином Yoast SEO. Вот часть кода его:

    class WPSEO_Admin_User_Profile {
    	/**
    	 * Class constructor
    	 */
    	public function __construct() {
    		add_action( 'show_user_profile', array( $this, 'user_profile' ) );
    		add_action( 'edit_user_profile', array( $this, 'user_profile' ) );
    		add_action( 'personal_options_update', array( $this, 'process_user_option_update' ) );
    		add_action( 'edit_user_profile_update', array( $this, 'process_user_option_update' ) );
    	}
    
    Ответить4.5 года назад #
    • Kama7770

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

      Т.е. тебе надо найти где создается класс:

      $foo = new WPSEO_Admin_User_Profile();

      Обычно переменная $foo глобальная и к ней есть доступ отовсюду. Используя её можно удалить хук. Например:

      add_action( 'show_user_profile', array( $foo, 'user_profile' ) );

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

      П.С. про порядок выполнения операций не забывай: не вызови удаление до того как хук добавлен - не удалиться ничего, даже если код правильный...

      1
      Ответить4.5 года назад #
      • Worknmn sagip.ru

        https://github.com/herewithme/wp-filters-extras/ вот два метода-лома. Удалить можно, но риски есть всё равно. Однако в таких случаях альтернатив мало...

        1
        Ответить2.4 года назад #
      • Artem

        Вот работающий пример(может кому пригодиться):

        /**
         * Frontend scripts class.
         */
        class WC_Frontend_Scripts {
        
        ....
        
        	public static function load_scripts() {
        		global $post;
        
        		if ( ! did_action( 'before_woocommerce_init' ) ) {
        			return;
        ....
        
        	public static function init() {
        		add_action( 'wp_enqueue_scripts', array( __CLASS__, 'load_scripts' ) );
        		add_action( 'wp_print_scripts', array( __CLASS__, 'localize_printed_scripts' ), 5 );
        		add_action( 'wp_print_footer_scripts', array( __CLASS__, 'localize_printed_scripts' ), 5 );
        	}

        ....

        Удаляется так:

        remove_action( 'wp_enqueue_scripts', array( 'WC_Frontend_Scripts', 'load_scripts' ) );
        
        Ответить7 мес назад #
  • unskill

    При удалении хука, приоритет (параметр $priority) должен совпадать с указанным при создании хука.

    Спс.

    1
    Ответить2.3 года назад #
  • add_filter( 'style_loader_src', 'mytheme_change_styles_url', 10, 2 );
    function mytheme_change_styles_url( $src, $handle ){
    	$src = wp_make_link_relative( $src );
    	return $src;

    Подскажите, хочу изменить абсолютный путь до файла на относительный, но в теме есть подключение //fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700, как сделать исключение к данной строчке? id='google-font-montserrat-css'

    Ответить1.1 года назад #
    • @ campusboy3554 www.youtube.com/c/wpplus

      Судя по всему проверить, есть ли в $src подстрока fonts.googleapis.com и если есть - вернуть её в неизменном виде. Проверить можно с помощью strpos().

      Ответить1.1 года назад #
  • Комрон

    Здравствуйте, пожалуйста скажите как очистить ненужные коды WordPress на WordPress 5.4 или как использовать remove_action на WordPress 5.4

    Ответить4 мес назад #
  • Подскажите. Как удалить действие? В плагине оно прописано как:

            // Force user to log in or create account if there is LD course in WC cart
    		add_action( 'woocommerce_checkout_init', array( __CLASS__, 'force_login' ), 10, 1 );

    В functions.php добавил

    add_action( 'wp_loaded', function(){
    	remove_action( 'woocommerce_checkout_init', 'force_login', 10, 1 );
    } );

    Но что-то не работает.

    Ответить27 дней назад #
    • @ campusboy3554 www.youtube.com/c/wpplus
      add_action( 'wp_loaded', function(){
      	remove_action( 'woocommerce_checkout_init', array( __CLASS__, 'force_login' ) );
      } );

      Только вместо __CLASS__ надо подставить название класса (если метод статический).

      Лучшие сказать, откуда этот хук, быстрое гугление результатов не дало.

      1
      Ответить27 дней назад #