O problema
Todos nós já passamos por uma situação como essa e muitas perguntas neste site precisam de uma solução como essa. Você precisa atualizar um banco de dados, inserir muitos dados automaticamente, converter meta_keys
ou algo semelhante.
Obviamente, em um sistema em execução baseado nas melhores práticas, isso não deve acontecer.
Mas, como isso acontece, eu adoraria ouvir sua solução pessoal para esse problema e por que você escolheu a sua.
A questão
Como você implementa scripts únicos na sua instalação do WordPress (em execução)?
O problema aqui é principalmente devido aos seguintes motivos:
- Os scripts que inserem dados não devem ser executados mais de uma vez
- Os scripts que requerem muitos recursos não devem ser executados no momento em que não podem ser monitorados
- Eles não devem ser executados por acidente
A razão pela qual pergunto
Eu tenho minha própria prática, vou postar nas respostas. Como não sei se é a melhor solução existente, gostaria de saber sobre a sua. Além disso, essa é uma pergunta que é feita muitas vezes no contexto de outras perguntas, e seria ótimo ter um recurso para coletar as idéias.
ansioso para aprender com você :)
fonte
wp-cron
eventos agendados.Respostas:
Eu, pessoalmente, uso uma combinação de:
Estrutura
Eu uso um arquivo (
onetime.php
) na minha pasta de inclusãoinc
, que é incluída nofunctions.php
e excluída de lá após o uso.O arquivo para o próprio script
Na minha
onetime.php
funçãof711_my_onetime_function()
é colocada. Como poderia ser qualquer função. Presumo que seu script foi testado e funciona corretamente.Para obter o controle sobre a execução do script, eu uso os dois
Controle de capacidade
Para impedir que outros usuários executem acidentalmente meu script:
ou
um transitório
para me impedir de executar o script acidentalmente mais de uma vez.
O arquivo para executar o script na minha função
f711_my_onetime_function()
ficaria assim:A razão pela qual defini o transitório imediatamente após a verificação, se ela existe, é que desejo que a função seja executada após o bloqueio do script de ser usado duas vezes.
Se precisar de alguma saída da minha função, imprimo-a como um comentário no rodapé ou às vezes até filtre o conteúdo.
O tempo de bloqueio é definido como 10 minutos, mas pode ser ajustado às suas necessidades.
Limpar
Após a execução bem-sucedida do meu script eu apagar o
include
dofunctions.php
e remova aonetime.php
partir do servidor. Como usei um tempo limite para o transitório, não preciso limpar o banco de dados, mas é claro que você também pode excluir o transitório depois de remover o arquivo.fonte
Você também pode fazer isso:
execute
onetime.php
e renomeie-o após a execução.fonte
Eu criei um script Phing da linha de comando para isso, não é nada especial além de carregar um script externo para executar. O motivo pelo qual eu o usei via CLI é porque:
Assim, você pode usar o Phing ou a CLI do PHP e dormir à noite. O WP-CLI também é uma boa alternativa, embora eu esqueça que você pode usá-lo fora da raiz da web.
Como esta é uma publicação popular, aqui está um exemplo do script: https://github.com/wycks/WordPhing (run.php)
fonte
Outra maneira bastante simples de executar um script único é fazer isso por meio de um plug-in MU.
Coloque o código em algum arquivo PHP (por exemplo,
one-time.php
) que você carrega na pasta dos plugins do MU (por padrão/wp-content/mu-plugins
), ajuste as permissões do arquivo, execute o plug-in (ou seja, de acordo com o gancho escolhido, você basicamente só precisa visitar o frontend / back-end) e pronto.Aqui está um boilerplate:
Sem os comentários e outras coisas, fica assim:
fonte
Sob condições ideais, eu ssh no servidor e executaria a função usando wp-cli.
No entanto, isso geralmente não é possível, então eu tendem a definir uma variável $ _GET e conectá-la ao 'init', por exemplo:
então aperte
e desative o gancho quando terminar.
fonte
Às vezes, usei uma função ligada à desativação de plugins.
Veja aqui Atualizar links antigos para Pretty Permalinks Tipo de postagem personalizada
Uma vez que apenas os administradores podem ativar plug-ins, há uma verificação de capacidade como efeito colateral.
Não há necessidade de excluir o arquivo, uma vez desativado, ele não será incluído pelo wordress. Além disso, se você quiser correr de novo, pode. Ativando e desativando novamente.
E às vezes eu usei transitória como na resposta @fischi. Por exemplo, consulta aqui para criar produtos de woocommerce a partir de imagens ou aqui Excluir / substituir tags img no conteúdo da postagem para postagens publicadas automaticamente
Uma combinação de ambos pode ser uma alternativa.
fonte
Definitivamente você pode, basta criar seu código único como um plugin.
Problema: como ativo este plug-in sem clicar no link Ativar?
basta adicionar
activate_plugins('onetime/index.php');
emfunctions.php
ou Use deve usar plugins, http://codex.wordpress.org/Must_Use_Plugins
Tente com ações diferentes, como quando você deseja executar o plug-in onetime,
admin_init - depois do admin init
init - inic. wordpress
wp - quando o wordpress é carregado
fonte
Outra maneira é definir uma opção wp_option global quando o trabalho estiver concluído e verificar essa opção sempre que o gancho init for executado.
Naturalmente, você não precisa ter esse código para sempre (mesmo que seja uma simples leitura do banco de dados); portanto, você provavelmente poderá remover o código quando o trabalho estiver concluído. Além disso, você pode alterar manualmente esse valor da opção para 0 se precisar executar novamente o código.
fonte
Minha abordagem é um pouco diferente nisso. Eu gosto de adicionar meu script único como uma função no function.php do meu tema e executá-lo em uma consulta GET específica.
Para executar isso, basta visitar o URL "www.sitename.com/?linkupdate"
Isso está funcionando bem para mim até agora ...
Este método tem alguma desvantagem? Apenas me perguntando...
fonte
Acabei de usar uma única página de modelo de produto personalizado que não estou usando e não está conectada a nada no servidor público.
Por exemplo, se eu tiver uma página de testemunho que não esteja ativa (no modo rascunho, ou o que for), mas conectada a um único modelo de página, por exemplo
single-testimonial.php
- eu posso colocar funções lá, carregar a página por meio de umapreview
função e o que for lançado uma vez. Também é muito fácil fazer modificações na função em caso de depuração.É realmente fácil e eu prefiro usá-lo
init
porque tenho mais controle sobre quando e como ele será lançado. Apenas minha preferência.fonte
Caso isso ajude, foi o que eu fiz e funciona bem:
fonte