プログラム的かつ自動的にWordPressプラグインをダウンロード、インストール、アクティブ化、置換する方法

公開: 2018-09-18

ユーザーに何かをさせるのは難しいです。 フォームに記入する場合でも、数回クリックするだけでも、固有の抵抗があります。 弱いパスワードを変更するなど、そのアクションがユーザーの利益になる場合でも、ユーザーはそれを実行しません。 同じことが、ユーザーに必要なプラグインをインストールさせる場合にも当てはまります。さらに悪いことに、アクティブなプラグインを新しいプラグインに置き換える場合も同様です。 それは不可能な境界ミッションです。

ありがたいことに、少しのコードとユーザーの同意があれば、WordPressプラグインをダウンロード、インストール、アクティブ化、非アクティブ化、さらには削除することができます。 この自動化されたプロセスは、責任を持って展開されると、ユーザーエクスペリエンスを大幅に向上させ、WordPress管理者で必要なユーザーアクションのコンバージョン率を高めることができます。

ユーザーに何かをさせるのは難しいです。 では、#WordPressプラグインを自動的にダウンロード、インストール、アクティブ化してみませんか? 数行のコードしか必要ありません。

クリックしてツイート

コードを介してプラグインをダウンロード、インストール、アクティブ化するのはなぜですか?

複数のシナリオがありますが、理論はさておき、WPリセットが手元にある状況を見てみましょう。 reset-wpをWPResetにリブランドすることについての投稿をすでに書きました。 他のものに加えて、このプロセスには、すでにreset-wpを使用しているユーザーがサイトから削除してから、WPResetをインストールすることが含まれます。 私たちが尋ねたからといって、なぜ誰かがそれをするのでしょうか? そして、彼らがそれをやりたいとしても、それが2回のクリックから遠く離れているので、彼らは気が進まないでしょう。 ただし、すべてを説明し、「はい、どうぞ、reset-wpをReset WPに置き換えてください」というボタンにまとめると、状況はそれほど悪くはありません。

許可なく人のサイトをいじらないでください! 限目。 たとえそれが「小さなこと」であったとしても。 それは、いけてないねえ。 それはあなたのサイトではありません。 プラグインを更新するとき、または新しい機能を追加するときに、変更をユーザーに通知します。

wp.​​orgのルールにより、ユーザーの行動を追跡することはできません(ユーザーの同意なしに、質問することを邪魔したくありませんでした)。残念ながら、共有する番号はありません。 しかし、私が言えることは、置換プロセスを実行した、またはプラグインで通知を見ただけのreset-wpユーザーからの苦情はなかったということです。 そして、私たちはこのプロセスを7週間以上実行しています。

これをしても大丈夫ですか? ユーザーは気にしますか?

ユーザーはきっとあなたが彼らの後ろですることすべてを気にするでしょう! そうしないでください! ユーザーの許可なしに何もしないでください。 特にプラグインがwp.orgでホストされている場合、それはルールに違反しているためです。 これを行うと、管理者はすぐにプラグインをリポジトリから削除します。

ただし、許可を求める場合は、「プラグインAをプラグインBに置き換えることはできますか? 確認してください。」 それならそうしても大丈夫です。 1つのプラグインを非アクティブ化して削除し、別のプラグインをダウンロードしてアクティブ化するプロセスには、数回以上のクリックが必要です。 したがって、そのプロセスを自動化し、ワンクリックに減らすことができれば、ユーザーは喜ぶでしょう。

テーマに必要なプラグインをアクティブ化する同様のプロセスが何年にもわたって行われており、ユーザーはそれで大丈夫です。 複数のリンクをたどってプラグインをインストールする代わりに、プロセスに問題がないことを確認し、ワンクリックで複数のプラグインをインストールします。

いつものように、必要なコードはごくわずかです。

擬似コードでは、これは私たちがやりたいことの一般的な考え方です。

// pseudo code only!
// DO NOT copy & paste

var $old_plugin;
var $new_plugin;

