コードを介してプラグインを有効にする方法


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
Rarstが書いたように、これはあまり「安全」ではありません。この方法でアクティブにするプラグインが安全であるか、サイトを壊さないことを確認する必要があります。
-sorich87

10
まったく安全ではありませんが、プログラムでアクティベートしている場合は、何をしているのかを知っているはずです。;-)
Denis de Bernardy

安全は別として-つまり、これは質問の一部ではありませんよね?-私はsorichのアプローチが好きです。なぜなら、それは標準のアクティベーションフィルターを呼び出すからです。そのため、プラグインはセットアップルーチンを実行するための変更を取得します。
-hakre

3
これは、少なくとも最近では、車輪の再発明です。組み込みのを使用しましたがactivate_plugin()、同じように動作するようです。
ジェイク

1
@SagiveSEO完全に安全-WPが行う方法と似ていますが、ユーザー入力/承認およびフォームナンスとそれらのナンスのチェックを必要とすることを除き、その機能をどこからでも開始するために必要なチェックを導入するだけで、外部から(ウェブなど)、およびそれをランダムに呼び出すことはできません。
unity100

13

プラグインのアクティベーションプロセスは、WP管理インターフェイスで動作するようにコーディングされています。エラーのあるプラグインの有効化を防ぐためにいくつかのチェックを実行します(起動時にロードするとWPが壊れる場合があります)。

他の場所では使用できないとして文書されているactivate_plugin()関数(source)によって処理されます。

したがって、コードでプラグインをアクティブにしたい場合、目標自体は比較的簡単active_pluginsです。そのプラグインを含めるようにオプションを変更します。ただし、関連するアクティベーションフックを最初から再作成する必要があり、サンドボックスステップなしでアクティベーションを行うとサイトが破損する危険があります。


7

プラグインは、「active_plugins」オプションの配列に保存されます。配列には、アクティブな各プラグインへのファイルパスが含まれます。

プラグインを有効にするには、そのパスを決定し、そのパスをに渡す必要がありますactivate_plugin($plugin_path)

しかし、これは言うよりも簡単であり、(少なくとも2.9では)コアコードでは簡単になりません。

activate_plugin()を実行する前に、wp-admin / includes /からplugin.phpファイルを含める必要があります。プラグインがまだアクティブになっていないことも確認する必要があります。結果は次のようになります(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サイトを持っていなかったので、私は手で物事をやった。
-jerclarke

これをどのように実行しますか?私はちょうどそれを直接実行した場合、get_optionは...定義されていません
ヤヌスTroelsen

これをfunctions.phpに追加すれば機能しますが、それでも関数に何かを入れて「init」または「wp」にフックする必要があります。
-jerclarke

3

WP Codexによると、Wordpressはプラグインをアクティブにする機能を提供します

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はコードがどのように機能するかをよりよく理解できます。
イーサンジンクスオサリバン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.