web-dev-qa-db-ja.com

拡張クラス内でプラグインからアクションを削除し、変数を割り当てない

私はこれのために非常に多くの解決策を試みましたが、私はそれを理解することができません。これがプラグインコードの簡略版です。

class YITH_Vendors_Frontend_Premium extends YITH_Vendors_Frontend {
    public function __construct() {

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

だから私は私の子供のテーマfunction.phpからこのアクションを削除したいです。

問題は、クラスが変数を介してインスタンス化されていないことです。代わりに次のようにインスタンス化されています。

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

しかしこのクラスは、変数を介してインスタンス化されることはありません。代わりにそれをインスタンス化する関数があります。

function YITH_Vendors() {

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

    return YITH_Vendors::instance();
  }

そしてそれはちょうどそのように呼ばれています:

YITH_Vendors();

私はこれらすべてを試したがチャンスはない。

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

助けてください!ありがとうございます。

1
Daniel Klose

あなたはこれを呼び出すための正しい行動を見つけたいと思うでしょう。アクションが追加された後、ただし呼び出される前それからオブジェクトのコールバックのインスタンスと同じ優先度を取得します(10がデフォルトです)。

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

単純なremove_actionを使用しても機能しません。無名オブジェクトとして置き換えるカスタム関数が必要です。また、「woocommerce_product_query」フィルタが設定された後にそれがトリガすることを確認してください。

この機能を試してください。

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

あなたの特定のフィルタのためにあなたはこれを試すべきです:

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

匿名オブジェクトフィルタが存在するかどうかも確認する必要があります。この関数を使用します。

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

それからこれを使ってください。

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