Estou desenvolvendo algum plug-in no qual gostaria de ativar páginas personalizadas. No meu caso, uma página personalizada conteria um formulário como o formulário de contato (não literalmente). Quando o usuário preencher este formulário e enviá-lo, deverá haver o próximo passo que exigirá mais informações. Digamos que a primeira página com o formulário esteja localizada no www.domain.tld/custom-page/
e após o envio bem-sucedido do formulário, o usuário deve ser redirecionado para www.domain.tld/custom-page/second
. O modelo com elementos HTML e código PHP também deve ser personalizado.
Penso que uma parte do problema é possível de obter com reescritas de URL personalizadas, mas as outras partes são atualmente desconhecidas para mim. Realmente não sei onde devo começar a procurar e qual é a nomenclatura correta para esse problema. Qualquer ajuda seria muito apreciada.
Respostas:
Quando você visita uma página de front-end, o WordPress consulta o banco de dados e, se sua página não existir no banco de dados, essa consulta não é necessária e é apenas um desperdício de recursos.
Felizmente, o WordPress oferece uma maneira de lidar com solicitações de front-end de maneira personalizada. Isso é feito graças ao
'do_parse_request'
filtro.Voltando
false
ao assunto, você poderá impedir o WordPress de processar solicitações e fazê-lo da sua maneira personalizada.Dito isso, quero compartilhar uma maneira de criar um plug-in OOP simples que possa lidar com páginas virtuais de uma maneira fácil de usar (e reutilizar).
O que precisamos
Interfaces
Antes de criar classes, vamos escrever as interfaces para os 3 objetos listados acima.
Primeiro a interface da página (arquivo
PageInterface.php
):A maioria dos métodos são apenas getters e setters, sem necessidade de explicação. O último método deve ser usado para obter um
WP_Post
objeto de uma página virtual.A interface do controlador (arquivo
ControllerInterface.php
):e a interface do carregador de modelos (arquivo
TemplateLoaderInterface.php
):Os comentários do phpDoc devem ser bem claros para essas interfaces.
O plano
Agora que temos interfaces, e antes de escrever classes concretas, vamos revisar nosso fluxo de trabalho:
Controller
classe (implementandoControllerInterface
) e injetamos (provavelmente em um construtor) uma instância daTemplateLoader
classe (implementandoTemplateLoaderInterface
)init
gancho, chamamos oControllerInterface::init()
método para configurar o controlador e acionar o gancho que o código do consumidor usará para adicionar páginas virtuais.ControllerInterface::dispatch()
, e não vamos verificar todas as páginas virtuais adicionado e se um deles tem o mesmo URL da solicitação atual, exibi-lo; depois de definir todas as principais variáveis globais ($wp_query
,$post
). Também usaremos aTemplateLoader
classe para carregar o modelo certo.Durante este fluxo de trabalho que irá desencadear alguns ganchos do núcleo, como
wp
,template_redirect
,template_include
... para fazer o plugin mais flexível e garantir a compatibilidade com núcleo e outros plugins, ou pelo menos com um bom número deles.Além do fluxo de trabalho anterior, também precisamos:
the_permalink
para fazê-lo retornar o URL da página virtual correta quando necessário.Classes de concreto
Agora podemos codificar nossas classes concretas. Vamos começar com a classe da página (arquivo
Page.php
):Nada mais do que implementar a interface.
Agora a classe do controlador (arquivo
Controller.php
):Essencialmente, a classe cria um
SplObjectStorage
objeto em que todos os objetos das páginas adicionadas são armazenados.Em
'do_parse_request'
, a classe do controlador faz um loop nesse armazenamento para encontrar uma correspondência para o URL atual em uma das páginas adicionadas.Se for encontrada, a classe fará exatamente o que planejamos: acionar alguns ganchos, configurar variáveis e carregar o modelo por meio da extensão da classe
TemplateLoaderInterface
. Depois disso, apenasexit()
.Então, vamos escrever a última aula:
Os modelos armazenados na página virtual são mesclados em uma matriz com os padrões
page.php
eindex.php
, antes de o modelo de carregamento'template_redirect'
ser acionado, para adicionar flexibilidade e melhorar a compatibilidade.Depois disso, o modelo encontrado passa pelos filtros personalizados
'virtual_page_template'
e principais'template_include'
: novamente para flexibilidade e compatibilidade.Finalmente, o arquivo de modelo é carregado apenas.
Arquivo principal do plugin
Nesse ponto, precisamos escrever o arquivo com os cabeçalhos do plug-in e usá-lo para adicionar os ganchos que farão nosso fluxo de trabalho acontecer:
No arquivo real, provavelmente adicionaremos mais cabeçalhos, como links para plugins e autores, descrição, licença, etc.
Gist de plug-ins
Ok, terminamos com o nosso plugin. Todo o código pode ser encontrado em um Gist aqui .
Adicionando páginas
O plug-in está pronto e funcionando, mas não adicionamos nenhuma página.
Isso pode ser feito dentro do próprio plugin, dentro do tema
functions.php
, em outro plugin, etc.Adicionar páginas é apenas uma questão de:
E assim por diante. Você pode adicionar todas as páginas necessárias, lembre-se de usar URLs relativos para as páginas.
Dentro do arquivo de modelo, você pode usar todas as tags de modelo do WordPress e escrever todo o PHP e HTML necessário.
O objeto global de postagem é preenchido com dados provenientes de nossa página virtual. A própria página virtual pode ser acessada via
$wp_query->virtual_page
variável.Para obter o URL de uma página virtual, é tão fácil quanto passar para
home_url()
o mesmo caminho usado para criar a página:Observe que no loop principal do modelo carregado,
the_permalink()
retornará o link permanente correto para a página virtual.Notas sobre estilos / scripts para páginas virtuais
Provavelmente, quando as páginas virtuais são adicionadas, também é desejável ter estilos / scripts personalizados enfileirados e usar apenas
wp_head()
em modelos personalizados.Isso é muito fácil, porque as páginas virtuais são facilmente reconhecidas olhando para
$wp_query->virtual_page
variáveis e as páginas virtuais podem ser distinguidas uma da outra olhando para seus URLs.Apenas um exemplo:
Notas para OP
A passagem de dados de uma página para outra não está relacionada a essas páginas virtuais, mas é apenas uma tarefa genérica.
No entanto, se você possui um formulário na primeira página e deseja passar dados de lá para a segunda página, basta usar o URL da segunda página na
action
propriedade de formulário .Por exemplo, no primeiro arquivo de modelo de página, você pode:
e depois no arquivo de modelo da segunda página:
fonte
wordpress/virtual-page
e o URL aparado da página évirtual-page
.Uma vez, usei uma solução descrita aqui: http://scott.sherrillmix.com/blog/blogger/creating-a-better-fake-post-with-a-wordpress-plugin/
Na verdade, quando eu o estava usando, estendi a solução de forma a poder registrar mais de uma página por vez (o restante do código é +/- semelhante à solução que estou vinculando a partir de um parágrafo acima).
A solução exige que você tenha bons links permanentes permitidos ...
fonte
content
na matriz quando você está registrando, a página falsa está sendo exibida no corpo da página - ela pode conter um HTML, além de texto simples ou até um código curto.