Wordpress更新プラグインフック/アクション?3.9以降


15

私はこれを数回調査しましたが、私の検索では、WordPressの良い習慣であるかどうかにかかわらず、カスタムコード以外はあまり明らかになりません。

最新リリース(WordPress 3.9 "Smith")の時点で、プラグインの更新プロセスにフックが追加されていますか?それは非常に基本的な必要性があるので私は尋ねていますが、まだコーデックスに追加されていないようです。そうでない場合、開発者が採用する一般的なベストプラクティスは何ですか?

編集:明確にするために、私はアクティブ化について話しているのではなく、データベースに変更があった場合やそれ以外の場合は対処できるように、更新について話している。



@drzausの回答は、良い習慣がない場合に限ります。
Rens Tillmann、2016

@RensTillmannはとにかくこれが2年古くなっていることから、リンクされたq / aは基本的に同じ答えを持っていますが、この質問より2年前に先行しているため、「重複」しています。
drzaus 16

回答:


15

アクションが追加されたとは思いません。あなたはできるバージョンの詳細を見て、どのバージョンのためと追加された新しいアクションを参照してください。

プラグインの更新時にコードを実行する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' );

ありがとうございます。その方法を使用します。WPはこのためのアクションを本当に追加する必要があります:D
user1915665

8
技術的にはを使用することになっています。register_activation_hookほとんどの場合、管理者がプラグインを更新するたびにプラグインが非アクティブ化/アクティブ化されるためです。フッキングするplugins_loadedことはすべてのページの読み込み(フロントエンドを含む)でチェックを行います。そこ導入についての話でしたregister_update_hookが、それをしてWONTFIXとしてマークされ、しばらく前に。そこでの議論は役に立ちます。
drzaus 2014

4
プラグインの一括更新ではアクティベーションフックが実行されないことを理解しておくことが重要です。ただし、3.9.2では実行しないでください。「一括更新」とは、ダッシュボードの更新ページから行われる更新を意味します。プラグインページ内から行われた個々の更新は、フックを正常に実行します。
ブライアンC

4
プラグインはFTP経由でも更新できるので、どのような場合でもフックは起動されません。そのため、データベースに保存されているオプションに頼る必要があります。
キリン

4
@giraffのコメントを拡張すると、SVNやGitのようなソース管理でコードを管理する人々にも同じことが言えます。そのため、この回答アップグレードを処理するための最良の方法です。
doublesharp

3

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

ほとんどの使用法ではplugins_loaded、ページが読み込まれるたびに呼び出されるため、をフックしないことをお勧めします。この例外は議論に記載されている:FTP / SVN経由でアップグレードパスは「エッジケース」であり、WPは、その場合にはプラグインが変更されたことを知っているためのメカニズム、持っていないため、以前の答えは、より適切かもしれませんが。

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


register_activation_hookアップデートでの実行は保証されていません。make.wordpress.org
core /

非常に-使用しないでくださいplugins_loaded-すべてのロードを実行し、負担が大きく/遅くなる可能性があります。
random_user_name

3

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()関数を使用してタスクがデータベースに設定されます。upgrader_process_completeフックの呼び出し中に更新コードを追加することはお勧めしません。
次に、他の管理ページにplugins_loadedアクセスすると、フックが機能し、更新コードがそこで機能します。

更新フックを機能させるには、このプラグインをアクティブにする必要があることに注意してください。
これはプラグインのアクティブ化では機能しないため、プラグインのアクティブ化でregister_activation_hook()機能するコードが必要な場合は、関数でコード化する必要があります。

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