Wordpress Update Plugin Gancho / Ação? Desde 3.9

11

Eu pesquisei isso algumas vezes, mas minha pesquisa não revela muito, exceto o código personalizado, que pode ou não ser uma boa prática no WordPress.

A partir dos últimos lançamentos (WordPress 3.9 "Smith"), um gancho foi adicionado ao processo de atualização do plug-in? Estou perguntando porque é uma necessidade básica, mas não vejo acrescentou ao códice (ainda). Se não, quais são os desenvolvedores comuns e de melhores práticas que empregam?

EDIT: Só para esclarecer, eu não estou falando sobre a ativação, mas sobre a atualização, dessa forma, se houver alterações no banco de dados ou caso contrário, pode ser abordado.

    
por user1915665 20.05.2014 / 03:15

3 respostas

13

Não acho que uma ação tenha sido adicionada. Você pode analisar os detalhes da versão para qualquer versão e ver quaisquer novas ações adicionadas.

O caminho do WordPress para executar o código na atualização do plugin é o que é descrito aqui :

  

A maneira correta de lidar com um caminho de atualização é executar apenas um procedimento de atualização quando necessário. O ideal seria armazenar uma "versão" na opção de banco de dados do seu plug-in e, em seguida, uma versão no código. Se eles não corresponderem, você acionaria seu procedimento de upgrade e, em seguida, configuraria a opção de banco de dados para igualar a versão no código. É assim que muitos plugins lidam com atualizações, e é assim que o núcleo funciona também.

e com o exemplo de código aqui :

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' );
    
por Milo 20.05.2014 / 03:58
2

A partir da discussão onde eles decidiram não adicionar um gancho personalizado / função específica para atualizar , parece que "a maioria das pessoas" (a partir de 4 anos atrás) usa register_activation_hook , já que é chamado quando um plugin é atualizado através da página de administração; a maioria dos exemplos que vi desde então segue essa tendência.

Para a maior parte da utilização, sugiro não ligar através de plugins_loaded , uma vez que seria chamado em cada carregamento de página. A exceção a isso é mencionada na discussão: os caminhos de upgrade via FTP / SVN são 'edge cases', já que o WP não teria um mecanismo para saber que o plugin foi alterado, neste caso o resposta anterior pode ser mais relevante.

Veja enlace para um exemplo de 'framework simples' usando register_activation_hook .

    
por drzaus 09.09.2014 / 11:25
1

Desde o WordPress 3.9 você pode usar upgrader_process_complete hook.
Veja referência 1 , 2

Aqui está um código de exemplo:

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

Depois que o plugin for atualizado, ele configurará a tarefa em db usando a função set_transient() . Não é recomendável adicionar código de atualização ao chamar upgrader_process_complete hook.
Em seguida, se você navegar para outra página de administração, o plugins_loaded hook funcionará e o código de atualização estará funcionando.

Por favor note que este plugin deve ser ativado para fazer o hook de atualização funcionar.
Isso não está funcionando no plugin de ativação, então, se você quiser que o código que funciona ao ativar o plugin, você deve codificá-lo em register_activation_hook() function.

    
por vee 23.03.2018 / 08:54