Plugin / Pembaruan Plugin Wordpress? Sejak 3.9

15

Saya sudah meneliti ini beberapa kali, namun pencarian saya tidak mengungkapkan banyak kecuali kode kustom yang mungkin atau mungkin tidak praktik WordPress yang baik.

Sampai dengan rilis terbaru (WordPress 3.9 "Smith"), apakah kail telah ditambahkan ke proses pembaruan plugin? Saya bertanya karena ini merupakan kebutuhan yang sangat mendasar, namun saya tidak melihatnya ditambahkan ke codex (belum). Jika tidak, apa yang dipraktikkan pengembang praktik umum dan terbaik?

EDIT: Hanya untuk memperjelas, saya tidak berbicara tentang aktivasi, tetapi tentang memperbarui, dengan cara itu, jika ada perubahan dalam database atau jika tidak, itu dapat diatasi.

pengguna1915665
sumber
@drzaus menjawab asalkan tidak ada praktik yang baik.
Rens Tillmann
@RensTillmann selain dari ini menjadi 2 tahun kedaluwarsa, q / a yang terhubung pada dasarnya memiliki jawaban yang sama tetapi mendahului pertanyaan ini dengan 2 tahun lagi, maka 'duplikat'.
drzaus

Jawaban:

15

Saya tidak berpikir tindakan telah ditambahkan. Anda dapat melihat detail versi untuk versi apa pun dan melihat tindakan baru apa pun yang ditambahkan.

Cara WordPress untuk menjalankan kode pada pembaruan plugin adalah apa yang dijelaskan di sini :

Cara yang tepat untuk menangani jalur pemutakhiran adalah dengan hanya menjalankan prosedur pemutakhiran saat Anda membutuhkannya. Idealnya, Anda akan menyimpan "versi" di opsi basis data plugin Anda, dan kemudian versi dalam kode. Jika tidak cocok, Anda akan menjalankan prosedur pemutakhiran Anda, dan kemudian mengatur opsi database untuk menyamakan versi dalam kode. Ini adalah berapa banyak plugin yang menangani peningkatan, dan ini adalah cara kerja inti juga.

dan dengan contoh kode di sini :

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
sumber
Terima kasih - saya hanya akan menggunakan metode itu. WP benar-benar harus menambahkan tindakan untuk ini: D
user1915665
8
secara teknis Anda seharusnya menggunakan register_activation_hook, karena dalam kebanyakan kasus plugin akan dinonaktifkan / diaktifkan setiap kali Anda memperbaruinya dari admin. Menghubungkan ke plugins_loadedakan melakukan pemeriksaan Anda pada setiap halaman memuat (termasuk frontend). Ada pembicaraan tentang pengenalan register_update_hook, tetapi ditandai sebagai WONTFIX beberapa waktu lalu. Diskusi di sana bermanfaat.
drzaus
4
Sangat penting untuk memahami bahwa pembaruan plugin massal TIDAK menjalankan kait aktivasi - itu HARUS, tetapi tidak di 3.9.2. Yang saya maksud dengan "pembaruan massal" adalah pembaruan yang dilakukan dari halaman pembaruan Dasbor. Pembaruan individual yang dilakukan dari dalam halaman plugin menjalankan hook dengan baik.
Brian C
4
Masalahnya adalah plugin juga dapat diperbarui melalui FTP yang berarti bahwa hook tidak akan diaktifkan. Itu sebabnya Anda perlu menggunakan opsi yang disimpan dalam database.
jerapah
4
Untuk memperluas komentar @ giraff, hal yang sama berlaku untuk orang yang mengelola kode mereka dengan kontrol sumber seperti SVN atau Git. Karena itu, jawaban ini adalah cara terbaik untuk menangani peningkatan.
doublesharp
3

Dari diskusi di mana mereka memutuskan untuk tidak menambahkan pengait khusus / fungsi khusus untuk memutakhirkan , sepertinya "kebanyakan orang" (sejak 4 tahun lalu) menggunakannya register_activation_hook, karena ini disebut ketika plugin ditingkatkan melalui halaman admin; kebanyakan contoh yang saya lihat sejak itu mengikuti tren itu.

Untuk sebagian besar penggunaan, saya sarankan untuk tidak menghubungkan plugins_loaded, karena akan dipanggil pada setiap halaman memuat. Pengecualian untuk hal ini disebutkan dalam diskusi: jalur peningkatan melalui FTP / SVN adalah 'kasus tepi', karena WP tidak akan memiliki mekanisme untuk mengetahui bahwa plugin diubah, dalam hal ini jawaban sebelumnya mungkin lebih relevan.

Lihat https://gist.github.com/zaus/c08288c68b7f487193d1 untuk contoh menggunakan 'kerangka sederhana' register_activation_hook.

drzaus
sumber
register_activation_hooktidak dijamin dijalankan pada pembaruan, lihat make.wordpress.org/core/2010/10/27/…
Flimm
Sangat banyak - JANGAN gunakan plugins_loaded- menjalankan setiap beban, dan dapat menjadi beban / lambat.
random_user_name
3

Sejak WordPress 3.9 Anda dapat menggunakan upgrader_process_completehook.
Lihat referensi 1 , 2

Berikut ini contoh kode:

<?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

Setelah plugin diperbarui, itu akan mengatur tugas menjadi db menggunakan set_transient()fungsi. Tidak disarankan untuk menambahkan kode pembaruan saat menelepon upgrader_process_completehook.
Selanjutnya, jika Anda menjelajah ke halaman admin lain, plugins_loadedhook akan berfungsi dan kode pembaruan akan berfungsi di sana.

Harap dicatat bahwa plugin ini harus diaktifkan untuk membuat pengait pembaruan berfungsi.
Ini tidak berfungsi pada plugin aktif jadi, jika Anda ingin kode yang berfungsi mengaktifkan plugin Anda harus kode dalam register_activation_hook()fungsinya.

vee
sumber