after_setup_theme sempre é executado

11

Estou configurando um tema infantil para alguns dos membros do meu corpo docente e, como parte do tema, gostaria que um punhado de plug-ins fosse ativado no momento em que o tema fosse ativado. Então, naturalmente, usei a ação after_setup_theme e chamei minha função de configuração. Funciona muito bem, exceto que é executado em TODAS as solicitações (admin e outras). Eu provei isso adicionando isso ao final da função de instalação:

echo '<script type="text/javascript">alert("This action was run")</script>';

E, como resultado, receba um alerta javascript em todas as solicitações de administrador e solicitações de front-end (eu tenho uma configuração de rede, portanto, obviamente, em sites onde esse tema não está ativo, não está executando a função)

Então a questão é: isso é um bug? De alguma forma, estou fazendo algo errado? Aqui está o código completo que estou usando:

add_action( 'after_setup_theme', 'fwp_setup' );
function fwp_setup(){
    // -- Unrelated code remove for the sake of brevity 
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-admin/includes/plugin.php');
    activate_plugin('enable-media-replace/enable-media-replace.php');
    activate_plugin('seo-image/seo-friendly-images.php');
    activate_plugin('w3-total-cache/w3-total-cache.php');
    echo '<script type="text/javascript">alert("This action was run")</script>';
}

Qualquer visão seria muito apreciada!

Aaron Wagner
fonte
SOLUÇÃO: after_switch_themefaz exatamente o que pretendi aqui. É acionado depois que o tema é alternado para o seu tema. Uma das soluções mencionadas abaixo é usada switch_theme. Isso não tem os resultados desejados, pois só acontece após a mudança do tema. Faça referência ao comentário do Trac
Aaron Wagner
poste isso como uma resposta , e não como um comentário para sua pergunta. :)
Chip Bennett
2
Desculpas. Ainda não me deixaria fazer isso. Vou adicioná-lo como resposta daqui a pouco.
26412 Aaron Wagner

Respostas:

8

SOLUÇÃO: after_switch_themefaz exatamente o que pretendi aqui. É acionado depois que o tema é alternado para o seu tema. Uma das soluções mencionadas abaixo é usada switch_theme. Isso não tem os resultados desejados, pois só acontece após a mudança do tema.

Aqui está um artigo que eu achei como referência: http://core.trac.wordpress.org/ticket/7795#comment:29

Aqui está o meu código modificado

add_action( 'after_switch_theme', 'fwp_theme_setup' );
function fwp_theme_setup(){ 
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-admin/includes/plugin.php');
    activate_plugin('enable-media-replace/enable-media-replace.php');
    activate_plugin('seo-image/seo-friendly-images.php');
    activate_plugin('w3-total-cache/w3-total-cache.php');
}
Aaron Wagner
fonte
5

A after_setup_themeação visa disparar em cada carregamento do WordPress. É simplesmente parte do processo durante o qual o WordPress chama o sistema de modelos, determina os vários parâmetros de configuração do Tema e prossegue com o processamento subsequente, como determinar o modelo correto a ser exibido etc.

Em outras palavras, after_setup_themerepresenta o ponto em que o WordPress configura o Tema atual, não o ponto em que o administrador ativa e / ou configura o Tema atual.

O que você está procurando é um gancho de ativação de Tema , que atualmente não está disponível, mas está em consideração / desenvolvimento .

Chip Bennett
fonte
O link de entrada do Codex é terrivelmente enganador. Ele diz "Este gancho é chamado durante uma inicialização de temas". Isso significa, para mim, que o gancho deve ser chamado quando for ativado. Eu entendo o que você está dizendo. Terrivelmente enganador.
Aaron Wagner
5
init !== activation. Normalmente você chama __construct()função no php também uma initfunção. Isso significa: Inicialize a instância.
kaiser
O bilhete trac tem 7 anos e parece que não será consertado!
Numeroweb
4

Infelizmente, não há gancho de ativação de tema. No entanto, essa pergunta fornece uma solução alternativa para isso.

Basta usar o 'gancho de ativação do tema' para ativar os plug-ins.

Uma solução melhor, na mesma linha, é essa . Ambos usam essencialmente o switch_themegancho.


De acordo com os comentários do OP e o ticket trac vinculado - after_switch_themeé o gancho necessário.

Isso passa o nome do tema antigo como argumento. No entanto, se isso estiver no seu functions.php(que deveria ser ...), o retorno de chamada será acionado apenas quando o seu tema estiver sendo ativado .

add_action( 'after_switch_theme', 'wpse50298_setup' );
function wpse50298_setup($theme_switching_from){
    // Your theme is being activated
}

Da mesma forma, adicione um retorno de chamada para switch_themesomente será chamado quando seu tema for desativado.

add_action( 'switch_theme', 'wpse50298_deactivate' );
function wpse50298_deactivate($theme_switching_to){
    // Your theme is being deactivated
}
Stephen Harris
fonte
Nenhuma dessas opções funcionou para mim. switch_themesó funcionou após a desativação do tema. No entanto, after_switch_themefuncionou perfeitamente.
26612 Aaron Wagner
1
resposta atualizada :)
Stephen Harris
switch_theme parece não funcionar mais. Eu acho que é por causa das mudanças na ativação do 3.4. Pelo menos não está funcionando para mim.
Jake3
after_switch_theme funciona perfeito. Essa deve ser a resposta aceita. Estou usando o WP 3.5
Ardee Aram
0

Uma solução melhor pode ser usar o script de ativação do plugin de Thomas Griffin . Isso solicitará que os usuários instalem plug-ins de sua escolha quando o tema estiver em uso. Eu acho que essa é uma ótima maneira de separar o plug-in do tema e ainda obter o uso dele.

Dentro do seu tema, verifique se o plug-in está ativo antes de usar suas funções. Isso permitirá aos usuários mais opções e controle.

Você pode configurar o script de ativação facilmente com o Knapsack .

Jeff Sebring
fonte
3
Uma resposta deve ser mais do que apenas um link para um site externo . Por favor, adicione uma solução.
fuxia
0

Sua melhor solução agora seria usar switch_themehook e filtrar o argumento '$ theme' passado para ver se é o atual deles e se não retornar;

function nw_update_network($theme) {
   if ($theme !== 'my_theme_name') return;

   // Your code here
}

add_action('switch_theme', 'nw_update_network');
numediaweb
fonte