Wordpress Güncelleme Eklentisi Kanca / Eylem? 3.9'dan beri


15

Bunu birkaç kez araştırdım, ancak aramam iyi WordPress uygulaması olabilecek veya olmayabilecek özel kod dışında çok fazla açığa çıkmıyor.

En son sürümlerden (WordPress 3.9 "Smith") eklenti güncelleme sürecine bir kanca eklendi mi? Ben çok temel bir ihtiyaç çünkü soruyorum, henüz kodeks (henüz) eklendi görmüyorum. Değilse, geliştiricilerin uyguladığı ortak ve en iyi uygulama nedir?

EDIT: Sadece açıklığa kavuşturmak için, etkinleştirme hakkında konuşmak değil, ama güncelleştirme hakkında, bu şekilde, veritabanında değişiklikler varsa veya başka bir şekilde ele alınabilir.



@drzaus cevabı iyi bir uygulama olmaması şartıyla.
Rens Tillmann

@RensTillmann, bunun zaten 2 yıl geçmiş olmasının yanı sıra, bağlantılı q / a'nın temelde aynı cevabı vardır, ancak bu soruyu 2 yıl daha önler, bu nedenle 'kopya'.
drzaus

Yanıtlar:


16

Bir eylem eklendiğini düşünmüyorum. Şunları yapabilirsiniz versiyon detayları bakmak herhangi bir sürümü için ve eklenen yeni eylemler görüyoruz.

Eklenti güncellemesinde kod çalıştırmanın WordPress Yolu, burada açıklanan şeydir :

Bir yükseltme yolunu işlemenin doğru yolu, yalnızca gerektiğinde bir yükseltme prosedürü çalıştırmaktır. İdeal olarak, eklentinizin veritabanı seçeneğinde bir "sürüm" ve ardından kodda bir sürüm depolamanız gerekir. Eşleşmezlerse, yükseltme yordamınızı tetikler ve veritabanı seçeneğini koddaki sürüme eşit olacak şekilde ayarlarsınız. Yükseltmeleri kaç eklenti işliyor ve çekirdek de bu şekilde çalışıyor.

ve burada kod örneğiyle :

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' );

Teşekkür ederim - o zaman bu yöntemi kullanacağım. WP bunun için bir eylem eklemeli: D
user1915665

8
teknik olarak kullanmanız gerekir register_activation_hook, çünkü çoğu durumda bir eklenti yönetici tarafından her güncellediğinizde devre dışı bırakılır / etkinleştirilir. Çengel plugins_loaded, her sayfa yüklemesinde (ön uç dahil) çekinizi yapar. Tanıtım hakkında konuşma vardı register_update_hook, ama bir süre önce WONTFIX olarak işaretlendi . Oradaki tartışma yardımcı olur.
drzaus

4
Bir toplu eklenti güncellemesinin aktivasyon kancalarını ÇALIŞMADIĞINI anlamak önemlidir - 3.9.2. "Toplu güncelleme" ile, Pano güncelleme sayfasından yapılan bir güncelleme anlamına gelir. Eklenti sayfasından yapılan bireysel güncellemeler kancaları iyi çalışır.
Brian C

4
Şey, eklentiler FTP üzerinden de güncellenebilir, bu da kanca her durumda ateşlenmeyeceği anlamına gelir. Bu yüzden veritabanında saklanan seçeneğe başvurmanız gerekir.
zürafa

4
@ Giraff'ın yorumunu genişletmek için, kodlarını SVN veya Git gibi kaynak kontrolü ile yöneten insanlar için de aynı şey geçerlidir. Bu nedenle, bu cevabı olan yükseltmeleri işlemek için en iyi yol.
çiftler

3

Gönderen onlar yükseltmek için özel bir kanca / fonksiyon özgü eklememek için karar tartışma , bu "çoğu insan" gibi sesler kullanım (4 yıl önce itibariyle) register_activation_hook, bir eklenti yönetici sayfası aracılığıyla yükseltildiğinde denir beri; o zamandan beri gördüğüm çoğu örnek bu eğilimi takip ediyor.

Çoğu kullanım plugins_loadediçin, her sayfa yüklemesinde çağrıldığı için kancalamayı önermem . Tartışmada istisna söz konusudur: FTP / SVN üzerinden yükseltme yolları 'uç durumlar' dır, çünkü WP'nin eklentinin değiştirildiğini bilmek için bir mekanizması olmayacaktır, bu durumda önceki cevap daha alakalı olabilir.

'Basit bir çerçeve' örneği kullanmak için bkz. Https://gist.github.com/zaus/c08288c68b7f487193d1register_activation_hook .


register_activation_hookgüncellemelerde çalıştırılacağı garanti edilmez, bkz. make.wordpress.org/core/2010/10/27/…
Flimm

Çok fazla - KULLANMAYIN plugins_loaded- her yükü çalıştırır ve külfetli / yavaş olabilir.
random_user_name

3

WordPress 3.9'dan beri upgrader_process_completekanca kullanabilirsiniz .
Bakınız referans 1 , 2

İşte bir örnek kod:

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

Eklenti güncellendiğinde, set_transient()fonksiyonu kullanarak görevi db'ye ayarlar . upgrader_process_completeKanca çağrılırken güncelleme kodu eklenmesi önerilmez .
Ardından, başka bir yönetici sayfasına göz atarsanız, plugins_loadedkanca çalışır ve güncelleme kodu burada çalışır.

Güncelleme kancasının çalışması için bu eklentinin etkinleştirilmesi gerektiğini lütfen unutmayın.
Bu, eklentiyi etkinleştirmek istiyorsanız, eklentiyi etkinleştirmek istiyorsanız, register_activation_hook()işlev eklentisini kodlamanız gerekir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.