Rimuovere un'azione da un plugin su un altro plugin
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.
Ci sono due aspetti che confondono le persone quando cercano di rimuovere un hook:
- Le chiamate
remove_action()
oremove_filter()
devono avvenire dopo le chiamateadd_action()
oadd_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. - Le chiamate
remove_action()
oremove_filter()
devono avere la stessa priorità della chiamataadd_action()
oadd_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.

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

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:
- Rinominare il tuo plugin in modo che venga caricato dopo il plugin effettivo.
- 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.

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

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.
