Como baixar, instalar, ativar e substituir de forma programática e automática os plugins do WordPress

Publicados: 2018-09-18

Conseguir que os usuários façam qualquer coisa é difícil. Seja preenchendo um formulário ou apenas realizando alguns cliques – há uma resistência inerente. Mesmo que essa ação seja para o bem dos usuários, como alterar uma senha fraca, eles não farão isso. O mesmo se aplica para fazer com que os usuários instalem um plug-in necessário ou, pior ainda, substituindo um plug-in ativo por um novo. É missão limítrofe impossível.

Felizmente, com um pouco de código e consentimento do usuário, podemos baixar, instalar, ativar, desativar e até excluir plugins do WordPress. Esse processo automatizado, quando implantado com responsabilidade, pode melhorar drasticamente a experiência do usuário e aumentar as taxas de conversão para as ações necessárias do usuário no administrador do WordPress.

Conseguir que os usuários façam qualquer coisa é difícil. Então, por que não baixar, instalar e ativar plugins #WordPress automaticamente? Leva apenas algumas linhas de código.

CLIQUE PARA TWEET

Por que baixar, instalar e ativar plugins via código?

Existem vários cenários, mas teoria de lado, vamos ver a situação que o WP Reset tem em mãos. Eu já escrevi um post sobre rebranding reset-wp em WP Reset. Além de outras coisas, o processo envolve fazer com que as pessoas que já usam o reset-wp o removam de seus sites e depois instalem o WP Reset. Por que alguém faria isso só porque pedimos? E mesmo que eles queiram fazer isso, eles ficarão relutantes porque está longe de ser dois cliques. No entanto, se explicarmos tudo e reduzirmos a um botão “Sim, vá em frente, substitua reset-wp por Reset WP”, então as coisas não parecem tão ruins.

Não mexa nos sites das pessoas sem a permissão delas! Período. Nem mesmo que seja “uma coisinha minúscula”. Isso não é legal. Não é o seu site. Notifique os usuários sobre quaisquer alterações quando eles atualizarem o plug-in ou quando você adicionar novos recursos.

Devido às regras do wp.org que nos impedem de rastrear as ações do usuário (sem o consentimento deles, e não queremos incomodá-los com perguntas), infelizmente não tenho números para compartilhar. Mas o que posso dizer é que não tivemos reclamações de usuários reset-wp que passaram pelo processo de substituição, ou apenas viram a notificação no plugin. E estamos executando o processo há mais de sete semanas.

É certo fazer isso? Os usuários se importarão?

Os usuários certamente se importarão com tudo e qualquer coisa que você fizer pelas costas deles! Não faça isso! Não faça nada sem a permissão dos usuários. Especialmente se o plugin estiver hospedado em wp.org porque isso é contra as regras. Se você fizer isso, os administradores removerão imediatamente seu plug-in do repositório.

Mas, se você pedir permissão – “Podemos substituir o plugin A pelo plugin B? Por favor confirme." Então não há problema em fazê-lo. O processo de desativar e excluir um plugin e baixar e ativar outro leva mais do que alguns cliques. Portanto, se você conseguir automatizar esse processo e reduzi-lo a um clique, os usuários ficarão satisfeitos.

Um processo semelhante de ativação de plugins necessários para temas está em jogo há anos, e os usuários estão bem com isso. Em vez de seguir vários links para instalar plugins, eles confirmam que estão OK com o processo e vários plugins são instalados em um clique.

Como de costume, muito pouco código é necessário

Em pseudocódigo esta é a ideia geral do que queremos fazer:

// pseudo code only!
// DO NOT copy & paste

var $old_plugin;
var $new_plugin;

if ( is_plugin_installed( $new_plugin ) ) {
  // new plugin is already installed
  // make sure we have the last version
  upgrade_plugin( $new_plugin );
} else {
  install_plugin( $new_plugin );
}

if ( !is_plugin_active( $new_plugin ) ) {
  // new plugin is not active - activate it
  activate_plugin( $new_plugin );
}

// deactivate old plugin
deactivate_plugin( $old_plugin );

// if needed delete old plugin
delete_plugin( $old_plugin );

// pseudo code only!
// DO NOT copy & paste

É bem simples e direto. Contanto que o usuário tenha as permissões de arquivo corretas, tudo correrá bem. A substituição inteira não leva mais de um ou dois segundos para ser concluída.

Precisamos de algumas funções

Felizmente o WordPress tem a maioria das funções que precisamos feitas ou semi-prontas, então é uma questão de juntar as coisas.

Um conceito crucial para entender é como o WordPress identifica um plugin, como ele sabe qual plugin é qual. Ele faz isso pelo plugin slug – uma combinação do nome da pasta do plugin e o arquivo PHP principal. Por exemplo: hello-dolly/hello-dolly.php. O arquivo PHP principal é o arquivo com os cabeçalhos do plugin. Para obter o slug, execute plugin_basename( __FILE__ ) . Sempre que você precisa verificar se um plugin está ativo ou quer fazer algo com ele, você precisa usar o plugin slug. Este slug é semelhante, mas não o mesmo que o slug do wp.org. No repositório, o slug é apenas o nome da pasta, sem o nome do arquivo. Então, para Hello Dolly é “hello-dolly”. Não precisamos disso no momento, mas precisa ser esclarecido. Para uma leitura mais aprofundada sobre este tópico um tanto confuso, confira este tópico no Stack Exchange.

WordPress identifica plugins por seu slug, ou seja, hello-dolly/hello-dolly.php. Para obter o slug execute plugin_basename( __FILE__ ) no arquivo principal do plugin.

is_plugin_active( $plugin_slug ) vem embutido, então não há nada para fazermos. A página do Codex não revela muito extra, é uma função simples.

