WordPress - Separando as responsabilidades

Vamos começar a organizar melhor nosso tema, separando as responsabilidades. Tiraremos toda a lógica da view, e trataremos em controllers separados. Vamos ver como isso fica na prática? ;)

Pra começar, acompanhe o tema que estamos desenvolvendo juntos: https://github.com/fdaciuk/wordpress-base-theme-da2k.com.br

A grande vantagem de trabalhar com o WordPress, é que ele não nos prende a uma estrutura específica. Precisamos seguir algumas convenções, mas podemos facilmente organizar nossos arquivos e separar como cada coisa é feita de forma bem fácil.

Esse formato que vou mostrar hoje, é como eu uso nos meus projetos. É importante que fique claro que, existem várias formas de fazer o que veremos hoje. Essa não é a forma “absolutamente certa”, mas é como resolve os problemas pra mim.

Chega de lenga-lenga, vamos ao que interessa: código!

Single

No último post, vimos que, no WordPress, temos alguns Tipos de Conteúdo padrão, mas que também podemos criar os nossos próprios. Hoje veremos o template single.php.

Então, antes de qualquer coisa, crie esse arquivo na raiz do seu tema. Nossa estrutura agora deve estar assim:

1
2
3
4
5
6
7
8
9
.
├── footer.php
├── /functions
│   └── security.php
├── functions.php
├── header.php
├── index.php
├── single.php
└── style.css

Fazendo isso, vamos começar a brincadeira! O single.php serve para mostrar uma postagem específica.
Quando você acessa a URL de um post, por exemplo, o WordPress procura usa esse template para renderizar o post.

Mas o single.php vai muito além disso: segundo a hierarquia de templates do WordPress, quando você acessa a URL de uma postagem (seja do Post Type “post” ou qualquer outro criado por você), a busca pelo template é feita na seguinte ordem:

Primeiro o WordPress procura na raiz da sua aplicação, um arquivo chamado single-{post-type}.php, onde `{post-type} é o nome do seu Post Type.

Exemplo: imagine que você tem um Post Type chamado filmes, e você quer acessar a URL que leva para o filme The Avengers. Ao acessar a URL http://seusite.com.br/filmes/the-avengers/, o WordPress irá verificar se no seu tema você tem um arquivo chamado single-filmes.php.

Se esse arquivo não existir, o WordPress vai procurar o arquivo single.php (que é o que estamos vendo agora). Se encontrar, é nese arquivo que a postagem será renderizada. Senão, a renderização é feita na index.php.

Perceba que a index.php é o fallback para todos os templates, por isso é importante mantê-la no seu projeto, ainda que você quase não a use, ou use pouco. Fazendo a cópia da index.php na single.php, nossa single deve estar com essa estrutura:

Estrutura da single.php

Mantivemos essa estrutura, pois precisamos apenas mostrar um post. Não é necessário o loop aqui, somente as template tags.

Interface

Para separar as responsabilidades, não podemos deixar lógica alguma na nossa view. Os templates que o WordPress disponibiliza não deveriam ter nenhuma lógica ou regra de negócio. Isso precisa ficar em arquivos à parte.

No nosso caso, vamos utilizar controllers para nos ajudar a organizar as coisas. Crie no diretório functions/, um outro diretório chamado controllers. E dentro desse diretório, crie um arquivo chamado controller-single.php. A nossa estrutura agora deveria estar assim:

1
2
3
4
5
6
7
8
9
10
11
.
├── footer.php
├── /functions
│   ├── /controllers
│   │   └── controller-single.php
│   └── security.php
├── functions.php
├── header.php
├── index.php
├── single.php
└── style.css

Cada controller conterá uma classe PHP, que irá responder por uma página específica, ou por URL. No nosso caso, estamos criando primeiramente um controller que vai gerenciar nossa single.php.

Vamos agora fazer algumas mudanças na single.php. Primeiro de tudo, vamos criar nossa interface. Nosso single deve ficar assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
require_once 'functions/security.php';
get_header();
?>

<?php echo $single_post->thumbnail ?>

<h2>
<?php echo $single_post->title ?>
</h2>

<div class="content">
<?php echo $single_post->content ?>
</div>

<?php get_footer() ?>

O que é significa “ter uma interface” o por que precisamos de uma?

A interface são os métodos e propriedades públicas da classe que vai controlar o conteúdo mostrado na nossa single. Primeiramente nós colocamos na nossa view, o que nós esperamos que seja retornado.

Podemos ver nesse exemplo que:

  • a variável $single_post recebe um objeto;
  • esperamos que sejam retornadas 3 informações: thumbnail, title e content, como propriedades do objeto $single_post.

Mas de onde vêm esses dados?

Do controller! É ele que vai cuidar de toda a lógica para que nossa view se mantenha assim, limpa! A view deve somente “cuspir” as informações. Nada de zona na view! Nada de lógica de PHP e estruturas gigantes! Vamos separar as responsabilidades para que nosso código fique legível e fácil de editar!

No próximo post, vamos ver como ficará nosso controller, e como ele irá tratar as informações para devolver à view!

Ficou com alguma dúvida? Comente!

Até a próxima! :D

Link para o índice dessa série:
https://blog.da2k.com.br/2015/01/11/indice-da-serie-como-criar-temas-para-wordpress/

Post anterior:
https://blog.da2k.com.br/2015/02/03/wordpress-tipos-de-conteudo/

Próximo post:
https://blog.da2k.com.br/2015/02/11/wordpress-controlando-a-exibicao-dos-dados/

Sobre o #1postperday: https://blog.da2k.com.br/2014/12/31/um-post-por-dia/

Tem alguma sugestão para os próximos posts do #1postperday? Deixe ela aqui: https://github.com/fdaciuk/fdaciuk.github.io/issues/1