Como posso encontrar a lesma dos plugins?

11

Gostaria de saber como posso encontrar a lesma dos plug-ins (slug = nome interno usado pelo WordPress para fazer atualizações de plug-ins e determinar quais plug-ins estão ativos no momento)? Geralmente é o nome da pasta do plug-in, mas se um plug-in não possui uma pasta, é o nome do arquivo (como hello.php). Existem outras exceções?

  1. Caracteres minúsculos e maiúsculos são importantes?
  2. Um plug-in pode ter uma lesma diferente do nome da pasta? E se houver um plugin chamado hello.php e outro /hello.php/hello.php?
Paulo
fonte
Muito boa pergunta, pena que pode bounties não concessão a Q de, mas acho que o A é o prêmio;)
brasofilo

Respostas:

8

A string usada no WordPress para identificar o plug-in é:

plugin_basename($file);

… Onde $fileestá um arquivo com os cabeçalhos do plugin .

Portanto, se você estiver no seu plugin, obtenha o slug com:

$slug = plugin_basename( __FILE__ );
fuxia
fonte
1
plugin_basename ($ file); Não é a lesma desde 3.8.1. Este é o caminho da pasta / plugin_main_file.php. Como o "slug" do plugin, o Akismet não é "akismet / akismet.php", mas é "akismet".
precisa saber é o seguinte
3
essa não é mais a resposta correta nos dois casos.
7156
@majick verdade, por Wordpress 4.7.4 não é a resposta
Marecky
2
Outra maneira de gerar a lesma do plug-in é usando dirname(plugin_basename(__FILE__)).
ilanco
2

Se você instalar o WP-CLI , poderá obter a lista de plug-ins com slug e versão na linha de comando:

> wp plugin list

Sei que provavelmente não é o que você deseja, se precisar encontrar o código no código, mas ele me ajudou a trabalhar com o plugin TGM-Plugin-Activation.

Acho difícil trabalhar com o WordPress sem o WP-CLI, em geral é uma ferramenta muito útil para muitas tarefas comuns relacionadas ao WordPress.

Thomas Bindzus
fonte
2

A diferença entre o arquivo do plug-in (principal) e a lesma do plug-in é um local em que o Codex do WordPress poderia fazer muito melhor. Entendo sua confusão como a senti muito recentemente (misturada com frustração).

Foi isso que aprendi fazendo um "trabalho de detetive" no código principal do WordPress.

O arquivo de plug-in

Esta é a maneira única que o WordPress identifica e registra um plug-in. É composto pelo diretório do plugin E pelo arquivo principal do plugin (aquele com o cabeçalho do arquivo que contém os vários detalhes do plugin, como versão, autor etc.).

Seria algo como isto: your-plugin-directory/main-file.php

Se você olhar para os dados dos plug-ins ativos (retornados por get_option( 'active_plugins' )), verá que o WordPress precisa apenas desse arquivo de plug-in para identificar corretamente os plug-ins.

Você pode optar por pensar nele como o caminho relativo do arquivo principal do plug-in (em relação ao wp-content/plugins/diretório que está). Você pode "compor" o caminho absoluto do arquivo principal do plugin com algo como isto:trailingslashit( WP_PLUGIN_DIR ) . $plugin_main_file

O próprio núcleo gera o arquivo de plug-in assim:

$plugin_main_file = plugin_basename( trim( $plugin_main_file_absolute_path ) );

A lesma do plugin

É de se esperar que o "slug" do plugin seja algum tipo de ID padronizado para o plugin, como o post slug é para posts - então você pode usar esse "slug" para fornecê-lo às principais funções do WordPress e fazer as coisas acontecerem.

Na verdade não. Depois de pesquisar no núcleo por referências a lesmas de plug-in (ou temas para o que importa) e encontrar quase nada, acho que tenho uma noção disso.

As únicas lesmas reais são aquelas para coisas acessíveis através de uma URL única: postagens, páginas, taxonomias etc. Esse é o objetivo de pegar o nome de algo (como o título de uma postagem) e gerar uma versão amigável da URL: usar em um URL.

Mas onde usamos "lesmas" de tema / plugins em URLs?

Não fazemos isso em instalações individuais do WordPress - nem no administrador do WP nem no frontend.

No entanto, há um lugar muito emaranhado com o código do WordPress , o site WordPress.org. As pessoas têm dificuldade em distinguir entre os dois, incluindo o fato de que, de alguma forma, é comum entre os desenvolvedores considerar o tema do WordPress.org ou as lesmas de plug-in que devem funcionar da mesma forma que uma publicação ou lesma de página.

