wake-up-neo.net

Entfernen Sie die Aktion aus dem Plugin eines anderen Plugins

Ich versuche zwei der Aktionen zu entfernen, die ein Plugin hinzufügen (speziell Sportspress). Die Aktionen dieser Plugins sind:

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

Ich habe ein Plugin erstellt und möchte diese Hooks entfernen. Dies ist mein Code:

<?php
/*
Plugin Name: my plugin

Description: Plugin to override plugins' hooks
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' );
}

Ich habe viele Dinge gesucht und ausprobiert, aber ich kann es nicht zum Laufen bringen.

4
Doruko

Es gibt zwei Dinge, die die Leute verwirren, wenn sie versuchen, einen Haken zu entfernen:

  1. Die Aufrufe remove_action() oder remove_filter() müssen nach den Aufrufen add_action() oder add_filter()und erfolgen, bevor der Hook tatsächlich ausgelöst wird. Dies bedeutet, dass Sie den Hook kennen müssen, als die Aufrufe hinzugefügt wurden und, als der Hook ausgelöst wurde.
  2. Die Aufrufe remove_action() oder remove_filter() müssen dieselbe Priorität haben wie die Aufrufe add_action() oder add_filter()

Wenn diese Hooks mit der Standardpriorität zum Init-Filter hinzugefügt wurden, werden sie zum Entfernen einfach mit einer Priorität nach 10 in init eingebunden und entfernt.

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

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

Important: Um einen Hook zu entfernen, müssen die Argumente $ function_to_remove und $ priority beim Hinzufügen des Hooks übereinstimmen. Dies gilt sowohl für Filter als auch für Aktionen. Es wird keine Warnung ausgegeben bei fehlgeschlagener Entfernung.

6
Nathan Johnson

Plugins werden in der Reihenfolge ihrer Dateinamen geladen. z.B. Plugin mit dem Namen abc.php wird zuerst geladen, dann xyz.php. Wenn Sie also versuchen, eine Aktion aus dem Plugin abc.php zu entfernen, die in Plugin xyz.php hinzugefügt wurde, ist dies ohne Tweak nicht möglich. Da die Aktion zu dem Zeitpunkt noch nie hinzugefügt wurde, versuchen Sie, sie zu entfernen.

Sie können einfach eine die(__FILE__); in beide Plugins einfügen, um zu sehen, welche zuerst die Ausgabe wiedergibt. Wenn Ihr Plugin früher geladen wurde als Sie können zwei Dinge tun, um die Aktion zu entfernen

  1. Benenne dein Plugin um und lade es nach dem eigentlichen Plugin.
  2. Ich bin nicht sicher, wann übergeordnete Aktionen ausgeführt werden, aber es gibt eine lange Liste von Aktionen Action_Reference , an die Sie die Aktion zum Entfernen in Ihrem Plugin anhängen können. Jetzt wissen Sie, wann Sie remove_action() platzieren müssen, damit es wirksam wird.

Ich hoffe es hilft.

2
Sumit

Ich hatte das gleiche Problem. Ich wollte eine Aktion entfernen, die aus einem anderen Plugin stammt, und sie durch eine andere Funktion ersetzen, die ich in das von mir entwickelte Plugin geschrieben habe, aber mein Dateiname (wie @Sumit sagte) war nach der ursprünglichen Plugin-Datei in alphabetischer Reihenfolge. Trotzdem konnte ich die Aktion entfernen.

Was für mich funktionierte, war, meinen remove_action-Aufruf in eine andere add_action zu packen, um ihn nach dem Laden des Plugins auszuführen. Dies ist mit der Aktion init möglich:

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

P.S .: Wenn Sie sehen möchten, ob die Aktionen ordnungsgemäß entfernt wurden, können Sie die Funktionen, die mit der gewünschten Aktion verknüpft sind, mit dem Code aus dieser Antwort drucken. Ich habe einen Test-Shortcode verwendet, da ich nicht mit den Designdateien gearbeitet habe (fügen Sie einfach [test_actions] auf einer beliebigen Seite im WordPress-Bedienfeld hinzu).

add_shortcode('test_actions', 'testActions');
function testActions($attrs) {
    //get the list of all actions using this global variable
    global $wp_filter;

    //get only the actions hooked to 'my_action'
    $r = $wp_filter['my_action'];

    //return the array dump as a string
    return var_export($r, TRUE);
}
1
Brian Hellekin