Nota: Esta resposta está aqui apenas para facilitar a discussão entre @scribu e @kaiser. Mods: por favor, não exclua. Usuários / Leitores: Por favor, não vote. Se você deseja acompanhar a discussão, consulte o log de revisão / edição. Se você quiser participar da discussão, edite a resposta. Se a discussão tiver resultado, ela será marcada como tal. Obrigado.
Cenários
Também existem cenários diferentes com peso diferente, nos quais você pode ter uma dependência de plug-in. (Os exemplos são apenas fictícios). A palavra "(pai) Plugin" pode ser trocada com "Tema" do ponto de vista dos pais.
- (difícil) Um plug-in filho que apenas estende a funcionalidade ou altera a exibição (e semelhante) de um plug-in existente e, portanto, não pode existir sem o pai. Exemplo: BuddyPress »BuddyPress-FunkyCommentDisplay
- (normal) Um plug-in que possui funcionalidade estendida quando um plug-in filho é ativado. Exemplo: jQueryAttachmentCarousel »jQuerySlideDeck
- (flexível) Um plug-in que apenas adiciona um recurso. Exemplo: DisneyWonderlandTheme »MickeysSocialLinks
A seguir, tento esboçar o que acontece quando você atualiza o plug-in "other" e a verificação não funciona mais.
- Anúncio 1) O plugin não poderia existir sem o BuddyPress ativado »O material está completamente quebrado.
- Anúncio 2) O plug-in não pôde oferecer a opção de alternar entre o Carrossel e o SlideDeck ».
- Anúncio 3) Os MickeysSocialLinks desaparecem.
Verifica
Existem três possibilidades de verificação, se você quiser saber se um plug-in está ativo:
- A. A pasta existe?
- B. O arquivo principal - opção
'active_plugins'
- existe?
- C. Existe uma função específica?
Se agora eu pegar meu plug-in Verificador de Link Interno como exemplo, que não oferece API pública e não deve ser estendido, não vejo motivo (como autor) para não alterar a nomeação de função interna sob demanda ou apenas por vontade . Portanto, se alguém tentasse pegar carona nesse plug-in, as coisas simplesmente quebrariam (dependendo da funcionalidade e da rigidez do pacote) na atualização. O mesmo vale para nomes de arquivos. Eu não teria nenhum motivo real (além disso, o plug-in seria desativado na atualização) para não alterar o nome do arquivo. A única coisa que me impediria de alterar o nome da pasta é que a verificação e notificação da atualização sejam executadas no nome do arquivo - se ele estiver hospedado no repositório oficial.
Então, eu diria que da parte mais fraca (fácil de mudar) para a mais difícil (muito falamos contra a mudança) de um plug-in (principal) seria:
função »nome do arquivo principal» pasta
Quando eu disse que uma verificação de função é menos frágil do que usar is_plugin_active()
, presumi que a função em questão é aquela que o autor do plug-in incentiva explicitamente. O exemplo final disso seria a wp_pagenavi()
tag de modelo oferecida pelo plugin WP-PageNavi.
A dificuldade em definir dependências é que não existe uma maneira padrão de identificar exclusivamente plugins que não envolvam nomes de arquivos.
Mais pensamentos sobre o assunto:
http://wordpress.org/support/topic/plugin-plugin-dependencies-unreliable-plugin-namingidentifying-scheme
Acho que até agora podemos resumir em três pontos:
- Nós conversamos sobre tópicos ligeiramente diferentes
- Concordamos que não há uma maneira à prova de balas para contornar o que eu pensei que o tópico seria
- Pela sua compreensão da pergunta, você ofereceu um caminho válido a seguir
A maneira (até agora) mais inteligente que consigo pensar, que eu já vi em alguns (muito menos) plugins:
// inside the plugin file:
add_action( 'plugin_custom_hook', 'plugin_trigger' );
// inside some template:
do_action( 'plugin_custom_hook' );
Sem pensar muito em detalhes, mas acho que você pode conectar seu aviso a um filtro 'all' e verificar o filtro atual se ele foi acionado quando você está no shutdown
gancho ...?
Usar ganchos funcionaria bem para dependências 'normais' e 'fracas'. A única desvantagem é que você ainda precisará usar function_exists()
ou is_plugin_active()
se deseja parar se a dependência não for atendida. Usar o filtro 'all' para isso seria IMO muito caro.
@scibu Este tópico foi direcionado ao tópico "seu". (Eu já deixei de falar sobre o meu). :)
Então, basicamente, se você precisar de uma dependência - e você tiver um bom autor -, ele poderá oferecer um gancho em vez disso / como substituto para uma tag de modelo. Porque o plug-in apenas se conectaria a ele se o gancho estivesse presente ou simplesmente não faria nada. E por outro lado, você não teria um erro quando os plugins não estivessem presentes.
Aqui está a parte difícil (ou mais das perguntas mais frequentes): Para escrever um aviso de administrador para informar o usuário sobre a dependência "Você precisa instalar» DisneyWonderLinks «", verifique o array_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] )
. Não tenho certeza se isso funcionaria, mas depois que a matriz deve estar acessível em ambos os lados (público / administrador).
Isso não funcionaria. Só porque um retorno de chamada está registrado em um gancho não significa que o gancho será acionado quando esperado. A única coisa que seria tipo de trabalho é usar o gancho 'shutdown', que você mencionou antes:
add_action( 'shutdown', function() {
if ( !did_action( 'template_tag_like_hook' ) )
echo 'Problem.';
} );
Obviamente, isso seria impresso na parte inferior, após a </html>
tag, no front-end (já que é onde as tags de modelo são normalmente usadas), o que não é de muita utilidade.
Você pode tentar armazenar a mensagem em wp_options e exibi-la na área de administração, mas isso abriria uma nova lata de worms: invalidação, plugins de cache etc.
function_exists
, um usuário normal simplesmente receberá a mensagem de que ele não instalou o plug-in em que outro plug-in se baseia. O problema é que o usuário realmente terá o plug-in instalado e então se pergunte por que ele não funciona . Ah, e eu não vou te rebaixar por isso.