Elimină acțiunea din plugin pentru alt plugin
Încerc să elimin două dintre acțiunile pe care le adaugă un plugin (specific sportspress). Acțiunile acestui plugin sunt:
add_action('sportspress_before_single_player','sportspress_output_player_details', 15);
add_action('sportspress_single_player_content','sportspress_output_player_statistics',20);
Am creat un plugin și vreau să elimin aceste hook-uri, acesta este codul meu:
<?php
/*
Plugin Name: plugin-ul meu
Description: Plugin pentru suprascrierea hook-urilor altor plugin-uri
Version: 0.1
Author: Numele Companiei
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' );
}
Am căutat și am încercat multe lucruri, dar nu reușesc să îl fac să funcționeze.
Sunt două aspecte care îi încurcă pe oameni atunci când încearcă să înlăture un hook:
- Apelurile
remove_action()
sauremove_filter()
trebuie să aibă loc după apelurileadd_action()
sauadd_filter()
, și înainte ca hook-ul să fie declanșat efectiv. Aceasta înseamnă că trebuie să cunoști momentul în care apelurile au fost adăugate și momentul în care hook-ul este declanșat. - Apelurile
remove_action()
sauremove_filter()
trebuie să aibă aceeași prioritate ca și apelurileadd_action()
sauadd_filter()
.
Dacă aceste hook-uri au fost adăugate pe filtrul init cu prioritatea implicită, atunci pentru a le elimina, pur și simplu trebuie să ne conectăm la init cu o prioritate mai mare decât 10 și să le eliminăm.
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 );
}
Preluat de la https://codex.wordpress.org/Function_Reference/remove_action
Important: Pentru a elimina un hook, argumentele $function_to_remove și $priority trebuie să corespundă cu cele folosite la adăugarea hook-ului. Acest lucru este valabil atât pentru filtre, cât și pentru acțiuni. Nu se va afișa nicio avertizare în caz de eșec la eliminare.

Am avut aceeași problemă. Am vrut să elimin o acțiune care vine de la un alt plugin și să o înlocuiesc cu o altă funcție pe care am scris-o în pluginul pe care îl dezvoltam, dar numele fișierului meu (cum a spus @Sumit) era după fișierul original al pluginului în ordine alfabetică. Cu toate acestea, am reușit să elimin acțiunea.
Ceea ce a funcționat pentru mine a fost să încapsulez apelul remove_action
în interiorul unei alte acțiuni add_action
pentru a o rula după încărcarea tuturor pluginurilor. Acest lucru este posibil prin utilizarea acțiunii init:
add_action( 'init', 'changeActions' );
function changeActions () {
remove_action('my_action', 'the_function_from_the_plugin', 10);
}
P.S.: Dacă doriți să verificați dacă acțiunile au fost eliminate corect, puteți afișa undeva funcțiile legate de acțiunea dorită folosind codul din acest răspuns. Am folosit un shortcode de test, deoarece nu lucram cu fișierele temei (doar adăugați [test_actions]
în orice pagină din panoul WordPress).
add_shortcode('test_actions', 'testActions');
function testActions($attrs) {
//obține lista tuturor acțiunilor folosind această variabilă globală
global $wp_filter;
//obține doar acțiunile legate de 'my_action'
$r = $wp_filter['my_action'];
//returnează dump-ul array-ului ca string
return var_export($r, TRUE);
}

Plugin-urile sunt încărcate în ordinea numelor fișierelor. De exemplu, plugin-ul cu numele abc.php
este încărcat primul, apoi xyz.php
. Așadar, dacă încercați să eliminați o acțiune din plugin-ul abc.php
care a fost adăugată în plugin-ul xyz.php
, acest lucru nu este posibil fără modificări, deoarece acțiunea nu a fost încă adăugată în momentul în care încercați să o eliminați.
Puteți plasa simplu un die(__FILE__);
în ambele plugin-uri pentru a vedea care afișează rezultatul primul. Dacă plugin-ul dvs. este încărcat mai devreme, puteți face două lucruri pentru a elimina acțiunea:
- Redenumiți plugin-ul dvs. și încărcați-l după plugin-ul real.
- Nu sunt sigur când rulează acțiunile părinte, dar există o listă lungă de acțiuni Action_Reference în care puteți conecta eliminarea unei acțiuni în plugin-ul dvs. Acum știți unde să plasați
remove_action()
pentru a o face eficientă.
Sper că vă ajută.

Am adăugat die
, iar primul plugin încărcat este "părintele", deci nu ar trebui să fie nicio problemă cu ordinea încărcării plugin-urilor

Da, atunci nu ar trebui să fie nicio problemă, elimină acțiunea plugins_loaded
și plasează direct remove_action
în plugin-ul tău cu aceeași prioritate, va funcționa conform structurii de cod pe care ai partajat-o.
