Entfernen Sie Aktion vom Plugin innerhalb der erweiterten class und keine zugewiesene Variable

Ich habe so viele Lösungen dafür ausprobiert, aber ich kann es nicht herausfinden. Hier ist eine vereinfachte Version des Plugin-Codes:

class YITH_Vendors_Frontend_Premium extends YITH_Vendors_Frontend { public function __construct() { add_action( 'woocommerce_register_form', array( $this, 'register_form' ) ); } 

Also möchte ich diese Aktion aus meinen Child-Themes function.php entfernen.

Das Problem ist, dass die class nicht über eine Variable instanziert wird. Stattdessen wird es wie folgt instanziert:

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

Diese class wird jedoch niemals über Variable instanziert. Stattdessen gibt es eine function, die es vortäuscht:

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

Und dann heißt es einfach so:

 YITH_Vendors(); 

Ich habe alles versucht, aber keine 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 ); 

Bitte helfen Sie! Vielen Dank!

Solutions Collecting From Web of "Entfernen Sie Aktion vom Plugin innerhalb der erweiterten class und keine zugewiesene Variable"

Sie möchten die richtige Aktion finden, um dies aufzurufen. Nachdem die Aktion hinzugefügt wurde, aber bevor sie aufgerufen wird. Rufen Sie dann die Instanz des callbacks des Objekts und die gleiche Priorität ab (10 ist der Standardwert).

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

Es funktioniert nicht mit einer einfachen remove_action, Sie müssen eine benutzerdefinierte function als anonyme Objekt ersetzen. Stellen Sie außerdem sicher, dass es ausgetriggers wird, nachdem der Filter ‘woocommerce_product_query’ festgelegt wurde.

Probieren Sie diese function aus:

 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); } } } } 

Für Ihren speziellen Filter sollten Sie Folgendes versuchen:

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

Sie sollten auch überprüfen, ob der anonyme Objektfilter vorhanden ist, verwenden Sie diese function:

 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; } 

Dann benutze das:

 if (anonymous_object_filter_exists('woocommerce_product_query', 'YITH_Vendors_Frontend_Premium', 'hide_vendors_product')) { .. }