Wordpress Update Hook / Action? З 3.9


15

Я кілька разів це досліджував, але пошук не виявляє багато, за винятком спеціального коду, який може бути або не бути хорошою практикою WordPress.

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

EDIT: Просто для уточнення, я говорю не про активацію, а про оновлення таким чином, якщо в базі даних є зміни або інакше це можна вирішити.



Відповідь @drzaus за умови, що це не дуже хороша практика.
Ренс Тіллман

@ RensTillmann не відходить від того, що це 2 роки застаріло, зв'язаний q / a має в основному ту саму відповідь, але передував цьому питання ще 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' );

Дякую - я просто використовуватиму цей метод тоді. WP дійсно повинен додати дію для цього: D
user1915665,

8
технічно ви повинні використовувати register_activation_hook, оскільки в більшості випадків плагін деактивується / активується щоразу, коли ви оновите його від адміністратора. Підключення plugins_loadedбуде перевіряти кожне завантаження сторінки (включаючи фронтальний). Говорили про запровадження register_update_hook, але це було позначено як WONTFIX деякий час тому. Дискусія там корисна.
drzaus

4
Важливо розуміти, що оновлення плагінів НЕ запускає гачки активації - ПОТРІБНО, але не в 3.9.2. Під "масовим оновленням" я маю на увазі оновлення, зроблене на сторінці оновлення інформаційної панелі. Індивідуальні оновлення, зроблені на сторінці плагінів, добре запускають гачки.
Брайан 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.


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

Після оновлення плагіну він поставить завдання в db за допомогою set_transient()функції. Не рекомендується додавати код оновлення під час виклику upgrader_process_completeгака.
Далі, якщо ви перейдете на іншу сторінку адміністратора, plugins_loadedгачок спрацює, і код оновлення працюватиме там.

Зверніть увагу, що цей плагін повинен бути активований, щоб працювати гачок оновлення.
Це не працює над активацією плагіна, тому, якщо ви хочете, щоб код, який працює на активації плагіна, потрібно його кодувати за register_activation_hook()функцією.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.