# Gustavo Portfolio — Tema WordPress Tema WordPress clássico para o portfólio e blog de **Gustavo Oliveira** — [gustavoo.me](https://gustavoo.me) ## Screenshot ![Theme Screenshot](wp-content/themes/gustavoo-portfolio/screenshot.png) ## Sobre Tema WordPress clássico desenvolvido para o portfólio pessoal e blog de Gustavo Oliveira, desenvolvedor Full Stack Sênior. O tema foi construído com foco em performance, acessibilidade e experiência do usuário, utilizando as melhores práticas do WordPress moderno. ## Características - **Tema Clássico** — Template hierarchy tradicional do WordPress - **Theme.json** — Configuração completa de estilos via theme.json (cores, tipografia, espaçamento, bordas) - **Blocos Nativos** — Suporte completo a blocos do Gutenberg - **Fluent Forms + FluentCRM** — Integração nativa para formulários e newsletter - **Portfólio de Projetos** — CPT customizado para exibição de projetos - **Newsletter Widget** — Widget personalizado para FluentCRM - **SEO Ready** — Estrutura semântica e meta tags otimizadas - **Performance** — Assets otimizados, fontes variáveis (Inter Variable), lazy loading nativo ## Stack - **WordPress** 6.5+ - **PHP** 8.1+ - **Theme.json** v3 - **Inter Variable Font** (local, self-hosted) - **Fluent Forms** + **FluentCRM** (integração via plugin complementar) - **Docker Compose** para desenvolvimento local ## Estrutura do Tema ``` gustavoo-portfolio/ ├── assets/ │ └── fonts/ # Inter Variable Font (woff2) ├── inc/ │ ├── customizer.php # Personalizador do tema │ ├── defaults.php # Configurações padrão (theme.json fallback) │ ├── enqueue.php # Assets e estilos │ ├── forms.php # Integração Fluent Forms │ ├── setup.php # Configuração do tema │ ├── template-tags.php # Template tags auxiliares │ └── widgets.php # Widget Newsletter (FluentCRM) ├── template-parts/ # Partes de template reutilizáveis ├── 404.php ├── archive.php ├── category.php ├── comments.php ├── footer.php ├── front-page.php # Página inicial customizada ├── functions.php # Bootstrap do tema ├── header.php ├── home.php ├── index.php ├── page.php ├── search.php ├── searchform.php ├── sidebar.php ├── single.php ├── screenshot.png # Screenshot do tema (theme.png) ├── style.css # Stylesheet principal (metadados do tema) └── theme.json # Configuração global de estilos ``` ## Plugin Complementar O tema funciona em conjunto com o plugin **Gustavo Portfolio Core** (`wp-content/plugins/gustavoo-portfolio-core`), que provê: - **CPT Projetos** — Post type customizado para portfólio - **Configurações Globais** — Opções de hero, sobre, projetos, blog, contato, newsletter e redes sociais - **Seeder** — Criação automática de páginas, formulários Fluent Forms e feeds FluentCRM - **Widget Newsletter** — Widget para exibir formulário de newsletter no sidebar ## Desenvolvimento Local ### Pré-requisitos O tema e plugin dependem dos seguintes plugins WordPress (instalados e ativados): - **Fluent Forms** — Formulários de contato e newsletter - **FluentCRM** — Automação de marketing e newsletter ```bash # Criar o arquivo de variáveis de ambiente (obrigatório) cp .env.example .env # Edite o .env com suas credenciais (senhas do banco, porta, etc.) # Subir ambiente Docker (instala e configura tudo automaticamente) docker compose up -d # Acompanhar a instalação docker compose logs -f wpcli # Acessar WordPress # http://localhost:8080 # Usuário: admin | Senha: admin (definido no .env) # Instalar dependências (plugins obrigatórios) # 1. Acesse http://localhost:8080/wp-admin # 2. Plugins → Adicionar novo → Busque e instale: # - Fluent Forms # - FluentCRM # 3. Ative ambos os plugins # Logs docker compose logs -f wordpress ``` ### O que acontece a cada `docker compose up` O serviço `wpcli` roda o `docker/wp-init.sh` e detecta o estado do banco: **Primeira execução (banco vazio) — instalação** 1. `wp core install` com URL/título/admin definidos no `.env` 2. Pacote de idioma `pt_BR` 3. Instala do WordPress.org os plugins de `WP_EXTRA_PLUGINS` (Post Views Counter, Rank Math SEO, Site Kit, Fluent Forms, FluentCRM, FluentSMTP) — só se faltarem 4. Ativa **todos** os plugins de `wp-content/plugins/` e remove os que o WordPress traz (`akismet`, `hello`) 5. Redis: constantes no `wp-config.php`, plugin, drop-in `object-cache.php` e verificação de conexão 6. Configura o Post Views Counter: conta **posts e páginas**, posição **Manual only** 7. Ativa o tema `gustavoo-portfolio` e remove os temas padrão 8. Executa o seeder do plugin (páginas, formulários, feeds, permalinks, avatar) Rank Math SEO e Site Kit são apenas instalados e ativados: o wizard e a conexão com o Google são feitos manualmente no painel. **Execuções seguintes (site já instalado) — atualização** 1. Nada é reinstalado e nenhum dado é apagado 2. Atualiza o **core** e os **plugins ativos** que tiverem versão nova 3. Ativa plugins novos adicionados à pasta `wp-content/plugins/` 4. Reaplica só o que estiver faltando (idioma, Redis, tema, seeder idempotente) > A configuração do Post Views Counter roda **uma única vez**, na instalação. Se você mudar a posição no painel, ela não é sobrescrita nos próximos boots. O seeder também aplica, apenas enquanto os valores ainda forem os de instalação nova: | Ajuste | Valor aplicado | |---|---| | Links permanentes | **Dia e nome** — `/ano/mês/dia/slug/` | | Avatar padrão | **Iniciais** | Depois de criar permalinks, o `.htaccess` do Apache é regravado na hora — sem isso as URLs novas dariam 404. Se você já tiver escolhido outro permalink ou avatar, sua escolha é mantida. Tudo o que é do usuário fica em **volumes**, não no container: | Volume | Conteúdo | |---|---| | `db_data` | banco MariaDB — posts, páginas, usuários, opções, formulários | | `wordpress_data` | core, uploads, plugins e temas instalados | | `redis_data` | cache de objetos | `docker compose down` (sem `-v`) preserva tudo; só `down -v` recria do zero. Para pular atualizações numa reinicialização, use `WP_SKIP_UPDATES=1` no `.env`. ### Senhas A senha do banco é gravada **dentro do volume `db_data` na primeira instalação**. Trocar `WORDPRESS_DB_PASSWORD` ou `MARIADB_ROOT_PASSWORD` no `.env` depois disso **não** atualiza o banco — o WordPress perde a conexão (`Error establishing a database connection`) e o setup aborta com erro em vez de reinstalar por cima. Para voltar ao normal, devolva a senha original no `.env` e reinicie (`docker compose up -d`). Para trocar a senha de verdade, altere-a nos dois lugares, nessa ordem: ```sh # 1. No banco em execução (troque NOVA_SENHA pela senha nova): docker compose exec db mariadb -u root -p"$MARIADB_ROOT_PASSWORD" \ -e "ALTER USER 'wordpress'@'%' IDENTIFIED BY 'NOVA_SENHA'; FLUSH PRIVILEGES;" # 2. No .env: WORDPRESS_DB_PASSWORD=NOVA_SENHA # 3. Reinicie: docker compose up -d ``` ## Deploy O tema está preparado para deploy em ambientes WordPress padrão (VPS, shared hosting, WP Engine, Kinsta, etc.). 1. Faça o build dos assets se necessário 2. Faça deploy da pasta `wp-content/themes/gustavoo-portfolio/` 3. Ative o tema no painel WordPress 4. Ative o plugin **Gustavo Portfolio Core** 5. Execute o seeder (Configurações → Portfólio → "Executar Seeder") para criar páginas e formulários padrão ## Licença GNU General Public License v2 ou posterior — mesmo licença do WordPress. --- **Desenvolvido por [Gustavo Oliveira](https://gustavoo.me)** — Desenvolvedor Full Stack Sênior