if ( is_plugin_installed( $new_plugin ) ) {
  // new plugin is already installed
  // make sure we have the last version
  upgrade_plugin( $new_plugin );
} else {
  install_plugin( $new_plugin );
}

if ( !is_plugin_active( $new_plugin ) ) {
  // new plugin is not active - activate it
  activate_plugin( $new_plugin );
}

// deactivate old plugin
deactivate_plugin( $old_plugin );

// if needed delete old plugin
delete_plugin( $old_plugin );

// pseudo code only!
// DO NOT copy & paste

それは非常に単純で簡単です。 ユーザーが適切なファイル権限を設定している限り、すべてがスムーズに進みます。 交換全体が完了するまでに1、2秒以上かかりません。

いくつかの関数が必要です

ありがたいことに、WordPressには、実行または半完了のいずれかで必要な機能のほとんどが含まれているため、物事をまとめる必要があります。

理解しておくべき重要な概念は、WordPressがプラグインを識別する方法、どのプラグインがどれであるかを知る方法です。 これは、プラグインのスラッグ(プラグインフォルダー名とメインのPHPファイルの組み合わせ)によって行われます。 例:hello-dolly/hello-dolly.php。 メインのPHPファイルは、プラグインヘッダーを含むファイルです。 スラッグを取得するには、 plugin_basename( __FILE__ )を実行します。 プラグインがアクティブであるかどうかを確認する必要がある場合、またはプラグインで何かを実行したい場合は、プラグインスラッグを使用する必要があります。 このスラッグはwp.orgのスラッグと似ていますが、同じではありません。 リポジトリでは、スラッグはファイル名を含まない単なるフォルダ名です。 つまり、ハロー・ドーリーにとっては「ハロー・ドーリー」です。 現時点では必要ありませんが、明確にする必要があります。 このやや紛らわしいトピックの詳細については、StackExchangeのこのスレッドを確認してください。

WordPressは、プラグインをスラッグ、つまりhello-dolly/hello-dolly.phpで識別します。 スラッグを取得するには、プラグインのメインファイルでplugin_basename( __FILE__ )を実行します。

is_plugin_active( $plugin_slug )が組み込まれているので、何もする必要はありません。 コーデックスページはそれほど余分なものを明らかにしていません、それは単純な関数です。

is_plugin_installed( $plugin_slug )は組み込まれていませんが、コーディングするのはほんの数行です。

function is_plugin_installed( $slug ) {
  if ( ! function_exists( 'get_plugins' ) ) {
    require_once ABSPATH . 'wp-admin/includes/plugin.php';
  }
  $all_plugins = get_plugins();
  
  if ( !empty( $all_plugins[$slug] ) ) {
    return true;
  } else {
    return false;
  }
}

これらはすべて、必要な条件付きのテスト機能です。 今何かをする人のために。 activate_plugin( )は組み込みであり、4つのパラメーターがあるので、Codexページを確認してください。

deactivate_plugins( $plugin_slug )もすぐに使用できますが、関数名の「s」(複数形)に注意してください。 それにもいくつかのパラメータがあるので、コーデックスのページを読んでください。

install_plugin( $plugin_zip )は、 Plugin_Upgraderクラスの一部として使用できます。 追加のコードは必要ありません。新しいクラスインスタンスだけです。 upgrade_plugin( $plugin_slug )についても同じことが言えます。

function install_plugin( $plugin_zip ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();

  $upgrader = new Plugin_Upgrader();
  $installed = $upgrader->install( $plugin_zip );

  return $installed;
}

function upgrade_plugin( $plugin_slug ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();

  $upgrader = new Plugin_Upgrader();
  $upgraded = $upgrader->upgrade( $plugin_slug );

  return $upgraded;
}

wp_cache_flush()は必要ないかもしれませんが、念のため追加しました。 実行に10ミリ秒かかることに加えて、害を及ぼすことはありません。

すべてを一緒に入れて

好奇心からではなく、プラグインにコードを実装する必要があるためにこの記事を読んでいる場合は、reset-wpプラグインをインストールすることを強くお勧めします。 コードについて読むのは良いことですが、実際のテストに匹敵するものはありません。