Eles servem ao mesmo objetivo, mas em sites separados . No WordPress.org, eles são usados ​​para identificar exclusivamente um tema de outros e um plug-in do restante (em URLs como https://wordpress.org/plugins/akismet/).

Mas quando se trata de instalações individuais do WordPress, a mesma exclusividade não pode ser garantida, porque não há autoridade para aplicá-lo (como no WordPress.org). Poderia funcionar se todos os plugins e temas viessem do WordPress.org, mas felizmente não é esse o caso.

O que o código do WordPress faz com as lesmas de tema / plugin?

O código principal do WordPress não depende de lesmas de tema / plug-in para executar tarefas como instalar, ativar, atualizar, excluir temas ou plug-ins.

Para temas, ele se baseia no diretório de temas, já que o principal ponto de entrada de um tema é o style.cssarquivo (você não pode usar outro arquivo CSS para manter o cabeçalho de detalhes do tema).

Para plugins, ele se baseia no diretório do plug - in E no arquivo principal do plug-in , já que os plug-ins podem chamar seu arquivo principal como quiserem.

A única coisa para a qual o núcleo usa slugs de tema / plug-in é quando ele lida com temas e plug-ins do diretório WordPress.org: buscando listas de plug-ins, verificando atualizações, relatando os dados de uso do diretório e assim por diante.


Para encerrar as coisas sobre as lesmas do plug-in: sempre que você encontrar dados do plug-in com a slugentrada, 99% do tempo se referirá à lesma WordPress.org do plug-in.

Como identificamos plugins?

Se você deseja ativar, atualizar, desativar ou excluir programaticamente um determinado plug-in em uma instalação do WordPress, use o arquivo do plug-in. Você pode obtê-lo assim no arquivo principal do seu plugin:

$plugin_file = plugin_basename( __FILE__ );

Se você deseja segmentar um determinado plug-in a partir de outro, as coisas ficam um pouco mais complicadas, pois você precisa contar com um pouco de "adivinhação".

Você pode codificar o nome do plug-in, pesquisar o plug-in na lista de todos os plug-ins (consulte get_plugins () ) e obter o arquivo do plug-in a partir daí.

Se você conhece uma classe ou função definida por esse plug-in, pode usar a reflexão (consulte esta resposta para classes e esta para funções).


Espero que isso ajude você e outras pessoas que possam ter dificuldade em lidar com "lesmas de plug-ins". Poderia ter me poupado algumas horas :)

Vlad Olaru
fonte
0

Só para esclarecer desde o post original.

A maneira como encontrei a lesma do plug-in é primeiro navegando até a pasta do plug-in, abrindo a pasta associada ao plug-in e, finalmente, encontrando o arquivo que hospeda o código abaixo. Depois de encontrar esse arquivo, o nome do arquivo menos a extensão deve ser a lesma do seu plug-in.

Por exemplo, se eu encontrei o código abaixo em um arquivo chamado advanced-plugin-awesomeness.php, minha lesma seria advanced-plugin-awesomeness.

Espero que isto ajude!

/*
Plugin Name: Name of plugin here
Version: 2.4.6
Description: plugin description here
Author: plugin author here
Bolo de carne4
fonte
-1 como enquanto a maioria dos nomes de arquivos e diretórios coincidirem, este não é um método confiável como a lesma atualização é realmente o diretório - (. Salvo se não houver diretório) não o nome do arquivo
majick
ou nem mesmo o diretório! veja minha resposta atualizada, na verdade, vem do nome do plug-in.
7156
0

Infelizmente, a lesma é retornada pela API de atualização, a resposta a esta pergunta não é tão óbvia, a menos que você consulte a própria API. No entanto, se você quiser ver uma lista dos seus slugs atuais do plug-in e dos dados relacionados ao plug-in, basta:

print_r(get_site_transient('update_plugins'));

Mas, isso não terá informações sobre um plug-in recém-instalado por mais 12 horas; você teria que fazer algo diferente para eles, por exemplo. use uma versão modificada do código de wp_update_pluginsem wp-includes/update.php...

Tendo feito isso para testá-lo, parece confirmar que, independentemente do nome do arquivo, localização ou maiúscula do plug-in, é na verdade o Plugin Nameque gera a atualização, provavelmente através de sanitize_title. Portanto, acredito que a resposta correta deve ser:

// if you have the plugin basename:
// $pluginfile = WP_PLUGIN_DIR.'/'.$pluginbasename;

// otherwise if you have the absolute path already:
$plugin = get_plugin_data($pluginfile);
$pluginslug = sanitize_title($plugin['Name']);
majick
fonte
+1 e uma nota adicional é que este poder como uma mudança bem com o tempo, como foi explicitado pela equipe wordpress.org que a metodologia de cálculo lesma ainda não é totalmente final,
Mark Kaplun
Não estou certo de que este é exato, eu estava tentando fazê-lo para um plugin, mas esta falha: nome do plugin como retornado é "Responsive WordPress Slider - Soliloquy Lite" e a lesma é: solilóquio-lite
Chris
Eu suspeito que isso ocorre porque o slug é gerado no momento em que o plug-in é enviado ao repositório e não muda com o nome posteriormente ... na maioria dos casos, ele corresponde ao nome do diretório, mas se houver exceções a ambos, ele poderá seja um ou outro. não é o ideal: - /
majick 28/07
0

Você pode obter o nome da pasta do plugin (PHP5.3 +) passando DIR para plugin_basename (), assim:

$plugin_foldername = plugin_basename( __DIR__ );
jb510
fonte
0

Tente o seguinte:

function get_slugname(){
    $tmp = array();
    $plugins_all = get_plugins() ;
    $plugin_slug = explode('/',dirname(plugin_basename(__FILE__)));
    foreach ($plugins_all as $key=>$value) {
        if ($plugin_slug[0] == explode('/',$key)[0] ) {
        $tmp = $value;
        $tmp['slug'] = explode('/',$key)[0];
        $tmp['file'] = explode('/',$key)[1];
        }
    }
return $tmp;
}
ocupado
fonte
1
Por favor edite sua resposta e adicionar uma explicação do que este código faz.
Nathan Johnson
0

Para a maioria dos plugins, o "slug" será o mesmo que o nome do diretório. Embora as pessoas .org possam definir o nome do diretório para o que quiserem.

$slug = (dirname(plugin_basename(__FILE__)));
John Dee
fonte