Sistemas de gestão de conteúdos
Apresentação
UC02832 (50h · 4,5 pts) cobre Sistemas de Gestão de Conteúdos (CMS). Foco prático em WordPress (cerca de 40% da web), com personalização de temas, uso e desenvolvimento de plugins, segurança e performance, e introdução a CMS headless moderno.
O que é um CMS
Um Content Management System permite criar, editar, organizar e publicar conteúdo digital sem programar cada página.
Separa responsabilidades: - Conteúdo — textos, imagens, vídeos (gerido por editores não-técnicos). - Apresentação — tema/template (designers). - Funcionalidade — plugins/extensões (developers).
Vantagens
- Editores autónomos (não dependem de developers para publicar).
- Time-to-market rápido.
- Ecossistema enorme (temas, plugins).
- Manutenção e SEO facilitados.
Quando NÃO usar
- Aplicações com lógica de negócio complexa e específica.
- Requisitos de performance extrema.
- Quando o "CMS" só atrapalha (uma landing estática simples).
Panorama
| CMS | Linguagem | Tipo | Uso típico |
|---|---|---|---|
| WordPress | PHP | Tradicional | Blogs, sites, lojas — ~40% da web |
| Drupal | PHP | Tradicional | Portais grandes, governo |
| Joomla | PHP | Tradicional | Sites de comunidade |
| Shopify | — | SaaS | E-commerce |
| Ghost | Node | Foco publicação | Blogs, newsletters |
| Strapi | Node | Headless | API de conteúdo self-hosted |
| Directus | Node | Headless | API sobre BD existente |
| Contentful / Sanity | — | Headless SaaS | Apps multi-canal |
WordPress · arquitectura
WordPress = PHP + MySQL/MariaDB.
wordpress/
├── wp-admin/ → painel de administração
├── wp-content/
│ ├── themes/ → temas
│ ├── plugins/ → plugins
│ └── uploads/ → media (imagens)
├── wp-includes/ → core (não tocar)
├── wp-config.php → configuração: BD, secrets, debug
└── index.php
- Conteúdo (posts, páginas, definições) vive na BD MySQL.
- Media (imagens, PDFs) vive em
wp-content/uploads/. - wp-config.php tem credenciais da BD e chaves de segurança — nunca commitar.
Tipos de conteúdo
- Posts — conteúdo cronológico (blog).
- Páginas — conteúdo estático (Sobre, Contacto).
- Custom Post Types — tipos próprios (Produtos, Eventos, Portfolio).
- Taxonomias — categorias, tags, taxonomias personalizadas.
- Media — biblioteca de ficheiros.
Papéis de utilizador
| Papel | Pode |
|---|---|
| Administrator | Tudo (incl. plugins, utilizadores) |
| Editor | Gerir todo o conteúdo |
| Author | Publicar os próprios posts |
| Contributor | Escrever, mas não publicar |
| Subscriber | Só ler / gerir o próprio perfil |
Princípio do menor privilégio: dar o papel mínimo necessário.
Instalação
Ambiente local (aprender)
- LocalWP — o mais simples para iniciantes.
- XAMPP / MAMP — stack Apache+MySQL+PHP manual.
- DDEV / Docker — reprodutível, próximo de produção.
Produção
- Hosting partilhado com 1-click install (SiteGround, Bluehost).
- VPS + LEMP (Linux, Nginx, MySQL, PHP) — controlo total.
- Managed WordPress (Kinsta, WP Engine) — caro mas tratam de tudo.
Famous 5-minute install
- Descarregar WordPress de
wordpress.org. - Criar BD MySQL + utilizador.
- Copiar ficheiros para o servidor.
- Aceder ao site → assistente web preenche
wp-config.php. - Definir título, admin, senha.
Configuração pós-instalação
- Permalinks → Definições → Permalinks → "Nome do post" (URLs limpas, SEO).
- Idioma e fuso → Definições → Gerais.
- Apagar conteúdo demo ("Hello World", página de exemplo).
- Remover plugins/temas não usados.
- Forçar HTTPS + certificado.
- Backup automático configurado desde o início.
- Email transacional (SMTP plugin) para notificações fiáveis.
Temas
O tema controla o aspecto visual: layout, cores, tipografia, estrutura das páginas.
Tipos
- Temas clássicos — PHP templates (
header.php,single.php...). - Block themes (Full Site Editing) — editados visualmente no Site Editor (WordPress 5.9+). Tendência actual.
- Frameworks (Astra, GeneratePress, Kadence) — leves, personalizáveis.
Template hierarchy (clássico)
WordPress escolhe o ficheiro de template mais específico que existe:
single.php → post individual
page.php → página
archive.php → listagens (categoria, autor)
404.php → página não encontrada
index.php → fallback universal
Ficheiros típicos:
style.css → metadata + estilo
functions.php → lógica (enqueue, hooks, supports)
header.php → cabeçalho comum
footer.php → rodapé comum
sidebar.php → barra lateral
Child themes
Nunca editar o tema directamente — uma actualização apaga as alterações.
Criar um child theme:
wp-content/themes/astra-child/
├── style.css
└── functions.php
/*
Theme Name: Astra Child
Template: astra
*/
<?php
// functions.php do child
add_action('wp_enqueue_scripts', function () {
wp_enqueue_style('parent', get_template_directory_uri().'/style.css');
wp_enqueue_style('child', get_stylesheet_directory_uri().'/style.css', ['parent']);
});
Personalizações no child; o pai actualiza sem perder nada.
Plugins
Plugins adicionam funcionalidade sem tocar no core.
Essenciais
| Categoria | Plugins |
|---|---|
| SEO | Yoast SEO, Rank Math |
| Segurança | Wordfence, Sucuri, iThemes Security |
| Backup | UpdraftPlus, BlogVault |
| Performance | WP Super Cache, W3 Total Cache, LiteSpeed |
| Formulários | Contact Form 7, WPForms, Fluent Forms |
| E-commerce | WooCommerce |
| Page builder | Elementor, Bricks, Gutenberg blocks |
Cuidados
- Cada plugin é código de terceiros — superfície de ataque e peso.
- Instalar só do repositório oficial ou fornecedores reputados.
- Menos é mais — desinstalar (não só desactivar) o que não se usa.
- Verificar: última actualização, número de instalações, avaliações, compatibilidade.
Hooks · estender WordPress
A base de como plugins/temas estendem o core sem o modificar.
Actions — executar código num momento:
add_action('wp_footer', function () {
echo '<p>Texto no rodapé de todas as páginas</p>';
});
add_action('init', function () {
// registar custom post type, etc.
});
Filters — modificar um valor antes de ser usado:
add_filter('the_content', function ($conteudo) {
return $conteudo . '<p>— Publicado em Aulify</p>';
});
add_filter('excerpt_length', function () {
return 20; // palavras no excerto
});
Criar um plugin simples
<?php
/*
Plugin Name: Aulify Saudação
Description: Adiciona saudação no rodapé.
Version: 1.0
*/
if (!defined('ABSPATH')) exit; // segurança: não aceder directamente
add_action('wp_footer', function () {
echo '<div style="text-align:center">Feito com Aulify</div>';
});
Colocar em wp-content/plugins/aulify-saudacao/aulify-saudacao.php e activar no painel.
Custom Post Type
add_action('init', function () {
register_post_type('produto', [
'label' => 'Produtos',
'public' => true,
'has_archive' => true,
'supports' => ['title', 'editor', 'thumbnail'],
'menu_icon' => 'dashicons-cart',
]);
});
Cria um tipo de conteúdo "Produto" gerível no painel.
CMS Headless
Conceito
Tradicional: o CMS gere o conteúdo e gera o HTML apresentado.
Headless: o CMS só gere conteúdo e expõe-no via API (REST ou GraphQL). O frontend é independente — Next.js, Nuxt, app Flutter, etc.
┌─► Site Next.js
Headless CMS ┼─► App móvel Flutter
(API) └─► Ecrã / kiosk
Um conteúdo, múltiplos canais (omnichannel).
Vantagens e desvantagens
Headless prós: - Frontend moderno e rápido (SSG/SSR). - Multi-canal a partir de uma fonte. - Separação clara de responsabilidades. - Escalável.
Headless contras: - Precisa de equipa de developers (não há "tema pronto"). - Mais peças móveis (CMS + frontend + deploy). - Pré-visualização e edição menos imediatas.
WordPress como headless
WordPress expõe REST API nativa:
GET /wp-json/wp/v2/posts
GET /wp-json/wp/v2/pages/42
Ou WPGraphQL (plugin) para queries GraphQL. O frontend (Next.js) consome e renderiza.
Headless dedicados
- Strapi — Node, self-hosted, open-source, admin gerável.
- Directus — expõe API sobre qualquer BD SQL existente.
- Contentful / Sanity / Storyblok — SaaS, sem servidor, planos gratuitos.
Segurança
WordPress é o CMS mais atacado porque é o mais usado. Hardening é obrigatório.
- Actualizar core, temas e plugins — a maioria dos hacks explora versões antigas.
- Menos plugins, só de fontes confiáveis.
- Senhas fortes + MFA no wp-admin.
- Não usar utilizador "admin" — criar um nome próprio; remover o default.
- Limitar tentativas de login (plugin) — trava brute-force.
- WAF — Wordfence ou Cloudflare à frente.
- Backups automáticos e testados (restaurar de facto).
- HTTPS obrigatório.
- Permissões de ficheiros correctas (644 ficheiros, 755 pastas, wp-config 600).
- Desactivar edição de ficheiros no painel:
define('DISALLOW_FILE_EDIT', true);. - Esconder versão do WordPress e ocultar erros PHP em produção.
Performance
- Caching — página (WP Super Cache), objecto (Redis), OPcache PHP.
- CDN para estáticos (Cloudflare).
- Imagens — WebP, dimensionadas, lazy loading.
- Hosting adequado (shared barato não aguenta tráfego real).
- Limpar BD — revisões antigas, spam, transients.
- Menos plugins pesados; auditar com Query Monitor.
- PHP recente (8.x é muito mais rápido que 7.x).
Apêndices
A · Cheatsheet WordPress
wp-admin/ painel
wp-content/themes temas
wp-content/plugins plugins
wp-config.php config (BD, secrets)
add_action('hook', fn) executar código
add_filter('hook', fn) modificar valor
register_post_type() tipo de conteúdo
get_template_part() incluir template
REST API: /wp-json/wp/v2/posts
WP-CLI: wp plugin list, wp core update
B · Glossário
CMS. Content Management System. Child theme. Tema que herda de outro para personalizar com segurança. Headless. CMS que só serve conteúdo via API. Hook. Ponto de extensão (action/filter). Plugin. Extensão de funcionalidade. Custom Post Type. Tipo de conteúdo personalizado. WP-CLI. Interface de linha de comandos do WordPress.
C · Recursos
- wordpress.org · Codex e documentação.
- developer.wordpress.org · referência de código.
- Strapi docs · strapi.io.
- WPBeginner · tutoriais para iniciantes.
- Kinsta blog · performance e segurança WP.