Поддержка Разное Как дотянуться до action внутри класса в классе?

  • РешеноМодератор Юрий

    (@yube)


    Имеется такая вот конструкция плагина (упрощено для ясности):
    index.php:

    class pluginClass {
      function frontend() {
        include 'frontend.php';
        new pluginClassFronEnd();
      }
    }
    new pluginClass();
    

    frontend.php:

    class pluginClassFrontEnd() {
       function __construct() {
          add_action('wp_footer', array($this, 'wp_footer'));
       }
       function wp_footer() {
       }
    }
    

    Как сделать remove вышеозначенному action?

    remove_action('wp_footer', array('pluginClassFrontEnd', 'wp_footer'));
    

    не срабатывает, видимо, из-за вложенности классов.
    Лезть в код плагина запрещено по условиям задачи ))

Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Как сделать remove вышеозначенному action?

    Как-то так:

    
    function remove_plugin_class_front_end_action() {
    	global $wp_filter;
    
    	$action   = 'wp_footer';
    	$class    = 'pluginClassFrontEnd';
    	$priority = 10;
    
    	if ( ! isset( $wp_filter[ $action ] ) ) {
    		return;
    	}
    
    	foreach ( $wp_filter[ $action ]->callbacks[ $priority ] as $key => $callback ) {
    		if ( ! is_array( $callback['function'] ) ) {
    			continue;
    		}
    
    		if ( get_class( $callback['function'][0] ) === $class ) {
    			unset( $wp_filter[ $action ]->callbacks[ $priority ][ $key ] );
    		}
    	}
    }
    add_action( 'init', 'remove_plugin_class_front_end_action' );
    
    Модератор Юрий

    (@yube)

    Спасибо!

Просмотр 2 ответов — с 1 по 2 (всего 2)