Как я могу предотвратить загрузку плагина при выполнении WP-CLI?

13

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

if ( defined( 'WP_CLI' ) && WP_CLI ) {
    exit;
}

Мне нужно сделать это, потому что этот плагин выдает ошибки и останавливает wp-cli для правильного выполнения, поэтому я не могу просто отключить плагин с помощью wp-cli, выполнить свои задачи и снова включить его.

Есть ли способ, которым я могу сделать что-то вроде if x then do not load plugin file xиз мю-плагина?

NextGenThemes
источник

Ответы:

13

Первое, что WordPress делает для загрузки плагинов, это получает активные плагины, сохраненные в базе данных:

$active_plugins = (array) get_option( 'active_plugins', array() );

Поскольку он использует, get_option()мы можем использовать option_active_pluginsфильтр для изменения списка активных плагинов на лету.

function wpse_301282_disable_plugin( $active_plugins ) {
    if ( defined( 'WP_CLI' ) && WP_CLI ) {
        $key = array_search( 'gravityforms/gravityforms.php', $active_plugins );

        if ( $key ) {
            unset( $active_plugins[$key] );
        }
    }

    return $active_plugins;
}
add_filter( 'option_active_plugins', 'wpse_301282_disable_plugin' );

Просто замените gravityforms/gravityforms.phpкаталог и имя файла плагина, который вы хотите отключить.

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

К счастью, WordPress имеет «Должны использовать плагины». Эти плагины можно добавлять, которые загружаются до и отдельно от обычных плагинов и не отображаются в списке обычных плагинов.

Все, что вам нужно сделать, чтобы добавить этот код в плагин Must Use, - это создать wp-content/mu-pluginsкаталог (если он еще не существует) и создать файл PHP (его можно вызывать как угодно) с этим кодом в нем. Вам не нужен заголовок плагина или что-то еще.

Теперь этот код будет загружен раньше всех других плагинов при загрузке WordPress. Поскольку наш фильтр работает, когда WordPress получит список активных плагинов для загрузки плагина, который вы хотите отключить, он будет отфильтрован из этого списка, если WP-CLI активен.

Джейкоб Питти
источник
Была такая же идея, но это не работает. По крайней мере, не в моем местном окружении. Может быть get_option(), возвращается рано, когда значение сохраняется в переходных / аналогичных и этот фильтр пропущен? (Не работает в большинстве случаев, только на экране плагина администратора он действительно был выполнен)
kero
Гектометр Глядя на источник и, насколько я могу судить, единственная причина, по которой option_фильтр не будет применен - ​​это то, что он не имеет значения и возвращает значение по умолчанию.
Джейкоб Питти
Это было на самом деле (плагины не активны). Я не должен держать свои тестовые среды слишком чистыми ..
kero
1
Я принял это, потому что в моем случае это то, что мне было нужно. Несмотря на то, что в общем случае --skip-plugin=xопция wp-cli может быть лучшим способом сделать это.
NextGenThemes
15

Вы можете использовать skip-pluginsопцию в WP-CLI, чтобы не загружать отдельные плагины при использовании WP-CLI.

Вы можете использовать его в команде так:

wp user list --skip-plugins=my-plugin

Или вы можете добавить это в свой wp-cli.ymlфайл:

skip-plugins:
- my-plugin
swissspidy
источник
-1

Просто переименование имени плагина dir отключит его. Я делаю это иногда, чтобы временно отключить плагин [linux]:

mv my-plugin-dir renamed-my-plugin-dir
Джон Ди
источник
ОП хотят пропустить плагин только при использовании WP-CLI, а не для каких-либо других действий, которые могут произойти в одно и то же время
Марк Каплун