Rimuovere un'azione da un plugin su un altro plugin

14 apr 2016, 11:45:21
Visualizzazioni: 22.4K
Voti: 9

Sto cercando di rimuovere due azioni aggiunte da un plugin (nello specifico SportsPress). Le azioni di questo plugin sono:

add_action('sportspress_before_single_player','sportspress_output_player_details', 15);
add_action('sportspress_single_player_content','sportspress_output_player_statistics',20);

Ho creato un plugin e voglio rimuovere questi hook, questo è il mio codice:

<?php
/*
Plugin Name: my plugin

Description: Plugin per sovrascrivere gli hook dei plugin
Version: 0.1
Author: Company Name
Author URI: http://www.example.com/
License: GPL2
*/


add_action('plugins_loaded','remove_hooks');
function remove_hooks(){
    remove_action( 'sportspress_before_single_player', 'sportspress_output_player_details' );
    remove_action( 'sportspress_single_player_content', 'sportspress_output_player_statistics' );
}

Ho cercato e provato molte soluzioni, ma non riesco a farlo funzionare.

9
Commenti

Non esiste il concetto di plugin figlio in WordPress!

Sumit Sumit
14 apr 2016 11:51:29

Allora Google mi ha mentito! Aggiornerò il titolo allora

Alex Alex
14 apr 2016 11:52:06

Ottimo! Ora fornisci maggiori dettagli sul contesto in cui vengono aggiunte le azioni, ad esempio in un costruttore di classe, direttamente in un file o in qualche azione di WordPress, e assegna la stessa priorità per rimuovere le azioni, ad esempio 15 e 20

Sumit Sumit
14 apr 2016 11:56:04

Le azioni vengono aggiunte nel costruttore del plugin (il costruttore chiama una funzione chiamata 'includes', e questa funzione fa "include_once" del file con tutti gli hook). Ho anche provato a mantenere le priorità, ma non ha funzionato.

Alex Alex
14 apr 2016 11:58:21

Solo un'ipotesi: il plugin sta facendo l'output nell'area riservata al contenuto di post e pagine? Di solito è così con i plugin che lavorano con i loro custom post type per garantire compatibilità con diversi temi. Hai provato a usare the_content come hook invece di plugins_loaded?

Luis Sanz Luis Sanz
14 apr 2016 12:16:15

Sì, ho provato a usare the_content, ma non funziona comunque

Alex Alex
14 apr 2016 12:19:19

Quindi, il plugin è incapsulato in una classe? In tal caso potresti dover accedere prima alla classe con global $pluginsClass e passarla all'interno della remove action in questo modo remove_action( 'sportspress_before_single_player', array( $pluginsClass, 'sportspress_output_player_details' ) );.

Luis Sanz Luis Sanz
14 apr 2016 12:23:03

@LuisSanz Sono ancora un principiante con WordPress, potresti spiegarmi come accedere alla classe del plugin?

Alex Alex
14 apr 2016 13:24:00

Beh, ho riavviato il server e ora funziona.

Alex Alex
15 apr 2016 11:28:38
Mostra i restanti 4 commenti
Tutte le risposte alla domanda 3
0
18

Ci sono due aspetti che confondono le persone quando cercano di rimuovere un hook:

  1. Le chiamate remove_action() o remove_filter() devono avvenire dopo le chiamate add_action() o add_filter(), e prima che l'hook venga effettivamente eseguito. Ciò significa che devi conoscere l'hook quando le chiamate sono state aggiunte e quando l'hook viene eseguito.
  2. Le chiamate remove_action() o remove_filter() devono avere la stessa priorità della chiamata add_action() o add_filter().

Se questi hook sono stati aggiunti al filtro init con priorità predefinita, per rimuoverli basta agganciarsi a init con una priorità superiore a 10 e rimuoverli.