私の好みは、完全な管理GUIを必要としないほとんどすべてにadmin_actionを使用することです。 したがって、これを他のアクションとフィルターが追加される関数に追加しますadd_action( 'admin_action_replace_plugin', 'replace_plugin' ); 。 ユーザーがadmin.php?action = replace_pluginを開くと、コードが実行されます。 そのURLをハードコーディングしないでください。 次のようなものを使用します: $url = add_query_arg(array('action' => 'replace_plugin'), admin_url('admin.php')); 。 それはあなたのコード品質についてのボリュームを話します。

コピー/貼り付けできるコードは次のとおりです。 明らかに、上の3つの変数を自分の値で変更します。

function replace_plugin() {
  // modify these variables with your new/old plugin values
  $plugin_slug = 'wp-reset/wp-reset.php';
  $plugin_zip = 'https://downloads.wordpress.org/plugin/wp-reset.latest-stable.zip';
  $old_plugin_slug = 'reset-wp/reset-wp.php';
  
  echo 'If things are not done in a minute <a href="plugins.php">click here to return to Plugins page</a><br><br>';
  echo 'Starting ...<br><br>';
  
  echo 'Check if new plugin is already installed - ';
  if ( is_plugin_installed( $plugin_slug ) ) {
    echo 'it\'s installed! Making sure it\'s the latest version.';
    upgrade_plugin( $plugin_slug );
    $installed = true;
  } else {
    echo 'it\'s not installed. Installing.';
    $installed = install_plugin( $plugin_zip );
  }
  
  if ( !is_wp_error( $installed ) && $installed ) {
    echo 'Activating new plugin.';
    $activate = activate_plugin( $plugin_slug );
    
    if ( is_null($activate) ) {
      echo '<br>Deactivating old plugin.<br>';
      deactivate_plugins( array( $old_plugin_slug ) );
      
      echo '<br>Done! Everything went smooth.';
    }
  } else {
    echo 'Could not install the new plugin.';
  }
}
  
function is_plugin_installed( $slug ) {
  if ( ! function_exists( 'get_plugins' ) ) {
    require_once ABSPATH . 'wp-admin/includes/plugin.php';
  }
  $all_plugins = get_plugins();
  
  if ( !empty( $all_plugins[$slug] ) ) {
    return true;
  } else {
    return false;
  }
}

function install_plugin( $plugin_zip ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();
  
  $upgrader = new Plugin_Upgrader();
  $installed = $upgrader->install( $plugin_zip );

  return $installed;
}

function upgrade_plugin( $plugin_slug ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();
  
  $upgrader = new Plugin_Upgrader();
  $upgraded = $upgrader->upgrade( $plugin_slug );

  return $upgraded;
}

コードは、すでに説明したすべてを使用します。 GUIとメッセージは非常に基本的なものなので、reset-wpで行ったように、CSSを少し追加するか、ライトボックスにURLをロードします。

ユーザーにとって退屈でありふれたタスクを自動的に実行することは、#UXにとって常に大きなプラスです。 ワンクリックで複数の#WordPressプラグインを簡単にダウンロード、インストール、アクティブ化する方法をご覧ください。

クリックしてツイート

ワンクリックは常に10よりも優れています

ユーザーに10回ではなく1回クリックさせることは、常に前向きなことです。 これは、優れたUX(ユーザーエクスペリエンス)の兆候です。 したがって、プラグインまたはテーマに他のプラグインが必要な場合は、すべての依存関係に対してワンクリックのインストール手順を実装することをお勧めします。 プラグインの使用の初期段階では、間違いなく人々からのサポートチケットが少なくなります。

あるプラグインを別のプラグインに置き換えることに関しては、そのような状況に近づかないようにしてください。 やむを得ない場合もありますが、問題は、すべてのユーザーが新しいプラグインに切り替えることができないことです。つまり、2つのプラグインをサポートするか、古いプラグインを引き続き使用しているユーザーベースの一部を放棄して失望させる必要があります。 reset-wpでも同じ決定に直面し、これら2つのソリューションのどちらも好きではありません