2016-04-15 22 views
5

Więc mam ten kod wtyczkiWordPress - usuń działanie zdefiniowane w klasie wtyczki

class WC_List_Grid { 

public function __construct() { 
    add_action('wp' , array($this, 'setup_gridlist') , 20); 
} 

function setup_gridlist() { 
    add_action('woocommerce_before_shop_loop', array($this, 'gridlist_toggle_button'), 30); 
} 

function gridlist_toggle_button() {?> 
       <nav class="gridlist-toggle"> 
        <a href="#" id="grid" title="<?php _e('Grid view', 'woocommerce-grid-list-toggle'); ?>"><span class="dashicons dashicons-grid-view"></span> <em><?php _e('Grid view', 'woocommerce-grid-list-toggle'); ?></em></a> 
        <a href="#" id="list" title="<?php _e('List view', 'woocommerce-grid-list-toggle'); ?>"><span class="dashicons dashicons-exerpt-view"></span> <em><?php _e('List view', 'woocommerce-grid-list-toggle'); ?></em></a> 
       </nav> 
<?php } 
} 

Chcę zmienić treść gridlist_toggle_button funkcji. W ten sposób planuję zmienić zawartość tej funkcji. Podobnie jak przy pisaniu innej funkcji z prawie takim samym html jak oryginalny, ale bitami moich zmian. Coś jak

add_action('woocommerce_before_shop_loop','new_gridlist_toggle_button') 
function new_gridlist_toggle_button() {?> 
       <nav class="gridlist-toggle"> 
        <a href="#" class="grid-view" title="<?php _e('Grid view', 'woocommerce-grid-list-toggle'); ?>"><span class="dashicons dashicons-grid-view"></span> <em><?php _e('Grid view', 'woocommerce-grid-list-toggle'); ?></em></a> 
        <a href="#" class="list-view" title="<?php _e('List view', 'woocommerce-grid-list-toggle'); ?>"><span class="dashicons dashicons-exerpt-view"></span> <em><?php _e('List view', 'woocommerce-grid-list-toggle'); ?></em></a> 
       </nav> 
<?php } 
} 

w ten sposób, że nie będzie musiał zmieniać wtyczki plików bezpośrednio

za to, staram się usunąć powiązane z nim działania.

add_action('woocommerce_before_shop_loop', array($this, 'gridlist_toggle_button'), 30); 

Aby móc używać własnego kodu. Ale nie mogę usunąć tej akcji. Próbowałem tego do tej pory.

Metoda 1:

global $WC_List_Grid ; 
remove_action('woocommerce_before_shop_loop', array($WC_List_Grid, 'gridlist_toggle_button'), 100); 

Metoda 2:

function remove_plugin_actions(){ 
global $WC_List_Grid ; 
remove_action('woocommerce_before_shop_loop', array($WC_List_Grid, 'gridlist_toggle_button'), 100); 
} 
add_action('init','remove_plugin_actions'); 

Metoda 3

remove_action('woocommerce_before_shop_loop', array('WC_List_Grid', 'gridlist_toggle_button'), 100); 

Żaden z nich nie wydaje się działać.

Przy odrobinie "burzy mózgów" myślę, że mogą istnieć dwie możliwe przyczyny.

  1. Nie działa, ponieważ akcja, którą chcę usunąć, nie jest bezpośrednio podłączona do haka. Jego działanie w akcji.
  2. Próbuję zablokować wyjście z gridlist_toggle_button przez functions.php. Ale jeśli wtyczki ładują się przed funkcją functions.php, to funkcja, która ma zostać zablokowana, jest już wywoływana i dlatego zawsze pokazuje wynik.

Nie jestem w ogóle dobra w OOP. Czy ktoś mógłby mi pomóc?

Odpowiedz

3

Po utworzeniu instancji $wc_lg = new WC_List_Grid(), zostanie wywołana hak wp. Zaraz po skonfigurowaniu globalnego obiektu klasy WP instancja $wg_lg sama wywoła setup_gridlist(). Będzie uruchamiać hak woocommerce_before_shop_loop. I kiedykolwiek tak się stanie, znowu $wg_lg będzie wywoływał funkcję na sobie. Mianowicie gridlist_toggle_button().

Chcę zmienić treść funkcji gridlist_toggle_button

Dlaczego nie wystarczy, aby zmienić go wewnątrz wtyczki? Tak jak nadmiar wszystkiego, co w nim jest.

global $ WC_List_Grid;

Skąd wiadomo, że $WC_List_Grid ma swoją nazwę? To tylko nazwa klasy. Można go utworzyć pod dowolną nazwą, na przykład $foo lub $bar.

Zakładam, że kodujesz w pliku functions.php swojego szablonu. Wtyczki są ładowane zanim funkcja.php i remove_action() może działać dopiero po wydaniu add_action().

Ważne: Aby usunąć haczyk, zmienna $ i $ function_to_remove priorytet argumenty muszą dopasować kiedy hak został dodany. Dotyczy to zarówno filtrów, jak i akcji. W przypadku usunięcia błędu nie zostanie wyświetlone ostrzeżenie.

http://codex.wordpress.org/Function_Reference/remove_action

Więc powinno to faktycznie pracują tylko do usuwania działania, ale w jaki sposób, który pomaga zmienić zawartość wewnątrz funkcji? :

remove_action(
    'woocommerce_before_shop_loop', 
    array('WC_List_Grid', 'gridlist_toggle_button'), 
    30 
); 

Zauważ, że uzywasz priorytet 100

EDIT

I okazało się, że do_action('woocommerce_archive_description') dzieje w archive-product.php aw wc-template-functions.php tuż przed woocommerce_before_shop_loop działań hakowych są wykonywane w wtyczce. Spróbuj użyć tego:

function remove_plugin_actions(){ 
    global $WC_List_Grid; 
    remove_action('woocommerce_before_shop_loop', array($WC_List_Grid, 'gridlist_toggle_button'), 30); 
} 
add_action('woocommerce_archive_description','remove_plugin_actions'); 
+0

Proszę przejrzeć moje zaktualizowane pytanie. I już wypróbowałem tę metodę i ona też nie działa. –

+0

Czy próbowałeś z priorytetem 30 lub 100? Czy próbowałeś bez żadnego priorytetu? –

+0

Próbowano z wszystkimi, 30 i 100 i bez priorytetu. Myślę, że twój punkt "Wtyczki są ładowane przed funkcjami.php" jest powodem. Ponieważ próbuję zablokować wyjście z gridlist_toggle_button. Ale jak już sugerowałeś, jeśli wtyczki ładują się przed functions.php, to ta funkcja jest już wywoływana i dlatego zawsze pokazuje wynik. –

Powiązane problemy