Как активировать плагины с помощью кода?
Вот как я это реализовал в некоторых веб-приложениях:
function run_activate_plugin( $plugin ) {
$plugin = trim( $plugin );
$current = get_option( 'active_plugins' );
$plugin = plugin_basename( $plugin );
if ( !in_array( $plugin, $current ) ) {
$current[] = $plugin;
sort( $current );
do_action( 'activate_plugin', $plugin );
update_option( 'active_plugins', $current );
do_action( 'activate_' . $plugin );
do_action( 'activated_plugin', $plugin );
}
return null;
}
run_activate_plugin( 'akismet/akismet.php' );

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

Вообще не безопасно, но, черт возьми, если вы активируете их программно, предполагается, что вы знаете, что делаете. ;-)

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

Это, по крайней мере в последнее время, изобретение велосипеда. Я использовал встроенную функцию activate_plugin()
, и, кажется, она работает так же.

Мне бы хотелось узнать, что именно небезопасно в этом коде, чтобы я мог это исправить, но в остальном это первое решение, которое сработало! Спасибо...

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

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

Процесс активации плагина закодирован для работы с интерфейсом администратора WordPress. Он выполняет проверки, чтобы предотвратить включение плагинов с ошибками (их загрузка при старте может сломать WordPress).
Это обрабатывается функцией activate_plugin()
(исходный код), которая в документации помечена как непригодная для использования в других местах.
Поэтому, если вы хотите активировать плагин через код, сама цель относительно проста - изменить опцию active_plugins
, чтобы включить этот плагин. Но вам придётся заново воссоздавать связанные хуки активации и вы рискуете сломать сайт, активируя плагин без этапа проверки в песочнице.

Плагины хранятся в массиве в опции 'active_plugins'. Этот массив содержит пути к файлам каждого активного плагина.
Для активации плагина необходимо определить его путь, а затем передать этот путь в функцию activate_plugin($plugin_path)
.
Однако это проще сказать, чем сделать, и (по крайней мере, в версии 2.9) исходный код ядра не упрощает эту задачу.
Перед использованием activate_plugin() необходимо подключить файл plugin.php из wp-admin/includes/. Также следует проверить, не активирован ли ваш плагин уже. В результате код будет выглядеть примерно так (результаты могут отличаться):
// Определяем новый плагин, который нужно активировать
$plugin_path = '/путь/к/вашему/новому/плагину.php';
// Получаем уже активные плагины
$active_plugins = get_option('active_plugins');
// Проверяем, не активирован ли ваш плагин уже
if (isset($active_plugins[$plugin_path]))
return;
// Подключаем файл plugin.php, чтобы получить доступ к функции activate_plugin()
require_once(ABSPATH .'/wp-admin/includes/plugin.php');
// Активируем ваш плагин
activate_plugin($plugin_path);
Я использую этот код в рабочей среде на WP 2.9 и не сталкивался с серьезными проблемами, но в тестах он давал очень неожиданные результаты с WPMU, поэтому будьте осторожны при использовании на сетевых установках.

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

Я совершенно не помню. Кажется, это просто не сработало, и я делал всё вручную, потому что у меня было не так много MS сайтов.

как выполнить это? если я просто запускаю напрямую, get_option не определена...

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

Вы можете просто вызвать стандартную функцию WordPress.
activate_plugin('akismet/akismet.php');
Подробнее смотрите по ссылке ниже.

Если вам известны названия плагинов, для их активации можно использовать функцию activate_plugin(). В примере ниже я использую её с хуком after_setup_theme, но вы можете изменить это в соответствии с вашими потребностями.
В этом примере я активирую плагин WooCommerce:
function activate_mytheme_required_plugins() {
if (!is_plugin_active('woocommerce/woocommerce.php')) {
activate_plugin('woocommerce/woocommerce.php');
}
}
add_action('after_setup_theme', 'activate_mytheme_required_plugins');
