5

私の夢は、一連のプラグインがインストールされているかどうかを確認し、インストールされていないプラグインをインストールする php ファイルをテーマに含めることです。テーマの依存関係のセットのようなものですが、テーマ開発をパッケージ化して優れたプラグインのセットを含める良い方法でもあります。

私の質問...

  1. このようなものは存在しますか?
  2. テーマフォルダ内の単一のphpファイルから達成することは可能ですか?
  3. このアプローチに明らかな落とし穴や問題はありますか?
  4. これを達成するにはどうすればよいですか?
    • テーマ フォルダ内からインストールされているプラ​​グインを列挙することは可能ですか?
    • プラグイン ファイルをダウンロードして plugins フォルダに配置することはできますか?
    • テーマディレクトリ内からプラグインを有効にすることはできますか?
4

2 に答える 2

19

2018 年 7 月 6 日編集:この回答に出くわした場合、以下で強調表示されているコードは非常に古く、安全ではないため、ローカル サーバーでの実験以外では使用しないでください。プラグイン管理のためのより最新のソリューションを探している場合は、Composer と Bedrockを介して Wordpress をインストールすることを検討してください。


特定のプラグインの存在をプログラムで確認したり、テーマ ファイル内からそれらをダウンロード、インストール、アクティブ化したりしないことをお勧めします。特定のページが読み込まれるたびにチェックが実行されることを考慮する必要があり、多くの余分なコードや不要なアクティビティが発生する可能性があります。

代わりに、テーマが依存するプラグインは、プラグインとしてではなく、テーマ自体の一部としてパッケージ化することをお勧めします。プラグインは、ユーザーの裁量でインストールする必要があります。テーマが正しくまたは効率的に機能するためにプラグインに依存している場合は、テーマ自体と一緒にパッケージ化してダウンロードする必要があります。

しかし、あなたの質問に直接答えるには:

  1. おそらく。それは確かに可能です。
  2. はい。
  3. 上記を参照してください。プラグインを常にチェックし、必要なすべてを含めるのではなく、それらの条件に基づいて一連のアクションを実行すると、さらに多くの問題が発生する可能性があります.
  4. たくさんの研究

    • おそらく
    • はい
    • はい

ただし、PLUGIN の目的は、特定のテーマの機能を拡張するオプションをユーザーに提供することです。テーマの機能が既存のプラグインに依存している場合は、誰かがテーマをダウンロードするときに、本当にすべてのファイルを含める必要があります。

あなたのアプローチが、私が見逃しているかもしれない方法であなたのテーマに利益をもたらすと感じた場合は、好きなように自由に書いてください。

完全な回答:私は退屈で好奇心旺盛だったので、概念実証の作成を支援することにしました。これの多くは自明です。次の関数を追加します。

function mm_get_plugins($plugins)
{
    $args = array(
            'path' => ABSPATH.'wp-content/plugins/',
            'preserve_zip' => false
    );

    foreach($plugins as $plugin)
    {
            mm_plugin_download($plugin['path'], $args['path'].$plugin['name'].'.zip');
            mm_plugin_unpack($args, $args['path'].$plugin['name'].'.zip');
            mm_plugin_activate($plugin['install']);
    }
}
function mm_plugin_download($url, $path) 
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $data = curl_exec($ch);
    curl_close($ch);
    if(file_put_contents($path, $data))
            return true;
    else
            return false;
}
function mm_plugin_unpack($args, $target)
{
    if($zip = zip_open($target))
    {
            while($entry = zip_read($zip))
            {
                    $is_file = substr(zip_entry_name($entry), -1) == '/' ? false : true;
                    $file_path = $args['path'].zip_entry_name($entry);
                    if($is_file)
                    {
                            if(zip_entry_open($zip,$entry,"r")) 
                            {
                                    $fstream = zip_entry_read($entry, zip_entry_filesize($entry));
                                    file_put_contents($file_path, $fstream );
                                    chmod($file_path, 0777);
                                    //echo "save: ".$file_path."<br />";
                            }
                            zip_entry_close($entry);
                    }
                    else
                    {
                            if(zip_entry_name($entry))
                            {
                                    mkdir($file_path);
                                    chmod($file_path, 0777);
                                    //echo "create: ".$file_path."<br />";
                            }
                    }
            }
            zip_close($zip);
    }
    if($args['preserve_zip'] === false)
    {
            unlink($target);
    }
}
function mm_plugin_activate($installer)
{
    $current = get_option('active_plugins');
    $plugin = plugin_basename(trim($installer));

    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 true;
    }
    else
            return false;
}

...そして、次のように実行します。

$plugins = array(
    array('name' => 'jetpack', 'path' => 'http://downloads.wordpress.org/plugin/jetpack.1.3.zip', 'install' => 'jetpack/jetpack.php'),
    array('name' => 'buddypress', 'path' => 'http://downloads.wordpress.org/plugin/buddypress.1.5.5.zip', 'install' => 'buddypress/bp-loader.php'),
    array('name' => 'tumblr-importer', 'path' => 'http://downloads.wordpress.org/plugin/tumblr-importer.0.5.zip', 'install' => 'tumblr-importer/tumblr-importer.php')
);
mm_get_plugins($plugins);

「名前」は、一時的な値として機能するため、何でもかまいません。「パス」はまさにそれがどのように見えるかであり、Wordpress サーバー上の zip ファイルへの直接 URL です。「インストール」値は、すべてのプラグイン情報を含むメイン PHP スクリプトへの単純なパスです。この情報を入力するには、その特定のプラグイン ディレクトリのレイアウトを知っている必要があります。これはアクティベーション ハックが機能するためにも必要です。

アクティベーション関数はここにあります (sorich87 のクレジット): https://wordpress.stackexchange.com/questions/4041/how-to-activate-plugins-via-code

警告:これは決して非常に安全な方法ではありません。実際、これは非常に簡単に悪用される可能性があると思うので、これをベースラインとして使用し、そこから改善を試みることが最善の策です。

このアプローチを使用することを決定した場合、私が尋ねるのは、最初の全体的なスクリプトと、彼のアクティブ化プロセスの sorich87 の功績が認められていることだけ です

2018 年 7 月 6 日編集:真剣に、これをしないでください。今日の基準では、このコードはホット ガベージです。プラグインの管理はComposer と Bedrockを介して行う必要があります。

于 2012-04-27T16:24:34.023 に答える