Elimină acțiunea din plugin pentru alt plugin

14 apr. 2016, 11:45:21
Vizualizări: 22.4K
Voturi: 9

Î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.

9
Comentarii

Nu există conceptul de plugin copil în WordPress!

Sumit Sumit
14 apr. 2016 11:51:29

Atunci Google m-a mințit! Voi actualiza titlul atunci

Alex Alex
14 apr. 2016 11:52:06

Super! Acum oferă mai multe detalii despre contextul în care sunt adăugate acțiunile, cum ar fi într-un constructor de clasă, direct într-un fișier sau vreo acțiune WordPress, de asemenea, acordă aceeași prioritate pentru eliminarea acțiunilor, de exemplu 15 și 20

Sumit Sumit
14 apr. 2016 11:56:04

Acțiunile sunt adăugate în constructorul plugin-ului (constructorul apelează o funcție numită 'includes', iar această funcție folosește "include_once" pentru fișierul cu toate hook-urile). Am încercat să mențin și prioritățile, dar nu a funcționat.

Alex Alex
14 apr. 2016 11:58:21

Doar o presupunere: plugin-ul afișează conținutul în zona rezervată pentru conținutul postărilor și paginilor? Acesta este de obicei cazul cu plugin-urile care lucrează cu propriile tipuri de postări personalizate pentru a asigura compatibilitatea cu diferite teme. Ai încercat să folosești the_content ca hook în loc de plugins_loaded?

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

Da, am încercat să folosesc the_content, dar nici asta nu funcționează

Alex Alex
14 apr. 2016 12:19:19

Deci, plugin-ul este încapsulat într-o clasă? În acest caz, poate fi necesar să accesezi mai întâi clasa cu global $pluginsClass și să o transmiți în interiorul acțiunii remove astfel: remove_action( 'sportspress_before_single_player', array( $pluginsClass, 'sportspress_output_player_details' ) );.

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

@LuisSanz Sunt încă începător cu WordPress, poți să-mi explici cum să accesez clasa plugin-ului?

Alex Alex
14 apr. 2016 13:24:00

Ei bine, am repornit serverul și acum funcționează.

Alex Alex
15 apr. 2016 11:28:38
Arată celelalte 4 comentarii
Toate răspunsurile la întrebare 3
0
18

Sunt două aspecte care îi încurcă pe oameni atunci când încearcă să înlăture un hook:

  1. Apelurile remove_action() sau remove_filter() trebuie să aibă loc după apelurile add_action() sau add_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.
  2. Apelurile remove_action() sau remove_filter() trebuie să aibă aceeași prioritate ca și apelurile add_action() sau add_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.

15 feb. 2017 20:56:00
1

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);
}
25 sept. 2016 11:18:10
Comentarii

A funcționat și pentru mine!

Jono Jono
21 sept. 2023 19:40:19
3

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:

  1. Redenumiți plugin-ul dvs. și încărcați-l după plugin-ul real.
  2. 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ă.

14 apr. 2016 12:24:50
Comentarii

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

Alex Alex
14 apr. 2016 13:21:43

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.

Sumit Sumit
14 apr. 2016 14:11:08

Dar aceasta este o practică proastă să redenumești un plugin pentru a-l face să ruleze după alt plugin, ar putea exista o altă metodă pentru a realiza acest lucru, așa cum a sugerat @brian-hellekin

Sagar Guhe Sagar Guhe
30 oct. 2019 10:09:29