add_action( 'init', 'wpse_106269_remove_hooks', 11 );
function wpse_106269_remove_hooks(){
    remove_action( 'sportspress_before_single_player', 'sportspress_output_player_details', 15 );
    remove_action( 'sportspress_single_player_content', 'sportspress_output_player_statistics', 20 );
}

Da https://codex.wordpress.org/Function_Reference/remove_action

Importante: Per rimuovere un hook, gli argomenti $function_to_remove e $priority devono corrispondere a quando l'hook è stato aggiunto. Questo vale sia per i filtri che per le azioni. Non verrà mostrato alcun avviso in caso di fallimento della rimozione.

15 feb 2017 20:56:00
1

Avevo lo stesso problema. Volevo rimuovere un'azione proveniente da un altro plugin e sostituirla con un'altra funzione che avevo scritto nel plugin che stavo sviluppando, ma il nome del mio file (come ha detto @Sumit) era dopo il file del plugin originale in ordine alfabetico. Nonostante ciò, sono riuscito a rimuovere l'azione.

Ciò che ha funzionato per me è stato racchiudere la mia chiamata remove_action all'interno di un altro add_action per eseguirla dopo il caricamento di tutti i plugin. Questo è possibile utilizzando l'azione init:

add_action( 'init', 'changeActions' );
function changeActions () {
    remove_action('my_action', 'the_function_from_the_plugin', 10);
}

P.S.: Se vuoi verificare se le azioni sono state rimosse correttamente, puoi stampare da qualche parte le funzioni collegate all'azione che desideri utilizzando il codice di questa risposta. Ho usato uno shortcode di test, dato che non stavo lavorando con i file del tema (basta aggiungere [test_actions] in qualsiasi pagina all'interno del pannello di WordPress).

add_shortcode('test_actions', 'testActions');
function testActions($attrs) {
    //ottieni la lista di tutte le azioni usando questa variabile globale
    global $wp_filter;

    //ottieni solo le azioni collegate a 'my_action'
    $r = $wp_filter['my_action'];

    //restituisci il dump dell'array come stringa
    return var_export($r, TRUE);
}
25 set 2016 11:18:10
Commenti

Ha funzionato anche per me!

Jono Jono
21 set 2023 19:40:19
3

I plugin vengono caricati in ordine alfabetico in base ai nomi dei loro file. Ad esempio, un plugin con nome abc.php viene caricato prima di xyz.php. Quindi, se stai cercando di rimuovere un'azione dal plugin abc.php che è stata aggiunta nel plugin xyz.php, ciò non è possibile senza qualche modifica. Perché l'azione non è ancora stata aggiunta nel momento in cui stai tentando di rimuoverla.

Puoi semplicemente inserire un die(__FILE__); in entrambi i plugin per vedere quale mostra l'output per primo. Se il tuo plugin viene caricato prima, puoi fare due cose per rimuovere l'azione:

  1. Rinominare il tuo plugin in modo che venga caricato dopo il plugin effettivo.
  2. Non sono sicuro di quando vengano eseguite le azioni del genitore, ma c'è una lunga lista di azioni Action_Reference su cui puoi agganciare la rimozione dell'azione nel tuo plugin. Ora sai quando posizionare remove_action() per renderla efficace.

Spero sia utile.

14 apr 2016 12:24:50
Commenti

Ho aggiunto il die, e il primo plugin caricato è il "parent", quindi non dovrebbero esserci problemi con l'ordine di caricamento dei plugin

Alex Alex
14 apr 2016 13:21:43

Sì, allora non dovrebbero esserci problemi, rimuovi l'azione plugins_loaded e posiziona direttamente remove_action nel tuo plugin con la stessa priorità, funzionerà secondo la struttura del codice che hai condiviso.

Sumit Sumit
14 apr 2016 14:11:08

Ma questa è una cattiva pratica rinominare un plugin per farlo eseguire dopo un altro plugin, potrebbe esserci un altro modo per farlo accadere come suggerito da @brian-hellekin

Sagar Guhe Sagar Guhe
30 ott 2019 10:09:29