Как активировать плагины с помощью кода?

22

Если возможно, как можно активировать установленные плагины (т.е. файлы были помещены в каталог wp-content / plugins) из других плагинов?

rsman
источник

Ответы:

30

Вот как я это сделал в некоторых веб-приложениях:

function run_activate_plugin( $plugin ) {
    $current = get_option( 'active_plugins' );
    $plugin = plugin_basename( trim( $plugin ) );

    if ( !in_array( $plugin, $current ) ) {
        $current[] = $plugin;
        sort( $current );
        do_action( 'activate_plugin', trim( $plugin ) );
        update_option( 'active_plugins', $current );
        do_action( 'activate_' . trim( $plugin ) );
        do_action( 'activated_plugin', trim( $plugin) );
    }

    return null;
}
run_activate_plugin( 'akismet/akismet.php' );
sorich87
источник
1
Как писал Рарст, это не очень «безопасно». Вы должны убедиться, что плагины, которые вы активируете таким образом, безопасны / не нарушат ваш сайт.
sorich87
10
Даже не совсем безопасно, но, черт возьми, если вы активируете их программно, вы должны знать, что делаете. ;-)
Дени де Бернарди
Безопасность в стороне - я имею в виду, это не часть вопроса, верно? - Мне нравится подход сорича, потому что он вызывает стандартные фильтры активации. Таким образом, плагины получают возможность запускать свои процедуры установки, если они есть.
Хакре
3
Это, по крайней мере, в последнее время, изобретает колесо. Я использовал встроенный activate_plugin(), и, кажется, работает так же.
Джейк
1
@SagiveSEO Это совершенно безопасно - похоже на то, как это делает WP, за исключением того, что требует ввода / утверждения пользователя и формирования одноразовых номеров и проверок для этих одноразовых номеров - просто вводит необходимые проверки для запуска этой функции где угодно - чтобы к ней нельзя было получить доступ извне (из и т. д.), и он не может быть вызван случайным образом.
unity100
13

Процесс активации плагина закодирован для работы с интерфейсом WP администратора. Он выполняет некоторые проверки, чтобы предотвратить включение плагинов с ошибками (загрузка при запуске может привести к поломке WP).

Он обрабатывается activate_plugin()функцией ( источником ), которая задокументирована как непригодная для использования в другом месте.

Поэтому, если вы хотите активировать плагин кодом, сама цель относительно проста - изменить active_pluginsвариант включения этого плагина. Но вам придется заново создавать связанные хуки активации с нуля, и вы рискуете взломать сайт, активировав его без шага песочницы.

Rarst
источник
7

Плагины хранятся в массиве в опции 'active_plugins'. Массив содержит путь к файлу для каждого активного плагина.

Чтобы активировать плагин, вам нужно определить, каким будет его путь, а затем передать этот путь activate_plugin($plugin_path).

Это легче сказать, чем сделать, и (по крайней мере, в 2.9) основной код не делает это легким.

Прежде чем вы сможете активировать_plugin (), вам нужно включить файл plugin.php из wp-admin / includes /. Вы также должны убедиться, что ваш плагин еще не активен. Результат выглядит примерно так (YMMV):

// Define the new plugin you want to activate
$plugin_path = '/path/to/your/new/plugin.php';
// Get already-active plugins   
$active_plugins = get_option('active_plugins');
// Make sure your plugin isn't active
if (isset($active_plugins[$plugin_path]))
    return;

// Include the plugin.php file so you have access to the activate_plugin() function
require_once(ABSPATH .'/wp-admin/includes/plugin.php');
// Activate your plugin
activate_plugin($plugin_path);

Я использую это в производственной среде в WP 2.9, и у меня не было никаких серьезных проблем, но в моем тестировании у него были очень неожиданные результаты с WPMU, так что будьте осторожны, используя это при сетевых установках.

jerclarke
источник
Прошло много времени, но если вы помните, каков был неожиданный результат на этом?
Юнсал Коркмаз
Я полностью не помню. Я думаю, что это просто не сработало, и я делал вещи вручную, потому что у меня не было слишком много сайтов MS.
Джеркларке
как мне это выполнить? если я просто выполню его напрямую, get_option не определено ...
Янус Троелсен
Добавьте это в functions.php, и оно должно работать, хотя даже тогда вы всегда должны помещать вещи в функции и подключать их к «init» или «wp».
Джеркларк
3

Wordpress предоставляет функцию для активации плагинов, согласно WP Codex

function plugin_activation( $plugin ) {
    if( ! function_exists('activate_plugin') ) {
        require_once ABSPATH . 'wp-admin/includes/plugin.php';
    }

    if( ! is_plugin_active( $plugin ) ) {
        activate_plugin( $plugin );
    }
}

plugin_activation('akismet/akismet.php');
Mowshon
источник
Итан, что не так с моим ответом?
Моушон
Несмотря на то, что публикация только кода - это нормально, для любого нового программиста, читающего ваш ответ, может быть сложно его интерпретировать. Таким образом, OP может лучше понять, как работает ваш код.
Итан Джинкс О'Салливан,
0

Вы можете просто вызвать функцию WordPress по умолчанию.

activate_plugin('akismet/akismet.php');

Пожалуйста, проверьте ссылку ниже для более подробной информации.

активировать плагин

Сохел Хан
источник