WordCamp BH 2016
Rodrigo Brito
Brasileiro, Mineiro, Sabarense
Estudante de Sistemas de Informação - IFMG
Desenvolvedor WordPress desde 2012
Entusiasta de tecnologias WEB e Open Source
O tema é a parte do site responsável pela apresentação visual do conteúdo. Apenas isso!
Funcionalidades e lógicas de negócio devem ser tratadas por plugins.
Pelo menos deveria ser isso...
Obrigatório
index.php - Arquivo principal do tema
style.css - Identificador e estilo principal
Arquivos auxiliares
functions.php - Controle e funcionalidades
footer.php - Rodapé
header.php - Cabeçalho
single.php - Visualização de posts
page.php - Visualização de páginas
category.php - Arquivos de categorias
Entre outros...
Base fundamental para toda a listagem de conteúdo. Pode variar,
porém sempre é a mesma coisa, estruturas muito semelhantes.
<!-- Se existir posts, iterar sobre eles -->
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<!-- Template tags -->
<div class="entry">
<?php the_content(); ?>
</div>
<!-- Fim do loop e início do bloco de ausência de posts -->
<?php endwhile; else: ?>
<p>Nenhuma publicação encontrada.</p>
<?php endif; ?>
Estrutura básica para iniciar a criação do tema. Projeto com os arquivos básicos, folha de estilo inicial e algumas estruturas que facilitam o processo de desenvolvimento.
Arcabouço de ferramentas, funcionalidades, classes, entre outros artifícios, que contribuem como facilitadores para a resolução de um problema ou construção de um projeto.
Starter Theme
Open Source
Desenvolvido pela Automattic
Extremamente leve
Estrutura simplificada
Gerador de Tema
Framework + Tema Base
Open Source
Bootstrap
SASS
Automatizado (Grunt e Gulp)
Classes utilitárias
/*
Theme Name: WordCamp
Theme URI: http://underscores.me/
Author: Rodrigo Brito
Author URI: http://rodrigobrito.net
Description: Tema de exemplo
//Funções de internacionalização
_e( 'Comments are closed.', 'wordcamp' );
__( 'User password!', 'wordcamp' );
components.underscores.me
Copiar para /wp-content/themes
Ativar pelo painel administrativo ou wp-cli
/assets - Folhas de estilos, imagens, fontes, scripts.
/core - Arquivos e classes do framework
/languages - Arquivos de internacionalização
/inc - Arquivos auxiliares e fragmentos de template
/src - Configurações e dependências de automatizadores
O poder de Odin está no CORE!
Mas o poder do Node, SASS e Grunt JS está no /assets e /src
Caso prefira o Gulp JS: github.com/wpbrasil/odin-gulp
Inclua em seu tema apenas o que for necessário.
Exemplo para Bootstrap básico
helpers.php - Thumbnails, paginação, entre outros.
Copiar para a pasta do tema e incluir no functions.php
/**
* Odin Classes.
*/
require_once get_template_directory() . '/inc/classes/class-bootstrap-nav.php';
require_once get_template_directory() . '/inc/classes/class-thumbnail-resizer.php';
/**
* Core Helpers.
*/
require_once get_template_directory() . '/inc/helpers.php';
Underscores possui apenas o normalize.css
Você pode adicionar o framework front-end de seu gosto.
O Odin utiliza o Bootstrap, uma excelente opção.
O Odin já vem preparado para utilizar o Bootstrap com o SASS via Grunt JS. Pastas \src e \assets.
Filtro de estilos - Diretório personalizado
function wordcamp_stylesheet_uri( $uri, $dir ) {
return $dir . '/assets/css/style.css';
}
add_filter( 'stylesheet_uri', 'wordcamp_stylesheet_uri', 10, 2 );
div #container, incluir classe .container e div filha .row
div #primary, incluir classe .col-md-8
div #sidebar, incluir classe .col-md-4
Acessar via terminar a pasta \src dentro do tema.
Pasta onde fica os arquivos Gruntfile.js e package.json
Necessário possuir o Node JS e NPM instalados!
Instalar dependências:
$ npm install
Iniciar o Grunt
$ grunt w
Pronto, agora a mágica começa!
Permite uso de variáveis, minificação, aninhamento de CSS
Atualiza o navegador automaticamente quando salva.
// Grunt watch livereload in the browser.
wp_enqueue_script( 'odin-livereload', 'http://localhost:35729/livereload.js?snipver=1', array(), null, true );
Análise sintática, qualidade e padronização de código
O Grunt JS e Gulp JS é uma verdadeira caixa de utilidades
No arquivo /assets/sass/bootstrap/_bootstrap.scss
Remova os módulos não utilizados: Tabs, Modal, Popovers...
// Components
@import "bootstrap/dropdowns";
@import "bootstrap/navs";
@import "bootstrap/navbar";
@import "bootstrap/pagination";
@import "bootstrap/thumbnails";
// Utility classes
@import "bootstrap/utilities";
@import "bootstrap/responsive-utilities";
// Core variables and mixins
@import "bootstrap/variables";
@import "bootstrap/mixins";
// Reset and dependencies
@import "bootstrap/normalize";
@import "bootstrap/print";
@import "bootstrap/glyphicons";
// Core CSS
@import "bootstrap/scaffolding";
@import "bootstrap/type";
@import "bootstrap/code";
@import "bootstrap/grid";
@import "bootstrap/tables";
@import "bootstrap/forms";
@import "bootstrap/buttons";
Reduziu de 206KB para 60KB minificado!
Construção do navbar com estrutura do Bootstrap
wp_nav_menu(
array(
'theme_location' => 'main-menu',
'depth' => 2,
'container' => false,
'menu_class' => 'nav navbar-nav',
'fallback_cb' => 'Odin_Bootstrap_Nav_Walker::fallback',
'walker' => new Odin_Bootstrap_Nav_Walker()
)
);
No functions.php
No header.php
require_once get_template_directory() . '/inc/classes/class-bootstrap-nav.php';
function odin_contact_form() {
$form = new Odin_Contact_Form(
'contact_form',
'voce@email.com'
);
$form->set_fields(
array(
// fields ....
)
)
);
$form->set_subject( __( 'Email enviado por [sender_name] <[sender_email]>', 'odin' ) );
$form->set_content_type( 'html' );
$form->set_reply_to( 'sender_email' );
return $form;
}
add_action( 'init', array( odin_contact_form(), 'init' ), 1 );
No functions.php
require_once get_template_directory() . '/core/classes/abstracts/abstract-front-end-form.php';
require_once get_template_directory() . '/core/classes/class-contact-form.php';
Para renderizar
echo odin_contact_form()->render();
'fields' => array(
array(
'id' => 'sender_name', // Required
'label' => array(__( 'Nome', 'odin' ), // Required
'type' => 'text', // Required
'required' => true, // Optional (bool)
'attributes' => array( // Optional (html input elements)
'placeholder' => __( 'Digite o seu nome' )
)
),
)
Suporta diferentes tipos
require_once get_template_directory() . '/core/classes/class-post-type.php';
No functions.php
function wordcamp_cpt() {
$trabalho = new Odin_Post_Type(
'Trabalhos', // Nome (Singular) do Post Type.
'trabalho' // Slug do Post Type.
);
$trabalho->set_arguments(
array(
'supports' => array( 'title', 'editor', 'thumbnail' ),
'menu_icon' => 'dashicons-portfolio',
)
);
$trabalho->set_labels(
array(
'menu_name' => __( 'Meus Trabalhos', 'wordcamp' )
)
);
}
add_action( 'init', 'wordcamp_cpt', 1 );
Inicializa CPT ( Portfólio )
require_once get_template_directory() . '/core/classes/class-taxonomy.php;
No functions.php
function wordcamp_taxonomy() {
$trabalho_tax = new Odin_Taxonomy(
'Categoria', // Nome (Singular) da nova Taxonomia.
'categoria', // Slug do Taxonomia.
'trabalho' // Nome do tipo de conteúdo que a taxonomia irá fazer parte.
);
}
add_action( 'init', 'wordcamp_taxonomy', 1 );
Inicializa Taxonomia ( Portfólio )
<h3><?php _e('Portfólio', 'wordcamp'); ?></h3>
<hr>
<div class="row">
<?php $args = array( 'posts_per_page' => 4, 'post_type' => 'trabalho' );
$myposts = get_posts( $args );
foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
<div class="col-md-3">
<a href="<?php the_permalink(); ?>" class="thumbnail">
<?php echo odin_thumbnail( 300, 300, get_the_title(), true); ?>
</a>
<h4><?php the_title(); ?></h4>
</div>
<?php endforeach;
wp_reset_postdata();?>
</div>
Em conjunto com o ACF e outros plugins, o Odin torna-se uma verdadeira fábrica de aplicações.
Acesse a WIKI
Palestra: slides.com/rodrigo73/desenvolvimento-temas/