Warum activate_plugin in register_activation_hook nicht funktioniert


10

Ich versuche, das zweite Plugin automatisch zu aktivieren, während ich das erste Plugin aktiviere.

register_activation_hook(__FILE__, 'example_activation' );
function example_activation() {
        include_once(ABSPATH .'/wp-admin/includes/plugin.php');
        activate_plugin('hello.php');
}

Es funktioniert nicht in register_activation_hook. Es funktioniert, wenn ich es direkt benutze wie:

include_once(ABSPATH .'/wp-admin/includes/plugin.php');
activate_plugin('hello.php');

Wie kann ich es reparieren? Danke für die Hilfe

Lösung:

Ich benutze das jetzt für mich:

// When this plugin activate, activate another plugin too.
register_activation_hook(__FILE__, function(){
    $dependent = 'hello.php';
    if( is_plugin_inactive($dependent) ){
        add_action('update_option_active_plugins', function($dependent){
            /* for some reason, 
            activate_plugin($dependent); 
               is not working */
            activate_plugin('hello.php');
        });
    }
}); 

// When this plugin deactivate, deactivate another plugin too.
register_deactivation_hook(__FILE__, function(){
    $dependent = 'hello.php';
    if( is_plugin_active($dependent) ){
        add_action('update_option_active_plugins', function($dependent){
            deactivate_plugins('hello.php');
        });
    }
}); 

Ich habe Ihren Beitrag ursprünglich falsch verstanden. Ich muss sagen, es ist richtig formatiert. Ist diese Funktion im Hauptteil Ihres Plugins?
Chris

Augenblick. Muss meinen Beitrag bearbeiten.
Chris

Ja, es ist im ersten Plugin, das versucht, das zweite Plugin zu aktivieren. Das zweite Plugin ist hello.php als Beispiel
Ünsal Korkmaz

Antworten:


8

Eine vollständige Erklärung der Vorgänge finden Sie in diesem Beitrag (dies dient zum Deaktivieren von Plug-Ins, das Problem ist jedoch dasselbe).

Eine kurze Erklärung: Plug-Ins werden im Wesentlichen aktiviert, indem sie dem Array der in der Datenbank gespeicherten aktiven Pug-Ins hinzugefügt werden. Wenn Sie das erste Plug-In aktivieren, ruft WordPress das Array aller derzeit aktiven Plug-Ins ab, fügt das Plug-In hinzu (aktualisiert die Datenbank jedoch noch nicht) und führt dann Ihren Installationsrückruf aus.

Dieser Installationsrückruf führt Ihren Code aus.

Danach aktualisiert WordPress die Datenbank mit dem obigen Array, das das erste, aber nicht das zweite Plug-In enthält. Somit scheint Ihr zweites Plug-In nicht aktiviert zu sein.

Lösung: hat im obigen Link erwähnt, dass die Lösung ungefähr so ​​ist (ungetestet):

//This goes inside Plugin A.
//When A is activated. activate B.
register_activation_hook(__FILE__,'my_plugin_A_activate'); 
function my_plugin_A_activate(){
    $dependent = 'B/B.php';
    if( is_plugin_inactive($dependent) ){
         add_action('update_option_active_plugins', 'my_activate_dependent_B');
    }
}

function my_activate_dependent_B(){
    $dependent = 'B/B.php';
    activate_plugin($dependent);
}

Wenn Sie Zeit haben, bearbeite ich meine Frage, um zu schreiben, was ich jetzt benutze. Sie können activ_plugin sehen ($ abhängig); funktioniert nicht beim Aktivieren des Plugins. Irgendeine Idee, wie man das behebt?
Ünsal Korkmaz

Kopieren Sie Ihren Code in ein Test-Plug-In (und erstellen Sie ein weiteres Test- hello.phpTest-Plug-In - das funktioniert für mich einwandfrei). Denken Sie daran, dass Sie, wenn die Plug-Ins in einem Unterverzeichnis vorhanden sind, den Ordner angeben müssen: z hello/hello.php.
Stephen Harris

Mein Code wird normal funktionieren. Das Problem beginnt, wenn Sie die activate_plugin('hello.php');Zeile mitactivate_plugin($dependent);
Ünsal Korkmaz

Dies liegt daran, dass die Variable, die Ihrem Rückruf zugewiesen wird, nicht hello.phpdas Array der derzeit aktiven Plug-Ins ist. Sie können Ihre eigenen Variablen nicht an solche Rückrufe übergeben. Sofern Sie keine Klassen- / globalen Variablen verwenden, müssen Sie diese verwenden activate_plugin('hello.php');. Aber das sollte kein Problem sein ...?
Stephen Harris

Nun, ich mag es nicht, die gleichen Variablen an vielen Stellen zu schreiben. aber es ist keine große Sache. Vielen Dank
Ünsal Korkmaz

2

Hier erklärt jemand, warum es bei ihm nicht funktioniert hat und wie er die Methode activate_plugin kopieren und ohne Probleme eine eigene erstellen musste: /programming/1415958/how-to- aktiviere-WordPress-Plugins-intern

Hier ist die ursprüngliche Quelle des Activate_plugin-Codes, mit dem Sie Ihre eigene Funktion erstellen und sehen können, wo sie für Sie nicht funktioniert: http://hitchhackerguide.com/2011/02/11/activate_plugin/

Hier ist eine mögliche Lösung, die eine alternative Plugin-Aktivierungsmethode enthält, die wahrscheinlich jemand anderes aus diesem Quellcode herausgeschnitten hat: Wie aktiviere ich Plugins über Code?


Diese Lösung funktioniert immer noch nicht in register_activation_hook
Ünsal Korkmaz

Nun, zum Glück, jetzt, da Sie Ihre eigene Methode zum Aktivieren eines Plugins haben, sollten Sie in der Lage sein, es zu debuggen und herauszufinden, wo es fehlschlägt, oder? :) Haben Sie Ihren register_activation_hook so geändert, dass anstelle der Standardmethode Ihre benutzerdefinierte Aktivierungsmethode verwendet wird? Wenn ja, geben Sie einige trigger_error-Anweisungen ein und finden Sie heraus, wo dies fehlschlägt. Ein guter Ausgangspunkt wäre beispielsweise, herauszufinden, was Ihre Methode zurückgibt, wenn sie fehlschlägt.
mltsy

Ich habe mein Bestes zum Debuggen versucht, aber ich konnte keinen Grund finden. Möglicherweise wird die Option active_plugins aktualisiert, nachdem register_activation_hook ausgeführt wurde.
Ünsal Korkmaz

Es tut mir leid, ich habe gerade die Reihenfolge der beiden Links festgelegt, die ich getauscht hatte (die letzten beiden). Verwenden Sie den Code aus dem Link "So aktivieren Sie das Plugin über Code?" Ein weiterer hilfreicher Hinweis wäre der Rückgabewert der Standardmethode activate_plugin. Sie können trigger_errorden Rückgabewert verwenden , um ihn hier zu veröffentlichen.
mltsy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.