Eliminar acción de una clase de complemento

2
<?php

namespace wp_gdpr_wc\controller;

use wp_gdpr\lib\Gdpr_Container;
use wp_gdpr_wc\lib\Gdpr_Wc_Translation;
use wp_gdpr_wc\model\Wc_Model;

class Controller_Wc {
    const REQUEST_TYPE = 3;

    /**
     * Controller_Form_Submit constructor.
     */
    public function __construct() {
        add_action( 'woocommerce_after_order_notes', array( $this, 'checkout_consent_checkbox' ) );
    }

Por lo general, podría eliminarlo como este remove_action( 'woocommerce_after_order_notes', 'Controller_Wc::checkout_consent_checkbox'); pero aquí parece que no está funcionando.

    
pregunta Alex 30.05.2018 - 16:45

2 respuestas

2

Lo hice usando esta función remove_filters_with_method_name( 'woocommerce_after_order_notes', 'checkout_consent_checkbox', 10 );

function remove_filters_with_method_name( $hook_name = '', $method_name = '', $priority = 0 ) {
    global $wp_filter;
    // Take only filters on right hook name and priority
    if ( ! isset( $wp_filter[ $hook_name ][ $priority ] ) || ! is_array( $wp_filter[ $hook_name ][ $priority ] ) ) {
        return false;
    }
    // Loop on filters registered
    foreach ( (array) $wp_filter[ $hook_name ][ $priority ] as $unique_id => $filter_array ) {
        // Test if filter is an array ! (always for class/method)
        if ( isset( $filter_array['function'] ) && is_array( $filter_array['function'] ) ) {
            // Test if object is a class and method is equal to param !
            if ( is_object( $filter_array['function'][0] ) && get_class( $filter_array['function'][0] ) && $filter_array['function'][1] == $method_name ) {
                // Test for WordPress >= 4.7 WP_Hook class (https://make.wordpress.org/core/2016/09/08/wp_hook-next-generation-actions-and-filters/)
                if ( is_a( $wp_filter[ $hook_name ], 'WP_Hook' ) ) {
                    unset( $wp_filter[ $hook_name ]->callbacks[ $priority ][ $unique_id ] );
                } else {
                    unset( $wp_filter[ $hook_name ][ $priority ][ $unique_id ] );
                }
            }
        }
    }
    return false;
}
    
respondido por el Alex 30.05.2018 - 16:49
3

Para eliminar una acción, debe pasar el mismo llamable que se utilizó para agregar la acción en primer lugar. La diferencia con su gancho, en comparación con una función simple o un método estático, es que ha pasado un método en una instancia específica de su clase. Tenga en cuenta el uso de $this :

add_action( 'woocommerce_after_order_notes', array( $this, 'checkout_consent_checkbox' ) );

Entonces, cuando elimina la acción, debe pasar la misma instancia de la misma manera:

add_action( 'woocommerce_after_order_notes', array( $that, 'checkout_consent_checkbox' ) );

Donde $that es una variable que contiene la misma instancia de la clase.

Para hacer esto necesitas encontrar esa variable. Esto depende de cómo se construyó originalmente el complemento. Si la clase fue instanciada en una variable global como esta:

global $wp_gdpr_wc_controller;
$wp_gdpr_wc_controller = new Controller_Wc;

Luego lo eliminarías así:

global $wp_gdpr_wc_controller;
remove_action( 'woocommerce_after_order_notes', array( $wp_gdpr_wc_controller, 'checkout_consent_checkbox' ) );
    
respondido por el Jacob Peattie 31.05.2018 - 04:11

Lea otras preguntas en las etiquetas