Wordpress Обновление Плагин Крюк / Действие? С 3.9

15

Я исследовал это несколько раз, но мой поиск не обнаружил ничего, кроме пользовательского кода, который может или не может быть хорошей практикой WordPress.

Начиная с последних выпусков (WordPress 3.9 "Smith"), добавлен ли хук в процесс обновления плагина? Я спрашиваю, потому что это очень основная потребность, но я не вижу, чтобы это добавлялось в кодекс (пока). Если нет, то что обычно используют разработчики?

РЕДАКТИРОВАТЬ: просто чтобы уточнить, я не говорю об активации, а об обновлении, таким образом, если есть изменения в базе данных или иным образом, это может быть устранено.

user1915665
источник
Ответ @drzaus при условии, что нет хорошей практики.
Ренс Тильманн
@RensTillmann, если не считать того, что он в любом случае устарел на 2 года, связанный вопрос / ответ имеет в основном тот же ответ, но предшествует этому вопросу еще на 2 года, отсюда и «дубликат».
drzaus

Ответы:

16

Я не думаю, что действие было добавлено. Вы можете посмотреть детали версии для любой версии и увидеть все новые добавленные действия.

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' );
Milo
источник
Спасибо - тогда я просто воспользуюсь этим методом. WP действительно должен добавить действие для этого: D
user1915665
8
технически вы должны использовать register_activation_hook, так как в большинстве случаев плагин деактивируется / активируется всякий раз, когда вы обновляете его от администратора. При подключении plugins_loadedбудет проверяться каждая загрузка страницы (включая интерфейс). Был разговор о представлении register_update_hook, но это было помечено как WONTFIX некоторое время назад. Обсуждение там полезно.
Drzaus
4
Важно понимать, что массовое обновление плагина НЕ запускает ловушки активации - это ДОЛЖНО, но не в 3.9.2. Под «массовым обновлением» я подразумеваю обновление, сделанное со страницы обновления Dashboard. Отдельные обновления, сделанные на странице плагина, отлично работают.
Брайан C
4
Дело в том, что плагины также могут обновляться через FTP, что означает, что ловушка не будет запущена в любом случае. Вот почему вам нужно прибегнуть к опции, хранящейся в базе данных.
Жираф
4
Чтобы расширить комментарий @ giraff, то же самое относится и к людям, которые управляют своим кодом с помощью системы контроля версий, такой как SVN или Git. Из-за этого этот ответ - лучший способ справиться с обновлениями.
двойной резкий
3

Из обсуждения, в котором они решили не добавлять пользовательский хук / функцию, специфичную для обновления , это звучит как «большинство людей» (по состоянию на 4 года назад) register_activation_hook, так как вызывается, когда плагин обновляется через страницу администратора; большинство примеров, которые я видел с тех пор, следуют этой тенденции.

Для большинства случаев я бы предложил не подключаться plugins_loaded, так как он вызывался бы при каждой загрузке страницы. Исключение из этого упоминается в обсуждении: пути обновления через FTP / SVN являются «крайними случаями», поскольку у WP не будет механизма, чтобы узнать, что плагин был изменен, и в этом случае предыдущий ответ может быть более уместным.

См. Https://gist.github.com/zaus/c08288c68b7f487193d1 для примера использования простого фреймворка register_activation_hook.

drzaus
источник
register_activation_hookзапуск обновлений не гарантируется, см. make.wordpress.org/core/2010/10/27/…
Flimm
Очень много - НЕ использовать plugins_loaded- запускает каждую нагрузку и может быть обременительным / медленным.
random_user_name
3

Начиная с WordPress 3.9 вы можете использовать upgrader_process_completeхук.
См. Ссылку 1 , 2

Вот пример кода:

<?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_completehook.
Далее, если вы перейдете на другую страницу администратора, plugins_loadedбудет работать ловушка и там будет работать код обновления.

Пожалуйста, обратите внимание, что этот плагин должен быть активирован, чтобы заставить работать крючок обновления
Это не работает при активации плагина, поэтому, если вы хотите, чтобы код, который работает, активировал плагин, вы должны закодировать его в register_activation_hook()функции.

ви
источник