web-dev-qa-db-ja.com

Wordpressのアップデートプラグインフック/アクション? 3.9以降

私はこれを数回調べました、それでも私の検索はカスタムコードを除いてあまり明らかにしません。

最新リリース(WordPress 3.9 "Smith")の時点で、 プラグインのアップデートプロセスにフックが追加されましたか? それは非常に基本的なニーズであると私は聞いていますが、それでもコーデックスに追加されているとは思えません(まだ)。そうでない場合、開発者が採用している一般的かつベストプラクティスは何ですか?

編集:単に明確にするために、私はアクティベーションについて話しているのではなく、データベースに変更があった場合やそうでなければそれに対処することができる場合はそのように、更新について話しています。

11
user1915665

アクションが追加されたとは思いません。あなたは バージョンの詳細を見ることができます どんなバージョンでも追加された新しいアクションを見ることができます。

プラグインの更新時にコードを実行するWordPressの方法は、 ここ に記述されているものです。

アップグレードパスを処理する適切な方法は、必要なときにのみアップグレード手順を実行することです。理想的には、プラグインのデータベースオプションに「バージョン」を保存してから、コードにバージョンを保存します。それらが一致しない場合は、アップグレード手順を実行してから、コード内のバージョンと同じになるようにデータベースオプションを設定します。これがアップグレードを処理するプラグインの数です。これは、コアが同様に機能する方法です。

そしてコード例では ここ

function myplugin_update_db_check() {
    global $jal_db_version;
    if (get_site_option( 'jal_db_version' ) != $jal_db_version) {
        jal_install();
    }
}
add_action( 'plugins_loaded', 'myplugin_update_db_check' );
13
Milo

WordPress 3.9以降、upgrader_process_completeフックを使用できます。
参照 12 を参照

これがコード例です:

<?php 
/**
 * Plugin Name: Test plugin 1
 * Plugin URI: http://rundiz.com
 * Description: A very simple plugin for testing. This plugin do nothing.
 * Version: 0.1.8
 * Author: Vee Winch
 * Author URI: http://rundiz.com
 * License: MIT
 * License URI: https://opensource.org/licenses/MIT
 * Text Domain: test-plugin1
 * Domain Path: 
 */


$wppstp1_version = '0.1.8';


add_action('upgrader_process_complete', 'wppstp1_upgrade', 10, 2);// will working only this plugin activated.
function wppstp1_upgrade(\WP_Upgrader $upgrader_object, $hook_extra)
{
    global $wppstp1_version;

    if (is_array($hook_extra) && array_key_exists('action', $hook_extra) && array_key_exists('type', $hook_extra) && array_key_exists('plugins', $hook_extra)) {
        // check first that array contain required keys to prevent undefined index error.
        if ($hook_extra['action'] == 'update' && $hook_extra['type'] == 'plugin' && is_array($hook_extra['plugins']) && !empty($hook_extra['plugins'])) {
            // if this action is update plugin.
            $this_plugin = plugin_basename(__FILE__);

            foreach ($hook_extra['plugins'] as $each_plugin) {
                if ($each_plugin == $this_plugin) {
                    // if this plugin is in the updated plugins.
                    // don't process anything from new version of code here, because it will work on old version of the plugin.
                    file_put_contents(WP_CONTENT_DIR . '/test.txt', 'v'.$wppstp1_version."\r\n", FILE_APPEND); // you will always get the previous version even you update to the new version.
                    // set transient to let it run later.
                    set_transient('wppstp1_updated', 1);
                }
            }// endforeach;
            unset($each_plugin);
        }// endif update plugin and plugins not empty.
    }// endif; $hook_extra
}// wppstp1_upgrade


add_action('plugins_loaded', 'wppstp1_runUpdatedPlugin');
function wppstp1_runUpdatedPlugin()
{
    global $wppstp1_version;

    if (get_transient('wppstp1_updated') && current_user_can('manage_options')) {
        // if plugin updated and current user is admin.
        file_put_contents(WP_CONTENT_DIR . '/test-update-by-transient.txt', 'v'.$wppstp1_version."\r\n", FILE_APPEND);// you will always get the updated version here.

        // update code here.

        // delete transient.
        delete_transient('wppstp1_updated');
    }
}// wppstp1_runUpdatedPlugin

プラグインが更新されると、set_transient()関数を使用してタスクをdbに設定します。 upgrader_process_completeフックを呼び出している間に更新コードを追加することはお勧めできません。
次に、他の管理者ページにアクセスすると、plugins_loadedフックが機能し、更新コードが機能します。

アップデートフックを機能させるには、このプラグインをアクティブにする必要があります。
これはプラグインのアクティブ化には取り組んでいないので、プラグインをアクティブにするコードが必要な場合はregister_activation_hook()関数でコーディングする必要があります。

2
vee

アップグレードに固有のカスタムフック/関数を追加しないことを決定した議論 から、プラグインがアップグレードされるときに呼び出されるため、「ほとんどの人」(4年前)がregister_activation_hookを使用しているように聞こえます管理ページから;それ以来私が見たほとんどの例は、その傾向に従っています。

ほとんどの使用法では、plugins_loadedをフックしないことをお勧めします。ページをロードするたびに呼び出されるためです。この例外は議論で言及されています:WPにはプラグインが変更されたことを知るメカニズムがないため、FTP/SVN経由のアップグレードパスは「エッジケース」です。 前の回答 はより関連性が高い場合があります。

register_activation_hook を使用した「シンプルなフレームワーク」の例については、 https://Gist.github.com/zaus/c08288c68b7f487193d1 を参照してください。

2
drzaus