Cambiando la barra de plugin con actualización

4

Mi plugin usa camelCase en archivos y carpetas como

myPlugin/myPlugin.php

He encontrado varios problemas con esto en las actualizaciones de complementos. La mayoría de ellos funcionan bien y es más cosmético, pero en algunos lugares me gusta ir en minúsculas.

¿Cuál es la mejor manera (o hay alguna) de actualizar el complemento a

myplugin/myplugin.php

sin molestar a los usuarios?

Ten en cuenta que este es un complemento personalizado y no está disponible en el repositorio y, en primer lugar, tuve que hacerlo en minúsculas.

    
pregunta Xaver 14.12.2015 - 21:47

2 respuestas

2

Si solo quisiera cambiar el nombre de archivo, tendría tanto myPlugin.php como myplugin.php en el complemento y luego actualizar la opción active_plugins en la base de datos al nuevo nombre. Una vez que todos los usuarios se hayan actualizado, puede eliminar myPlugin.php .

Pero desea cambiar el nombre de la carpeta y el nombre de archivo.

Obtendría myPlugin/myPlugin.php para instalar y activar myplugin/myplugin.php . Una vez que se haya instalado myplugin/myplugin.php , myplugin/myplugin.php puede eliminar myPlugin/myPlugin.php

Puede usar Activación del complemento TGM para instalar y activar el nuevo complemento. Haga que se incluya una comprobación para que la versión nueva y la antigua no se ejecuten al mismo tiempo.

Puede usar deactivate_plugins() y delete_plugins() para desactivar y desinstalar el complemento.

    
respondido por el grappler 15.12.2015 - 16:02
0

Ok, hice algunas investigaciones / pruebas en breve y en breve:

¡No uses mayúsculas en primer lugar!

Actualmente, solo he notado un problema en el que la actualización basada en ajax de la descripción general de los complementos (presentada en WP 4.2) genera un error JS, pero puede ser un problema en el futuro.

Esto se debe a que la respuesta ajax usa sanitize_key en el método wp_ajax_update_plugin (browse in trac ).

El método sanitize_key hace junto a la limpieza, strtolower que causa que " myPlugin " obtenga un " myplugin ".

El updateSuccess el método ahora intenta actualizar la fila donde el slug es " myplugin " en lugar de " myPlugin ".

Esto podría evitarse cambiando línea 694 en wp-admin/includes/class-wp-plugins-list-table.php from

    printf( "<tr id='%s' class='%s' data-slug='%s'>",
        $id,
        $class,
        $plugin_slug
    );

a

    printf( "<tr id='%s' class='%s' data-slug='%s'>",
        $id,
        $class,
        sanitize_key($plugin_slug)
    );

todo: abrir ticket Ticket # 35032

Para responder a la pregunta inicial

Puedes cambiar el slug en una actualización del complemento, pero debes encargarte de lo siguiente:

  • el siguiente código debe incluirse en la versión anterior (por ejemplo, 'myPlugin / myPlugin.php)
  • la versión actualizada debe tener una babosa de 'myplugin / myplugin.php
  • no use delete_plugin() que puede activar un uninstall.php y elimina los datos de los complementos

Aquí está el código con el que puedes comenzar:

//hook into when new plugin has been successfully updated
add_filter( 'upgrader_post_install', 'my_move_plugin_slug', 10 ,3 );

function my_move_plugin_slug($should_be_true, $hook_extra, $result){

    global $wpdb, $wp_filesystem;

    $from = 'myPlugin/myPlugin.php';
    $to = 'myplugin/myplugin.php';

    //some general checks
    if(!$should_be_true || !isset($hook_extra['plugin']) || $hook_extra['plugin'] != $to) return $should_be_true;

    $old_destination = $result['local_destination'].'/'.dirname($from).'/';

    //old location doesn't exist (anymore)
    if(!is_dir($old_destination)) return $should_be_true;
    //new location is the same as the old one
    if($old_destination == $result['destination']) return $should_be_true;

    //do the magic

    //rewrite location in the database
    echo '<p>Moving the plugin to new location… ';
    if(false !== $wpdb->query($wpdb->prepare("UPDATE {$wpdb->options} SET 'option_value' = replace(option_value, %s, %s)", $from, $to))){
        echo '<strong>done</strong>';
    }
    echo '</p>';

    //delete folder
    echo '<p>Removing the old directory of the plugin… ';
    if($wp_filesystem->delete( $old_destination , true )){
        echo '<strong>done</strong>';
    }
    echo '</p>';

}

Segundo método

Si tiene un progreso dedicado de actualización por lotes en su complemento, como el que tengo, puede usar este código que, en mi opinión, es un poco más seguro ya que se activa por la interacción explícita del usuario y no requiere wp_filesystem:

function do_change_plugin_slug(){

    global $wpdb;

    $from = 'myMail/myMail.php';
    $to = 'mymail/mymail.php';

    $old_destination = WP_PLUGIN_DIR.'/'.$from;
    $new_destination = WP_PLUGIN_DIR.'/'.$to;

    //old location doesn't exist (anymore)
    if(!file_exists($old_destination)) return true;
    //new location is the same as the old one
    if($old_destination == $new_destination) return true;

    //do the magic

    echo 'Removing the old file of the plugin… ';
    if(rename( $old_destination , dirname($old_destination).'/'.basename($new_destination) )){
        echo 'done';
    }else{
        echo 'failed';
    }
    echo "\n";

    echo 'Removing the old directory of the plugin… ';
    if(rename( dirname($old_destination) , dirname($new_destination) )){
        echo 'done';
    }else{
        echo 'failed';
    }
    echo "\n";

    //rewrite location in the database
    echo 'Moving the plugin to new location… ';
    if(false !== $wpdb->query($wpdb->prepare("UPDATE {$wpdb->options} SET 'option_value' = replace(option_value, %s, %s)", $from, $to))){
        echo 'done';
    }else{
        echo 'failed';
    }
    echo "\n";

    return true;

}

Al final, siempre debes asegurarte de que el usuario entienda lo que está pasando y / o por qué este es un paso necesario.

    
respondido por el Xaver 15.12.2015 - 18:35

Lea otras preguntas en las etiquetas