web-dev-qa-db-ja.com

プラグインの更新を強制する: "Update Failed:プラグインの更新に失敗した。"更新後のプラグイン

私は自分のサイトで私がEDDでホストしている他のプラグインのために何らかの強制的なアップデートチェックをする必要があるプラグインを開発しているので、私はこのUIを持っていました:

enter image description here 

そして、ユーザーが Update ボタンをクリックすると、私のサイトにAPIリクエストを送り、そのプラグインに新しいバージョンがあるかどうかを判断します。新しいバージョンがある場合は、一時的にプラグインデータを保存します。

その後、ユーザーはPluginsページに行き、トランジェントに保存したばかりのデータを使用して、 EDD_SL_Plugin_Updater クラスを使用してパッケージダウンロードとプラグインに関する詳細情報を取得し、強制的に実行します。 update_pluginsサイトトランジェントをリセットしてチェックを更新します。

$modules_to_update = ! $this->update_plugins ? $this->current_modules->modules : $this->update_plugins;

array_walk( $modules_to_update, array( $this, 'check_plugins_updates' ) );

private function check_plugins_updates( $module_data, $module_name ) {
   $plugin_constants = parent::get_plugin_constants_values( $module_name );

   if ( $this->update_plugins ) {
      new WPB_EDD_SL_Plugin_Updater( $this->current_modules->api_url, $plugin_constants['basename'], $module_data );

            /**
             * Reset the "update_plugins" site transient,
             * so it can do a force check plugin update.
             *
             * This is extremely necessary, because WordPress check
             * plugins after hours or even minutes, sometimes.
             */
            set_site_transient( 'update_plugins', '' );

            return;
        }
  }

これですべて問題ありません。プラグインの更新を取得します(この図では、両方のプラグインの[更新]ボタンをクリックしています)。

enter image description here 

その後、ユーザーは1つのプラグインを更新し、それをエラーなしで正しく更新します。しかし、ユーザーが別のプラグインを更新しようとすると、 WP Bullet Assets Manager としましょう。エラーになります。

Update Failed: Plugin update failed.

そして開発者コンソールでは言う:

The plugin is at the latest version.

そしてこれはAJAX更新に対する応答です:

enter image description here 

ただし、たとえばContact Form 7などのユーザー更新によって正しく更新された場合。

また、upgrader_process_completeサイトの一時的な設定を再度行うにはupdate_pluginsアクションフックを使用する必要があります。そうしないと、もう一方の更新は消えます。

ここで良いことは、1つのプラグインが更新された後にプラグインページを更新すると、他のプラグインは通常どおりに更新されることです。

だから、私はそこに立ち往生しています。

また、私はupdate_pluginsの一時的なコンテンツをチェックしました、そしてすべてがうまくいったとき、それは私にこれを示していることに気づきます:

enter image description here 

しかし、1つのプラグインを更新した後、これを私に見せるだけです:

enter image description here 

あなたはここで一時的な内容をチェックすることができます:

良いもの: https://www.unserialize.com/jp/41cddcdd-bd49-9de9-330e-000062c8267b

悪いもの: https://www.unserialize.com/jp/364b6ebe-e29b-4fc8-4360-0000723d32b8

誰かが私がやりたいような何かを作成しましたか?本当に感謝します。

御時間ありがとうございます。 :)

1
Roel Magdaleno

私は自分の問題を解決したので、EDDを使用して強制的に更新を強制することに関して同じことを達成したい人のために、これが解決策です(少なくとも私のために働いた):

まず第一に、あなたがプラグインページを通してプラグインを更新するとき、それはAJAXを通して行われます、それで私は/wp-admin/includes/ajax-actions.phpファイルを読んで、そしてwp_ajax_update_plugin()関数の中でそれがwp_update_plugins()関数を実行しているのを見つけました。 update_plugins site transientを上書きします。

この時点で、私は自分のフィルタが実行されていると思ったが、いいえ、それはcurrent_screenアクションの中でそれらのフィルタを実行していたことであり、そしてwp_update_plugins()関数がwp_ajax_update_plugin()から呼ばれたとき、それを聞いていません。

だから私は新しいフィルタを作成し、私のクラスが呼び出されたときにそれらを実行しなければならなかった。

それで問題は解決しました。あなたがこれが役に立つとわかることを願っています。

1
Roel Magdaleno