is_plugin_installed( $plugin_slug ) não vem embutido, mas são apenas algumas linhas para codificar.

function is_plugin_installed( $slug ) {
  if ( ! function_exists( 'get_plugins' ) ) {
    require_once ABSPATH . 'wp-admin/includes/plugin.php';
  }
  $all_plugins = get_plugins();
  
  if ( !empty( $all_plugins[$slug] ) ) {
    return true;
  } else {
    return false;
  }
}

Essas são todas as funções de teste condicionais de que precisamos. Agora para aqueles que fazem alguma coisa. activate_plugin( ) está embutido e tem quatro parâmetros, então confira a página do Codex sobre isso.

deactivate_plugins( $plugin_slug ) também está disponível imediatamente, mas certifique-se de anotar o “s” (plural) no nome das funções. Ele também tem alguns parâmetros, então leia a página do Codex.

install_plugin( $plugin_zip ) está disponível como parte da classe Plugin_Upgrader . Não há necessidade de nenhum código extra, apenas uma nova instância de classe. O mesmo vale para upgrade_plugin( $plugin_slug ) .

function install_plugin( $plugin_zip ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();

  $upgrader = new Plugin_Upgrader();
  $installed = $upgrader->install( $plugin_zip );

  return $installed;
}

function upgrade_plugin( $plugin_slug ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();

  $upgrader = new Plugin_Upgrader();
  $upgraded = $upgrader->upgrade( $plugin_slug );

  return $upgraded;
}

wp_cache_flush() pode não ser necessário, mas eu o adicionei apenas por segurança. Além de levar 10ms a mais para rodar, não pode causar nenhum mal.

Juntando tudo

Se você está lendo este artigo não por curiosidade, mas por uma necessidade real de implementar o código em um plugin, sugiro instalar o plugin reset-wp. Ler sobre código é bom, mas nada se compara a testar na natureza.

Minha preferência é usar admin_action para quase tudo que não precisa de uma GUI de administração completa. Então, adicione isso à função onde outras ações e filtros são adicionados: add_action( 'admin_action_replace_plugin', 'replace_plugin' ); . Quando o usuário abrir admin.php?action=replace_plugin nosso código será executado. Por favor, não codifique esse URL. Use algo como: $url = add_query_arg(array('action' => 'replace_plugin'), admin_url('admin.php')); . Isso fala muito sobre a qualidade do seu código.

Aqui está o código que você pode copiar/colar. Obviamente, modifique as três variáveis ​​em cima com seus valores.

function replace_plugin() {
  // modify these variables with your new/old plugin values
  $plugin_slug = 'wp-reset/wp-reset.php';
  $plugin_zip = 'https://downloads.wordpress.org/plugin/wp-reset.latest-stable.zip';
  $old_plugin_slug = 'reset-wp/reset-wp.php';
  
  echo 'If things are not done in a minute <a href="plugins.php">click here to return to Plugins page</a><br><br>';
  echo 'Starting ...<br><br>';
  
  echo 'Check if new plugin is already installed - ';
  if ( is_plugin_installed( $plugin_slug ) ) {
    echo 'it\'s installed! Making sure it\'s the latest version.';
    upgrade_plugin( $plugin_slug );
    $installed = true;
  } else {
    echo 'it\'s not installed. Installing.';
    $installed = install_plugin( $plugin_zip );
  }
  
  if ( !is_wp_error( $installed ) && $installed ) {
    echo 'Activating new plugin.';
    $activate = activate_plugin( $plugin_slug );
    
    if ( is_null($activate) ) {
      echo '<br>Deactivating old plugin.<br>';
      deactivate_plugins( array( $old_plugin_slug ) );
      
      echo '<br>Done! Everything went smooth.';
    }
  } else {
    echo 'Could not install the new plugin.';
  }
}
  
function is_plugin_installed( $slug ) {
  if ( ! function_exists( 'get_plugins' ) ) {
    require_once ABSPATH . 'wp-admin/includes/plugin.php';
  }
  $all_plugins = get_plugins();
  
  if ( !empty( $all_plugins[$slug] ) ) {
    return true;
  } else {
    return false;
  }
}

function install_plugin( $plugin_zip ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();
  
  $upgrader = new Plugin_Upgrader();
  $installed = $upgrader->install( $plugin_zip );

  return $installed;
}

function upgrade_plugin( $plugin_slug ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();
  
  $upgrader = new Plugin_Upgrader();
  $upgraded = $upgrader->upgrade( $plugin_slug );

  return $upgraded;
}

O código usa tudo o que já discutimos. A GUI e as mensagens são muito básicas, então adicione um pouco de CSS ou carregue a URL em um lightbox como fizemos em reset-wp.

A execução automática de tarefas mundanas chatas para os usuários é sempre uma grande vantagem para o #UX. Veja como você pode facilmente baixar, instalar e ativar vários plugins #WordPress com um único clique.

CLIQUE PARA TWEET

Um clique é sempre melhor que dez

Fazer com que os usuários cliquem uma vez em vez de dez vezes é sempre uma coisa positiva! É um sinal de boa UX (experiência do usuário). Portanto, se o seu plugin ou tema exigir outros plugins, recomendo implementar um procedimento de instalação com um clique para todas as dependências. Sem dúvida, você receberá menos tíquetes de suporte de pessoas nos estágios iniciais de uso do plug-in.

Quanto a substituir um plugin por outro – tente ficar de fora dessas situações. Às vezes é inevitável, mas o problema é que você nunca conseguirá que todos os usuários mudem para o novo plugin, o que significa que você tem que suportar dois plugins ou abandonar e decepcionar uma parte de sua base de usuários que continua usando o plugin antigo. Enfrentamos a mesma decisão com reset-wp e não gostamos de nenhuma dessas duas soluções