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.