Wordpress Update Plugin Hook / Ação? Desde 3,9

15

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 do WordPress.

Desde as versões mais recentes (WordPress 3.9 "Smith"), um gancho foi adicionado ao processo de atualização do plugin? Estou perguntando porque é uma necessidade muito básica, mas ainda não o vejo adicionado ao codex (ainda). Caso contrário, quais são as práticas comuns e as melhores práticas que os desenvolvedores empregam?

EDIT: Apenas para esclarecer, não estou falando sobre ativação, mas sobre atualização, dessa forma, se houver alterações no banco de dados ou se puder ser solucionado.

user1915665
fonte
Resposta @drzaus, desde que não seja uma boa prática.
Rens Tillmann
@RensTillmann, além de estar desatualizado em 2 anos, o q / a vinculado tem basicamente a mesma resposta, mas antecede essa pergunta por mais 2 anos, daí o 'duplicado'.
drzaus 8/08/16

Respostas:

15

Eu não acho que uma ação foi adicionada. Você pode verificar os detalhes da versão para qualquer versão e ver novas ações adicionadas.

A maneira do WordPress de 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. Idealmente, você armazenaria uma "versão" na opção de banco de dados do seu plug-in e depois uma versão no código. Se eles não corresponderem, você iniciaria o procedimento de atualização e definiria a opção do banco de dados para igualar a versão no código. É assim que muitos plugins lidam com atualizações, e é assim que o core também funciona.

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' );
Milo
fonte
Obrigado - vou simplesmente usar esse método então. O WP realmente precisa adicionar uma ação para isso: D
user1915665
8
tecnicamente, você deve usar register_activation_hook, pois na maioria dos casos, um plug-in é desativado / ativado sempre que você o atualiza pelo administrador. A ligação ao plugins_loadedfará sua verificação em todo carregamento de página (incluindo o front-end). Houve uma conversa sobre a introdução register_update_hook, mas foi marcada como WONTFIX há um tempo atrás. A discussão lá é útil.
drzaus 9/09/14
4
É importante entender que uma atualização em massa do plugin NÃO executa ganchos de ativação - DEVE, mas não na 3.9.2. Por "atualização em massa", quero dizer uma atualização feita na página de atualização do Painel. Atualizações individuais feitas na página do plug-in funcionam bem.
Brian C
4
O problema é que os plugins também podem ser atualizados via FTP, o que significa que o gancho não será acionado em nenhum caso. É por isso que você precisa recorrer à opção armazenada no banco de dados.
giraff
4
Para expandir o comentário de @ giraff, o mesmo se aplica às pessoas que gerenciam seu código com controle de origem como SVN ou Git. Por esse motivo, esta resposta é a melhor maneira de lidar com atualizações.
doublesharp
3

Na discussão em que eles decidiram não adicionar um gancho / função personalizado específico para a atualização , parece que "a maioria das pessoas" (há 4 anos) usa register_activation_hook, já que é chamado quando um plug-in é atualizado na página de administração; muitos exemplos que vi desde então seguem essa tendência.

Para a maioria dos usos, eu sugeriria não ligar plugins_loaded, pois seria chamado a cada carregamento de página. A exceção é mencionada na discussão: os caminhos de atualização via FTP / SVN são 'casos de ponta', já que o WP não teria um mecanismo para saber que o plug-in foi alterado. Nesse caso, a resposta anterior pode ser mais relevante.

Consulte https://gist.github.com/zaus/c08288c68b7f487193d1 para obter um exemplo de 'estrutura simples' usando register_activation_hook.

drzaus
fonte
register_activation_hooknão é garantido que seja executado em atualizações, consulte make.wordpress.org/core/2010/10/27/…
Flimm
Muito - não use plugins_loaded- executa cada carga e pode ser oneroso / lento.
random_user_name 28/02/19
3

Desde o WordPress 3.9, você pode usar o upgrader_process_completehook.
Ver 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

Uma vez atualizado, o plugin definirá a tarefa no db usando a set_transient()função Não é recomendável adicionar código de atualização ao chamar o upgrader_process_completegancho.
Em seguida, se você navegar para outra página de administração, o plugins_loadedgancho funcionará e o código de atualização estará funcionando lá.

Observe que este plug-in deve estar ativado para que o gancho de atualização funcione.
Isso não está funcionando no ativar o plug-in, portanto, se você deseja que o código funcione para ativar o plug-in, é necessário codificá-lo na register_activation_hook()função.

vee
fonte