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

14 нояб. 2010 г., 14:24:24
Просмотры: 51.4K
Голосов: 26

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

0
Все ответы на вопрос 6
8
34

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

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' );
14 нояб. 2010 г. 17:40:07
Комментарии

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

sorich87 sorich87
14 нояб. 2010 г. 17:46:29

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

Denis de Bernardy Denis de Bernardy
14 нояб. 2010 г. 21:45:43

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

hakre hakre
15 нояб. 2010 г. 00:38:45

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

Jake Jake
18 сент. 2013 г. 21:21:56

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

Sagive Sagive
3 июн. 2014 г. 01:24:47

В какой исходный файл это нужно вставить?

Janus Troelsen Janus Troelsen
25 авг. 2016 г. 13:16:08

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

unity100 unity100
24 окт. 2018 г. 04:38:27

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

maryisdead maryisdead
24 апр. 2020 г. 13:44:33
Показать остальные 3 комментариев
0
14

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

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

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

14 нояб. 2010 г. 14:55:57
4

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

14 нояб. 2010 г. 21:14:18
Комментарии

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

Ünsal Korkmaz Ünsal Korkmaz
25 авг. 2012 г. 13:59:53

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

jerclarke jerclarke
28 авг. 2012 г. 20:48:45

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

Janus Troelsen Janus Troelsen
25 авг. 2016 г. 12:45:34

Добавьте это в functions.php, и это должно сработать, хотя даже в этом случае лучше помещать вещи в функции и подключать их к "init" или "wp".

jerclarke jerclarke
26 авг. 2016 г. 17:57:41
2

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');
21 окт. 2016 г. 15:09:12
Комментарии

Этан, что не так с моим ответом?

Mowshon Mowshon
28 окт. 2016 г. 17:59:19

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

Ethan Rævan Ethan Rævan
29 окт. 2016 г. 00:32:55
0

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

activate_plugin('akismet/akismet.php');

Подробнее смотрите по ссылке ниже.

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

30 окт. 2019 г. 10:06:34
0

Если вам известны названия плагинов, для их активации можно использовать функцию 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');
11 окт. 2023 г. 20:19:50