web-dev-qa-db-fra.com

Changer l'ordre de chargement des plugins

J'écris un plugin, bar , qui dépend d'un autre plugin, foo , activé, et j'ai besoin que les fonctions de foo soient disponibles lorsque bar charges. Normalement, les plugins sont chargés dans l'ordre alphabétique en fonction du nom du répertoire. Par conséquent, bar est chargé avant foo . Si je renomme le répertoire bar en zbar , il est chargé en dernier et fonctionne bien, mais je recherche une solution plus élégante et plus correcte.

J'ai suivi la méthode de jsdalton pour modifier l'option active_plugins , et il réordonne le tableau pour placer bar à la fin, mais bar ne peut toujours pas accéder à foo fonctionne lorsqu'il instancie. J'ai lu le code principal pertinent - en gros wp-settings.php et wp_get_active_and_valid_plugins() dans wp-includes\load.php - et il semble que les plugins devraient être chargés dans l'ordre dans lequel ils sont indexés dans active_plugins, donc je ne peux pas comprendre ce qui ne va pas.

Ceci est sur une installation MultiSite. bar est une classe et toto est procédural.

Voici une version simplifiée de foo/foo.php

function foo()
{
    // stuff
}

Et voici une version simplifiée de bar/bar.php

class bar
{
    public function __construct()
    {
        // ...

        $active_plugins = get_option('active_plugins');
        print_r($active_plugins);

        if( function_exists('foo') )
            wp_die("foo exists");
        else
            wp_die("foo doesn't exist yet");
        }
    }
}

function this_plugin_last() 
{
    $wp_path_to_this_file = preg_replace('/(.*)plugins\/(.*)$/', WP_PLUGIN_DIR."/$2", __FILE__);
    $this_plugin = plugin_basename(trim($wp_path_to_this_file));
    $active_plugins = get_option('active_plugins');
    $this_plugin_key = array_search($this_plugin, $active_plugins);

    if ($this_plugin_key) 
    {
        array_splice($active_plugins, $this_plugin_key, 1);
        array_Push($active_plugins, $this_plugin);
        update_option('active_plugins', $active_plugins);
    }
}
add_action("plugins_loaded", "this_plugin_last");

$bar = new bar();

Voici le résultat du constructeur de bar :

Array
(
    [0] => foo/foo.php
    [1] => bar/bar.php
)

foo doesn't exist yet
6
Ian Dunn

Ne touchez pas l’ordre de chargement, changez-le plutôt. Vous trouverez un exemple de travail dans cette réponse .

2
fuxia

Quoi qu'il en soit, votre constructeur de bar sera toujours exécuté avant que l'action ne soit appelée dans votre code.

J'ai couru dans ce scénario il y a quelque temps, et vous êtes principalement là pour la façon dont je l'ai fait.

Tout simplement - commentez tout dans la fonction this_plugin_last, et mettez votre $ bar = new bar (); à l'intérieur là-bas. et faites juste toute la logique et tout ce dont vous aviez besoin dans cette fonction aussi. cela garantit que foo sera chargé avant que vous n'exécutiez votre code (le plugin lui-même n'a pas nécessairement besoin d'être chargé avant, juste ce que vous utilisez qui repose sur foo).

5
Mike

Ajoutez ce qui suit en haut du code du plugin dépendant, sous le nom du plugin, sa description, etc.:

require_once( WP_PLUGIN_DIR . '/foo/foo.php' );

Le plugin "foo" n'aura même pas besoin d'être activé pour que "bar" trouve le code.

1
danblaker