Fundamentos do Tema
Arquivos Obrigatórios
style.cssCabeçalho de metadados do tema e estilos
index.phpTemplate de fallback (obrigatório)
functions.phpConfiguração do tema, hooks, enqueue
screenshot.pngPrévia do tema (1200x900)
Cabeçalho do style.css
/* Theme Name: My Theme Theme URI: https://example.com Version: 1.0 Requires at least: 6.0 */
Configuração do functions.php
add_action('after_setup_theme', function() { add_theme_support('title-tag'); add_theme_support('post-thumbnails'); add_theme_support('html5', ['search-form', 'gallery']); register_nav_menus(['primary' => 'Main Nav']); });
Hierarquia de Templates
Templates de Página
front-page.phpPágina inicial estática
home.phpÍndice de posts do blog
single.phpPost individual
page.phpPágina individual
archive.phpArquivos de posts (data, categoria)
category.phpArquivo de categoria
search.phpResultados de busca
404.phpNão encontrado
index.phpFallback final
Partes de Template
get_header(); // header.php get_footer(); // footer.php get_sidebar(); // sidebar.php get_template_part('parts/card'); // parts/card.php get_template_part('parts/card', 'featured');
Ordem de Busca (Post Individual)
1single-{post_type}-{slug}.php
2single-{post_type}.php
3single.php
4singular.php
5index.php
O Loop
Loop Padrão

Tags de Template
the_title()Exibe o título do post
the_content()Exibe o conteúdo do post
the_excerpt()Exibe o resumo do post
the_permalink()Exibe a URL do post
the_post_thumbnail()Exibe a imagem destacada
the_date()Exibe a data de publicação
the_author()Exibe o nome do autor
the_category()Exibe os links de categoria
Getters (Retornam, Não Exibem)
$title = get_the_title(); $url = get_permalink(); $id = get_the_ID(); $thumb = get_the_post_thumbnail_url(null, 'medium');
Tipos de Post Personalizados
Registrar CPT
add_action('init', function() { register_post_type('product', [ 'labels' => ['name' => 'Products', 'singular_name' => 'Product'], 'public' => true, 'has_archive' => true, 'supports' => ['title', 'editor', 'thumbnail'], ]); });
Taxonomia Personalizada
register_taxonomy('brand', 'product', [ 'labels' => ['name' => 'Brands'], 'hierarchical' => true, 'rewrite' => ['slug' => 'brand'], ]);
Opções de Supports
titleCampo de título do post
editorEditor de conteúdo
thumbnailImagem destacada
excerptCampo de resumo
custom-fieldsMeta box para campos personalizados
page-attributesOrdem de menu, pai
revisionsHistórico de revisões
Hooks e Filtros
Actions (Fazer Algo)
// Registrar um hook add_action('wp_head', 'my_analytics', 20); function my_analytics() { echo ''; }
Filters (Modificar Dados)
// Modificar o tamanho do resumo add_filter('excerpt_length', fn() => 30); // Adicionar texto a cada post add_filter('the_content', function($c) { return is_single() ? $c . '

Thanks for reading!

' : $c; });
Hooks Principais
initWP inicializado; registrar CPTs aqui
wp_enqueue_scriptsEnfileirar CSS/JS
wp_headSaída em
wp_footerSaída antes de
save_postApós salvar um post
pre_get_postsModificar a consulta principal antes da execução
the_contentFiltrar saída do conteúdo do post
the_titleFiltrar saída do título do post
WP_Query
Consulta Personalizada
$q = new WP_Query([ 'post_type' => 'product', 'posts_per_page' => 10, 'orderby' => 'date', 'order' => 'DESC', ]); while ($q->have_posts()) : $q->the_post(); the_title('

', '

'); endwhile; wp_reset_postdata();
Parâmetros Comuns
post_typepost, page ou tipo personalizado
posts_per_pageNúmero de resultados (-1 para todos)
category_nameFiltrar por slug de categoria
tagFiltrar por slug de tag
sPalavra-chave de busca
meta_key / meta_valueFiltrar por campo personalizado
tax_queryFiltragem avançada de taxonomias
date_queryFiltrar por intervalo de datas
Modificar Consulta Principal
add_action('pre_get_posts', function($q) { if (!is_admin() && $q->is_main_query() && is_home()) { $q->set('posts_per_page', 5); } });
REST API
Endpoints Integrados
/wp-json/wp/v2/postsListar / criar posts
/wp-json/wp/v2/posts/{id}Obter / atualizar / excluir post
/wp-json/wp/v2/pagesEndpoint de páginas
/wp-json/wp/v2/categoriesEndpoint de categorias
/wp-json/wp/v2/mediaBiblioteca de mídia
/wp-json/wp/v2/usersEndpoint de usuários
Endpoint Personalizado
add_action('rest_api_init', function() { register_rest_route('myplugin/v1', '/items', [ 'methods' => 'GET', 'callback' => fn($req) => new WP_REST_Response( get_posts(['post_type' => 'item', 'numberposts' => 20]) ), 'permission_callback' => '__return_true', ]); });
Buscar via JavaScript
const res = await fetch('/wp-json/wp/v2/posts?per_page=5'); const posts = await res.json(); posts.forEach(p => console.log(p.title.rendered));
Funções
Funções de Post
get_posts($args)Recuperar array de posts
wp_insert_post($arr)Criar ou atualizar um post
wp_delete_post($id)Mover para lixeira ou excluir um post
get_post_meta($id, $key)Obter valor de campo personalizado
update_post_meta($id, $k, $v)Definir valor de campo personalizado
Usuário e Autenticação
wp_get_current_user()Usuário atualmente conectado
is_user_logged_in()Verificar status de login
current_user_can($cap)Verificar capacidade
wp_create_nonce($action)Gerar nonce de segurança
wp_verify_nonce($nonce, $a)Verificar nonce
Funções Utilitárias
esc_html($str)Escapar para contexto HTML
esc_attr($str)Escapar para contexto de atributo
esc_url($url)Sanitizar URL
wp_kses_post($html)Permitir apenas HTML seguro para posts
sanitize_text_field($s)Remover tags e espaços em branco extras
absint($val)Inteiro absoluto
Enqueue
Enfileirar Estilos e Scripts
add_action('wp_enqueue_scripts', function() { wp_enqueue_style('theme-style', get_stylesheet_uri(), [], '1.0'); wp_enqueue_script('theme-js', get_theme_file_uri('/js/app.js'), ['jquery'], '1.0', true); });
Funções de Enqueue
wp_enqueue_style($h, $src)Registrar + enfileirar CSS
wp_enqueue_script($h, $src)Registrar + enfileirar JS
wp_localize_script($h, $n, $d)Passar dados PHP para JS
wp_dequeue_style($handle)Remover estilo enfileirado
wp_dequeue_script($handle)Remover script enfileirado
Passar Dados para JavaScript
wp_enqueue_script('my-app', get_theme_file_uri('/js/app.js')); wp_localize_script('my-app', 'myData', [ 'ajaxUrl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('my_action'), ]); // JS: console.log(myData.ajaxUrl)
Padrões Comuns
Template de Página Personalizado
Handler AJAX
add_action('wp_ajax_my_action', 'handle_my_action'); add_action('wp_ajax_nopriv_my_action', 'handle_my_action'); function handle_my_action() { check_ajax_referer('my_action', 'nonce'); wp_send_json_success(['msg' => 'OK']); }
Shortcode
add_shortcode('greeting', function($atts) { $a = shortcode_atts(['name' => 'World'], $atts); return '

Hello, ' . esc_html($a['name']) . '!

'; }); // Uso: [greeting name="Zhi"]