Изменение сменного порядка загрузки

Я пишу плагин, панель, которая зависит от другого плагина, нечто, быть активированным, и мне нужны функции от нечто, чтобы быть доступным, когда панель загружается. Обычно плагины загружаются в алфавитном порядке на основе имени каталога, таким образом, панель загружается перед нечто. Если я переименовываю каталог панели к zbar затем, он загружается в последний раз и хорошо работает, но я ищу более изящное и правильное решение.

Я следовал методу jsdalton изменения active_plugins опция, и это переупорядочивает массив для размещения панели в конце, но панель все еще не может получить доступ к функциям нечто, когда это инстанцирует. Я прочитал соответствующий базовый код - в основном wp-settings.php и wp_get_active_and_valid_plugins() в wp-includes\load.php - и кажется, что плагины должны быть загружены в порядке, они индексируются внутри active_plugins, таким образом, я не могу выяснить то, что идет не так, как надо.

Это находится на установке MultiSite. панель является классом, и нечто является процедурным.

Вот упрощенная версия foo/foo.php

function foo()
{
    // stuff
}

И вот упрощенная версия 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();

Это - вывод от конструктора панели:

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

foo doesn't exist yet
6
13.05.2011, 17:35
3 ответа

Не касайтесь порядка загрузки, изменяйте порядок активации вместо этого. Рабочий пример может быть найден в этом ответе.

2
19.02.2020, 22:05

Независимо от того, что, будет всегда выполнять Ваш конструктор панели, прежде чем действие называют в Вашем коде.

Я столкнулся с этим сценарием некоторое время назад, и Вы главным образом там для того, как я сделал это.

Просто помещенный - комментируют все внутри this_plugin_last функция и помещают Ваш $bar = новая панель (); внутри там. и просто сделайте всю логику и этажерку, что Вы должны были в той функции также. это гарантирует, что нечто будет загружено перед выполнением кода (сам плагин должен не обязательно быть загружен перед рукой, что Вы используете, который полагается на нечто).

5
19.02.2020, 22:05

Добавьте следующее наверху зависимого сменного кода, ниже сменного имени, описания, и т.д.:

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

Плагин "нечто" не должен будет даже быть активирован, чтобы "панель" нашла код.

1
19.02.2020, 22:05
  • 1
    я думаю, что это - вид неаккуратного обходного решения, а не надлежащего решения. нечто придется активировать, чтобы использоваться, иначе поведение неинтуитивно для пользователя и берет на себя управление далеко от них. Плюс, действительно ли Вы уверены, что это не испортит вещи, когда Wordpress попытается загрузить плагин позже? Это wouldn' смочь потребовать файла, таким образом, это не смогло делать все служебные задачи, связанные с загрузкой плагина. –  Ian Dunn 27.05.2011, 17:27
  • 2
    Мое предположение было то, что разделение плагинов было для Вашего преимущества как разработчик/администратор сайта, и поэтому пользовательский элемент управления не важен. Иначе, почему бы не объединить нечто и панель в тот же плагин? FWIW, я в настоящее время использую это обходное решение на сайте CMS, где у меня есть несколько плагинов типа контента, которые расширяются, основное пользовательское сообщение вводят Класс. Без обходного решения, деактивируя "основной" плагин (случайно или иначе) удалил бы все "ведомые" плагины и большую часть контента сайта. –  danblaker 27.05.2011, 21:46
  • 3
    , извините если я не был ясен в вопросе. Плагин нечто не является одним моим, это - чужой, но я использую функциональность вместо изобретения велосипед. –  Ian Dunn 27.05.2011, 22:04
  • 4
    Спасибо за разъяснение! Я, очевидно, смотрел на Ваш вопрос через свою собственную линзу. –  danblaker 27.05.2011, 22:07

Теги

Похожие вопросы