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


22

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

Ответы:


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

1
Как писал Рарст, это не очень «безопасно». Вы должны убедиться, что плагины, которые вы активируете таким образом, безопасны / не нарушат ваш сайт.
sorich87

10
Даже не совсем безопасно, но, черт возьми, если вы активируете их программно, вы должны знать, что делаете. ;-)
Дени де Бернарди

Безопасность в стороне - я имею в виду, это не часть вопроса, верно? - Мне нравится подход сорича, потому что он вызывает стандартные фильтры активации. Таким образом, плагины получают возможность запускать свои процедуры установки, если они есть.
Хакре

3
Это, по крайней мере, в последнее время, изобретает колесо. Я использовал встроенный activate_plugin(), и, кажется, работает так же.
Джейк

1
@SagiveSEO Это совершенно безопасно - похоже на то, как это делает WP, за исключением того, что требует ввода / утверждения пользователя и формирования одноразовых номеров и проверок для этих одноразовых номеров - просто вводит необходимые проверки для запуска этой функции где угодно - чтобы к ней нельзя было получить доступ извне (из и т. д.), и он не может быть вызван случайным образом.
unity100

13

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

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

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


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, так что будьте осторожны, используя это при сетевых установках.


Прошло много времени, но если вы помните, каков был неожиданный результат на этом?
Юнсал Коркмаз

Я полностью не помню. Я думаю, что это просто не сработало, и я делал вещи вручную, потому что у меня не было слишком много сайтов 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');

Итан, что не так с моим ответом?
Моушон

Несмотря на то, что публикация только кода - это нормально, для любого нового программиста, читающего ваш ответ, может быть сложно его интерпретировать. Таким образом, OP может лучше понять, как работает ваш код.
Итан Джинкс О'Салливан,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.