¿Gancho / acción del complemento de actualización de Wordpress? Desde 3.9

11

He investigado esto varias veces, pero mi búsqueda no revela mucho, excepto el código personalizado que puede o no ser una buena práctica de WordPress.

A partir de los últimos lanzamientos (WordPress 3.9 "Smith"), ¿ se agregó un gancho al proceso de actualización del complemento? Lo pregunto porque es una necesidad muy básica, pero no veo añadido al códice (todavía). Si no es así, ¿qué es lo que los desarrolladores de prácticas comunes y mejores emplean?

EDITAR: Solo para aclarar, no estoy hablando de activación, sino de actualización, de esa manera, si hay cambios en la base de datos o de lo contrario se puede abordar.

    
pregunta user1915665 20.05.2014 - 03:15

3 respuestas

13

No creo que se haya agregado una acción. Puede consultar los detalles de la versión para cualquier versión y ver las nuevas acciones agregadas.

La manera de WordPress de ejecutar el código en la actualización del complemento es lo que se describe aquí :

  

La forma correcta de manejar una ruta de actualización es ejecutar solo un procedimiento de actualización cuando sea necesario. Lo ideal sería almacenar una "versión" en la opción de base de datos de su complemento, y luego una versión en el código. Si no coinciden, dispararía el procedimiento de actualización y luego configuraría la opción de base de datos para igualar la versión en el código. Así es como muchos complementos manejan las actualizaciones, y así es como funciona el núcleo.

y con el ejemplo de código aquí :

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

De la discusión de en la que decidieron no agregar un gancho personalizado / función específica para actualizar , suena como "la mayoría de la gente" (a partir de hace 4 años) usa register_activation_hook , ya que se llama cuando un complemento se actualiza a través de la página de administración; La mayoría de los ejemplos que he visto desde entonces siguen esa tendencia.

Para la mayoría de los usos, sugeriría no enlazar a través de plugins_loaded , ya que se vería en cada carga de página. La excepción a esto se menciona en la discusión: las rutas de actualización a través de FTP / SVN son 'casos extremos', ya que WP no tendría un mecanismo para saber que se cambió el complemento, en cuyo caso el respuesta anterior podría ser más relevante.

Consulte enlace para ver un ejemplo de 'marco simple' utilizando register_activation_hook .

    
respondido por el drzaus 09.09.2014 - 11:25
1

Desde WordPress 3.9 puedes usar upgrader_process_complete hook.
Consulte la referencia 1 , 2

Aquí hay un código de ejemplo:

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

Una vez actualizado el complemento, configurará la tarea en db usando la función set_transient() . No se recomienda agregar el código de actualización al llamar a upgrader_process_complete hook.
A continuación, si navega a otra página de administración, el gancho plugins_loaded funcionará y el código de actualización funcionará allí.

Tenga en cuenta que este complemento debe estar activado para que funcione el enlace de actualización.
Esto no funciona en activar el complemento, por lo tanto, si desea que el código que funciona en active el complemento, debe codificarlo en la función register_activation_hook() .

    
respondido por el vee 23.03.2018 - 08:54

Lea otras preguntas en las etiquetas