Arquitetura de Services no WordPress: Desacoplando Lógica de Negócio com PHP Moderno

Seja muito bem-vindo ao MundoPHP.

Se você já se sentiu perdido em um arquivo functions.php com mil linhas de código, este guia é sua bússola.

Hoje vamos elevar o nível do seu desenvolvimento saindo do procedural para a Arquitetura de Services.

O que é a Camada de Serviço (Service Layer)?

Imagine que o WordPress é apenas a interface de entrada da sua aplicação.

A lógica real, como cálculos complexos ou integrações de API, não deve morar em hooks ou controllers.

Ela deve morar em classes isoladas chamadas Services.

Isso permite que iniciantes entendam o fluxo e veteranos criem testes automatizados.

O Erro Comum: Acoplamento Total

Muitos desenvolvedores inserem regras de negócio diretamente no hook `save_post`.

Isso torna o código rígido e difícil de manter.

Veja este exemplo do que evitar no seu dia a dia.


// NÃO FAÇA ISSO: Lógica misturada com o Hook
add_action('save_post', function($post_id) {
    $email = get_post_meta($post_id, '_cliente_email', true);
    // Validação e envio de e-mail perdidos aqui dentro
    if (strpos($email, '@') !== false) {
        mail($email, 'Assunto', 'Mensagem');
    }
});

A Solução: Refatorando para Service

Primeiro, definimos uma interface para garantir que nosso código siga um contrato.


namespace MundoPHP\Interfaces;

interface NotificationServiceInterface {
    public function sendWelcomeEmail(string $email): bool;
}

Em seguida, criamos a implementação concreta da nossa Service.


namespace MundoPHP\Services;

use MundoPHP\Interfaces\NotificationServiceInterface;

class EmailService implements NotificationServiceInterface {
    public function sendWelcomeEmail(string $email): bool {
        // Aqui você poderia usar PHPMailer ou uma API externa
        return wp_mail($email, 'Bem-vindo ao MundoPHP', 'Conteúdo VIP');
    }
}

Injeção de Dependência para Usuários Avançados

Para levar seu projeto ao nível sênior, utilize Injeção de Dependência.

Em vez de instanciar o serviço com `new`, passe-o como argumento.

Isso facilita o uso de Mocks em testes unitários.


class UserController {
    private $notifier;

    public function __construct(NotificationServiceInterface $notifier) {
        $this->notifier = $notifier;
    }

    public function register(string $email) {
        // Lógica de registro...
        return $this->notifier->sendWelcomeEmail($email);
    }
}

Dicas Práticas de MySQL para WordPress

Sempre que trabalhar com SQL no WordPress, use a classe global $wpdb.

Nunca concatene variáveis diretamente nas suas queries.

Utilize sempre a função `prepare()` para evitar ataques de SQL Injection.


global $wpdb;
$query = $wpdb->prepare(
    "SELECT * FROM {$wpdb->posts} WHERE ID = %d",
    $id_do_post
);

Conclusão e Próximos Passos

Mudar a forma como organizamos o código exige disciplina.

Entretanto, o ganho em escalabilidade compensa cada minuto investido.

A arquitetura de software não é exclusividade de frameworks como Laravel.

O ecossistema WordPress é poderoso e aceita perfeitamente padrões modernos de design.

Experimente mover sua primeira lógica de “functions.php” para uma Service hoje.

Ficou com alguma dúvida sobre como implementar o Autoloader para essas classes?

Deixe seu comentário abaixo e vamos evoluir juntos!

Rolar para cima