web-dev-qa-db-fra.com

Supprimer l'action du plugin dans la classe étendue et aucune variable affectée

J'ai essayé tellement de solutions pour cela mais je n'arrive pas à le comprendre. Voici une version simplifiée du code du plugin:

class YITH_Vendors_Frontend_Premium extends YITH_Vendors_Frontend {
    public function __construct() {

    add_action( 'woocommerce_register_form', array( $this, 'register_form' ) );
}

Donc, je veux supprimer cette action de mes thèmes enfants function.php.

Le problème est que la classe n'est pas instanciée via une variable. Au lieu de cela, il est instancié comme ceci:

class YITH_Vendors_Premium extends YITH_Vendors {
public function __construct() {
public function init() {
            $this->frontend = new YITH_Vendors_Frontend_Premium();
    }
  }
}

Cependant, cette classe n'est jamais instanciée via une variable. Au lieu de cela, il existe une fonction qui l'instance:

function YITH_Vendors() {

    if ( defined( 'YITH_WPV_PREMIUM' ) ) {
        return YITH_Vendors_Premium::instance();
    }

    return YITH_Vendors::instance();
  }

Et puis ça s'appelle juste comme ça:

YITH_Vendors();

J'ai essayé tout ça mais aucune chance:

remove_action( 'woocommerce_register_form', array( "YITH_Vendors_Frontend", 'register_form' ), 999 );
remove_action( 'woocommerce_register_form', array( "YITH_Vendors_Frontend_Premium", 'register_form' ), 999 );
remove_action( 'woocommerce_register_form', array( "YITH_Vendors", 'register_form' ), 999 );
remove_action( 'woocommerce_register_form', array( "YITH_Vendors_Premium", 'register_form' ), 999 );

S'il vous plaît aider! Merci!

1
Daniel Klose

Vous aurez envie de trouver la bonne action pour appeler cela. Après que l'action ait été ajoutée, mais avant qu'elle soit appelée. Ensuite, obtenez l'instance du rappel de l'objet et la même priorité (10 par défaut).

remove_action('woocommerce_register_form', array ( YITH_Vendors_Premium::instance()->frontend, 'register_form' ), 10 );
0
Olivier

Cela ne fonctionnera pas avec un simple remove_action, vous avez besoin d'une fonction personnalisée pour le remplacer en tant qu'objet anonyme. Assurez-vous également qu'il se déclenche une fois le filtre 'woocommerce_product_query' défini.

Essayez cette fonction:

function remove_anonymous_object_filter( $tag, $class, $method ) 
                {
                    $filters = false;

                    if ( isset( $GLOBALS['wp_filter'][$tag] ) )
                        $filters = $GLOBALS['wp_filter'][$tag];

                    if ( $filters )
                    foreach ( $filters as $priority => $filter ) 
                        {
                            foreach ( $filter as $identifier => $function ) 
                                {
                                    if ( ! is_array( $function ) )
                                        continue;

                                    if ( ! $function['function'][0] instanceof $class )
                                        continue;

                                    if ( $method == $function['function'][1] ) 
                                        {
                                            remove_filter($tag, array( $function['function'][0], $method ), $priority);
                                        }
                                }
                        }
                }

Pour votre filtre particulier, vous devriez essayer ceci:

remove_anonymous_object_filter('woocommerce_product_query',             'YITH_Vendors_Frontend_Premium', 'hide_vendors_product');

Vous devriez également vérifier si le filtre d'objet anonyme existe, utilisez cette fonction:

function anonymous_object_filter_exists($tag, $class, $method)
                {
                    if ( !  isset( $GLOBALS['wp_filter'][$tag] ) )
                        return FALSE;

                    $filters = $GLOBALS['wp_filter'][$tag];

                    if ( !  $filters )
                        return FALSE;

                    foreach ( $filters as $priority => $filter ) 
                        {
                            foreach ( $filter as $identifier => $function ) 
                                {
                                    if ( ! is_array( $function ) )
                                        continue;

                                    if ( ! $function['function'][0] instanceof $class )
                                        continue;

                                    if ( $method == $function['function'][1] ) 
                                        {
                                            return TRUE;
                                        }
                                }
                        }

                    return FALSE;
                }

Alors utilisez ceci:

if (anonymous_object_filter_exists('woocommerce_product_query',             'YITH_Vendors_Frontend_Premium', 'hide_vendors_product'))
    { .. }
0
WP-Silver