Perché activ_plugin non funziona in register_activation_hook


10

Sto provando ad attivare automaticamente il secondo plug-in durante l'attivazione del primo plug-in.

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

Non funziona all'interno di register_activation_hook .. Funziona se lo uso direttamente come:

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

Come posso ripararlo? Grazie per l'aiuto

Soluzione:

Sto usando questo per me stesso ora:

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

Ho letto male il tuo post in origine. Devo dire che è formattato correttamente. Questa funzione è nel principale del tuo plugin?
— Chris,

Solo un secondo. Devo modificare il mio post.
— Chris,

sì, è nel primo plugin che cerca di attivare il secondo plugin .. il secondo plugin è ciao.php come esempio
— Ünsal Korkmaz

Risposte:


8

Per una spiegazione completa di ciò che sta accadendo, consulta questo post (questo serve per disattivare i plug-in, ma il problema è lo stesso).

Una breve spiegazione: i plug-in vengono attivati ​​essenzialmente aggiungendoli all'array di pug-in attivi memorizzati nel database. Quando si attiva il primo plug-in, WordPress recupera l'array di tutti i plug-in attualmente attivi, aggiunge il plug-in (ma non aggiorna ancora il database) e quindi esegue il callback dell'installazione.

Questo callback di installazione esegue il tuo codice.

Successivamente, WordPress aggiorna il database con l'array sopra, che contiene il primo ma non il secondo plug-in. Pertanto il secondo plug-in sembra non essere attivato.

Soluzione: ha menzionato nel link sopra la soluzione è qualcosa del genere (non testato):

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

Se hai tempo, modifico la mia domanda per scrivere quello che sto usando ora. Puoi vedere activ_plugin ($ dipendente); non funziona quando si attiva il plugin. Qualche idea su come risolverlo?
— Ünsal Korkmaz,

Copia del codice in un plug-in di test (e creazione di un altro hello.phpplug-in di test di test - per me funziona benissimo). Ricorda che se i plug-in esistono in una sottodirectory, dovrai fornire la cartella: ad es hello/hello.php.
— Stephen Harris,

il mio codice funzionerà normalmente .. il problema inizia quando si cambia activate_plugin('hello.php');riga conactivate_plugin($dependent);
— Ünsal Korkmaz

Questo perché la variabile fornita al callback non è hello.phpma l'array dei plug-in attualmente attivi. Non è possibile passare le proprie variabili a callback come quello. A meno che tu non usi variabili di classe / globali che dovrai usare activate_plugin('hello.php');. Ma questo non dovrebbe essere un problema ...?
— Stephen Harris,

beh, non mi piace scrivere le stesse variabili in molti posti. ma non è un grosso problema. grazie mille
— Ünsal Korkmaz,

2

Ecco qualcuno che spiega perché non funzionava per lui e come doveva copiare il metodo activ_plugin e crearne uno personalizzato senza il problema: /programming/1415958/how-to- activate-wordpress-plugin-internamente

Ecco la fonte originale del codice activ_plugin, che puoi usare per creare la tua funzione e vedere dove non funziona per te: http://hitchhackerguide.com/2011/02/11/activate_plugin/

Ecco una possibile soluzione, contenente un metodo di attivazione plug-in alternativo che probabilmente qualcun altro ha sottratto al codice sorgente: Come attivare i plug-in tramite codice?


quella soluzione non funziona ancora in register_activation_hook
— Ünsal Korkmaz

Bene per fortuna, ora che hai il tuo metodo per attivare un plugin, dovresti essere in grado di eseguire il debug e capire dove sta fallendo, giusto? :) Hai modificato register_activation_hook per utilizzare il tuo metodo activ_plugin personalizzato invece di quello predefinito? In tal caso, inserisci alcune istruzioni trigger_error e scopri dove sta fallendo. Ad esempio, un buon punto di partenza sarebbe scoprire quale metodo verrà restituito in caso di errore.
— mltsy,

Ho fatto del mio meglio per il debug ma non sono riuscito a trovare la ragione. Forse l'opzione active_plugins sta ottenendo l'aggiornamento dopo l'esecuzione di register_activation_hook.
— Ünsal Korkmaz,

Mi dispiace, ho appena corretto l'ordine dei due collegamenti che avevo scambiato (gli ultimi due). Stai utilizzando il codice dal link intitolato "Come attivare il plug-in tramite codice?" Un altro suggerimento utile da fornire sarebbe il valore di ritorno del activate_pluginmetodo predefinito . È possibile utilizzare trigger_errorper trovare il valore restituito e pubblicarlo qui.
— mltsy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.