Alterando o slug do plugin com a atualização

4

Meu plugin usa camelCase em arquivos e pastas como

myPlugin/myPlugin.php

Encontrei vários problemas com isso nas atualizações de plugins. A maioria deles funciona muito bem e é mais uma coisa cosmética, mas em alguns lugares eu só gosto de ir com todas as letras minúsculas.

Qual é a melhor maneira (ou existe alguma) para atualizar o plugin para

myplugin/myplugin.php

sem agitar os usuários?

Por favor, note que este é um plugin personalizado e não está disponível no repositório e sim eu tive que fazer em minúsculas em primeiro lugar.

    
por Xaver 14.12.2015 / 21:47

2 respostas

2

Se você quisesse apenas alterar o nome do arquivo, teria myPlugin.php e myplugin.php no plug-in e, em seguida, atualizaria a opção active_plugins no banco de dados para o novo nome. Depois que todos os usuários tiverem atualizado, você poderá remover myPlugin.php .

Mas você deseja renomear a pasta e o nome do arquivo.

Eu obteria myPlugin/myPlugin.php para instalar e ativar myplugin/myplugin.php . Quando myplugin/myplugin.php for instalado, myplugin/myplugin.php poderá excluir myPlugin/myPlugin.php

Você pode usar Ativação de plug-in do TGM para instalar e ativar o novo plug-in. Faça para incluir uma verificação para que as versões nova e antiga não sejam executadas ao mesmo tempo.

Você pode usar deactivate_plugins() e delete_plugins() para desativar e desinstalar o plugin.

    
por grappler 15.12.2015 / 16:02
0

Ok, eu fiz algumas pesquisas / testes em um curto prazo:

Não use maiúsculas em primeiro lugar!

Eu observei atualmente apenas um problema em que a atualização baseada em ajax da visão geral dos plugins (introduzida no WP 4.2) gera um erro JS, mas pode ser um problema no futuro.

Isso ocorre porque a resposta do ajax usa sanitize_key no método wp_ajax_update_plugin (browse no trac ).

O método sanitize_key faz ao lado de sanitização, um strtolower , que faz com que o " myPlugin " receba um " myplugin ".

O updateSuccess método tenta agora atualizar a linha onde o slug é " myplugin " em vez de " myPlugin ".

Isso pode ser evitado mudando linha 694 em wp-admin/includes/class-wp-plugins-list-table.php de

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

para

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

todo: ticket aberto Bilhete # 35032

Para responder à pergunta inicial

Você pode alterar o slug em uma atualização de plug-in, mas precisa cuidar do seguinte:

  • o código a seguir deve ser incluído na versão antiga (por exemplo, 'myPlugin / myPlugin.php)
  • a versão atualizada deve ter um pouco de 'myplugin / myplugin.php
  • não use delete_plugin() que pode acionar um uninstall.php e remover dados de plugins

Este é o código com o qual você pode começar:

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

Se você tem um progresso de atualização em lote dedicado no seu plugin como eu, você pode usar este código que é na minha opinião um pouco mais seguro, pois é acionado por interação explícita do usuário e não requer o 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;

}

No final, você deve sempre garantir que o usuário entenda o que está acontecendo e / ou por que isso é um passo necessário.

    
por Xaver 15.12.2015 / 18:35

Tags