fundamentos dO WORDPRESS
uma viagem ao centro do universo!
http://bit.ly/wcbh2016fund
Quem?
Marlon lacerda amâncio
Bibliotecário por formação e Web Designer por emoção!
Desenvolvo websites e aplicativos com WordPress desde 2010.
marlon@naveguefeliz.com.br
Agradecimento
Dedico essa apresentação a toda comunidade WordPress e a comunidade open-source.
por que eu preciso saber como o wordpress funciona?
ninja fail!
nosso plano
Iremos percorrer o ciclo de requisição-resposta dentro do WordPress para nos guiar. A partir desse caminho iremos identificar os principais componentes e classes envolvidas e como se relacionam.
ao final dessa apresentação você
- Irá entender como funciona o ciclo de requisição-resposta do WP
- Irá entender quais são os principais componentes e classes que formam o WP
- Terá uma visão mais ampla do que é possível criar com o WP
- Será capaz de adaptar o seu problema dentro da lógica do WP
- Conhecerá alguns recursos nativos, as APIs, que o WP oferece
- Terá insumo para continuar aprendendo e debugar
o início
O QUE É O Wordpress?
Quais são as tarefas que o WordPress nos ajuda a executar?
"When you think about it, we're kind of building a web operating system."
Matt Mullenweg
segundo os próprios usuários
Matt Mullenweg, "State of the Word", 2013
código base inicial
Matt Mullenweg, "State of the Word", 2013
código base atual
wordpress como plataforma
Matt Mullenweg, "State of the Word", 2013
O WORDPRESS É UMA PLATAFORMA QUE PODEMOS USAR OU EXTENDER PARA CRIAR outros aplicativos WEB.
por ser um aplicativo em si, já possui estrutura, recursos e funcionalidades pré-definidas.
como podemos EXTENDER e customizar o wp?
DESIGN
design dirigido a eventos
WordPress em execução
EVENTO
EVENTO
EVENTO
EVENTO
EVENTO
EVENTO
Gancho
(hook)
Funções próprias
Funções próprias
Funções próprias
Funções próprias
Customizações
Requisição
Resposta
Gancho ou hook
São pontos de execução fornecidos pelo WordPress durante o ciclo de requisição-resposta, em que podemos incluir nossas funções para customizar as ações e respostas a esses eventos.
Existem dois tipos de ganchos: action e filter.
Exemplos de ganchos/eventos
Registra categorias e tags padrões.
Registra post e page padrões.
Plugin carregados.
Tema configurado (gancho importante).
Autenticou o usuário.
Iniciou os widgets.
Registrar sidebars.
Carregou scripts padrões.
Carregou estilos padrões.
Carregar scripts próprios e terceiros.
Interpretando a requisição do usuário.
Redirecionando para o template responsável.
Prestes a encerrar a execução do clico.
arquitetura
uma visão a longa distância
Visão geral e arquitetura do wp
WordPress core
e plugins
Banco de Dados
Tema
Camada de apresentação
HTML, CSS e JS
Camada da aplicação
PHP
Camada de persistência
MySQL
Arquitetura comum de Web Apps
exemplo
http://wordcampbh.org/category/entrevistas
requisitos
1º Carregar o WordPress para processar a requisição
2º Interpretar o que o usuário está querendo através da URL e buscar o conteúdo desejado no banco de dados
3º Escolher o template apropriado para renderizar o conteúdo e retornar para o navegador do usuário
1º
CARREGAR o wordpress
relembrando ...
website estático
website dinâmico
Por padrão uma URL aponta para o caminho do recurso no sistema de arquivos do servidor.
A URL contém Query Strings que são pares de propriedade=valor que fornecem parâmetros para o servidor processar e localizar o recurso.
http://host.com/paginas/entrevistas.html
http://host.com/app.php?categoria=entrevistas
links permanentes legíveis habilitado
(pretty permalinks)
http://wordcampbh.org/category/entrevistas
TODAS REQUISIÇÕES SÃO DIRECIONADAS PARA O INDEX.PHP
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Arquivo .htaccess
requisição
index.php
wp-blog-header.php
wp-load.php
wp-config.php
wp-settings.php
requisição
index.php
wp-blog-header.php
wp-load.php
wp-config.php
wp-settings.php
wp-blog-header.php
// Carrega o WordPress
require_once( dirname(__FILE__) . '/wp-load.php' );
// Interpreta a URL requisitada e efetua a busca
wp();
// Carrega o template do tema
require_once( ABSPATH . WPINC . '/template-loader.php' );
Lembram dos 3 requisitos para atender à requisição do usuário?
requisição
index.php
wp-blog-header.php
wp-load.php
wp-config.php
wp-settings.php
requisição
index.php
wp-blog-header.php
wp-load.php
wp-config.php
wp-settings.php
wp-settings.php
- Carrega a maior parte do core do WordPress (/wp-includes/).
Incluindo Multisite se estiver habilitado. - Define várias constantes padrões.
- Confere se há drop-in para biblioteca BD e Object Caching e carrega-os.
- Conecta com o banco de dados especificado no wp-config.php.
- Cria os tipos de posts e taxonomias padrões.
- Carrega os must-use plugins, plugins ativos e pluggable functions.
- Carrega os arquivos functions.php dos temas, filho e pai.
- Efetua a autenticação e configurado o usuário se tiver logado.
wp-settings.php
as principais classes são instanciadas em suas respectivas variáveis globais
WP, WP_Query e WP_Rewrite
$GLOBALS['wp_the_query'] = new WP_Query();
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
$GLOBALS['wp_rewrite'] = new WP_Rewrite();
$GLOBALS['wp'] = new WP();
wp-settings.php
todos os ganchos das principais etapas do carregamento estão aqui
- muplugins_loaded
- plugins_loaded
- setup_theme
- after_setup_theme
- init
- wp_loaded
2º
analisar a url e efetuar a busca no banco de dados
lembram de mim?
// Carrega o WordPress
...
// Interpreta a URL requisitada e efetua a busca
wp();
// Carrega o template do tema
...
function wp( $query_vars = '' ) {
...
$wp->main( $query_vars );
...
}
wp->main()
public function main($query_args = '') { $this->init(); $this->parse_request($query_args); $this->send_headers(); $this->query_posts(); $this->handle_404(); $this->register_globals(); do_action_ref_array( 'wp', array( &$this ) ); }
wp->main()
public function main($query_args = '') { $this->init(); $this->parse_request($query_args); $this->send_headers(); $this->query_posts(); $this->handle_404(); $this->register_globals(); do_action_ref_array( 'wp', array( &$this ) ); }
WP->PARSE_REQUEST()
analisa a url requisitada para extrair os parâmetros que serão usados para executar a query principal
http://wcbh.org/category/entrevistas
http://wcbh.org/index.php?category_name=entrevistas
wp_rewrite
wp_rewrite
$wp_rewrite->wp_rewrite_rules()
'category/(.+?)/page/?([0-9]{1,})/?$'
'index.php?category_name=$matches[1]&paged=$matches[2]'
http://wcbh.org/category/entrevistas/page/3
index.php?category_name=entrevistas&paged=3
- Busca no banco de dados todas as regras de reescrita.
- Compara a URL requisitada com cada regra.
- Ao identificar o padrão que "casou" com a regra extrai as variáveis de acordo com a URL (query string) da regra correspondente:
category_name=entrevistas
paged=3
- Confere se as variáveis extraídas da query string são permitidas, checa outras variáveis de requisições GET e POST, descarta as que não são válidas e armazena na propriedade $wp->query_vars (conhecida também como Especificação da Busca ou Query Specification).
WP->PARSE_REQUEST()
wp->main()
public function main($query_args = '') { $this->init(); $this->parse_request($query_args); $this->send_headers(); $this->query_posts(); $this->handle_404(); $this->register_globals(); do_action_ref_array( 'wp', array( &$this ) ); }
wp->query_posts()*
* Não é a função query_posts()
Irá desencadear chamadas de alguns métodos até chegar no WP_Query->parse_query() que por sua vez irá definir o tipo de query com base nas variáveis da query string. Como por exemplo se é visualização de arquivo de posts de determinada categoria, se é uma página ou post específico, se é resultado de busca etc.
$wp_query (
'is_page' => false,
'is_date' => false,
'is_author' => false,
'is_category' => true,
'is_tag' => false,
'is_search' => false,
'is_home' => false,
'is_404' => false,
... )
function is_category( ) {
global $wp_query;
return $wp_query->is_category( );
}
WP->query_posts()
WP_Query->query()
WP_Query->get_posts()
WP_Query->parse_query()
wp->get_posts()*
* Não é a função get_posts()
Finalmente o WordPress irá executar a consulta no banco de dados com ajuda da classe wpdb e irá salvar os posts na propriedade $wp_query->posts para serem usados no Loop
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (2) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10
como customizar?
criar query secundária dentro de uma página
Alterar a query padrão
Criar permalink customizado
- pre_get_posts
- Outros ganchos
- new WP_Query
- get_posts()
Criar consultas sql customizadas
- global $wpdb
- Rewrite API
pre_get_posts!
super gancho para alterar a query
- Evita consultas desnecessárias ao BD
- Disponibiliza acesso as tags condicionais (is_category(), is_home() etc.)
add_action( 'pre_get_posts', 'wcbh_altera_posts_per_page' );
function wcbh_altera_posts_per_page( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_category( 'entrevistas' ) ) {
$query->set( 'posts_per_page', '5' );
}
}
query_posts()
query_posts( 'posts_per_page=5' );
NÃÃÃÃÃOOOOO
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
- Descarta a query principal e gera uma nova query.
- Substitui as variáveis globais
- Ignora outros parâmetros recebidos pela URL como por exemplo de paginação.
3º
definir e carregar o template
template-loader.php
define o template a ser usado
// Carrega o WordPress
...
// Interpreta a URL requisitada e efetua a busca
...
// Carrega o template do tema
require_once( ABSPATH . WPINC . '/template-loader.php' );
Hierarquia de templates
is_home()
front-page.php > home.php > page.php > index.php
is_page()
{custom-template}.php > page-{slug}.php > page-{id}.php > page.php > index.php
is_single()
single-{post-type}.php > single.php > index.php
is_category()
category-{slug}.php > category-{id}.php > category.php > archive.php > index.php
Como o WP define qual arquivo de template irá usar?
$wp_query (
is_home => false,
is_page => false,
is_single => false,
is_category => true,
... )
Através da configuração da Query!
customizações através do gancho template_redirect
e o loop?
loop
if ( have_posts() ) :
while ( have_posts() ) : the_post();
the_title();
the_content();
endwhile;
endif;
Loop é uma estrutura de repetição responsável por exibir o conjunto de posts wp_query->posts resultante da busca no banco de dados.
post, post_count, current_post, in_the_loop
exibindo conteúdo principal - loop
Início do loop
Tudo entre este ponto e o fim do loop será repetido até encerrar a lista de posts consultados no BD.
the_title()
Imprime o título do post que está sendo iterado.
the_excerpt()
Imprime o resumo do post que está sendo iterado.
the_content()
Imprime o conteúdo do post que está sendo iterado.
the_category()
Imprime a categoria do post que está sendo iterado.
the_author()
Imprime o autor do post que está sendo iterado.
Fim do loop
Retorna para o início do loop se houver mais posts ou encerra e continua execução do template.
Outras templates tags
Quaisquer outras templates tags deverão entrar no loop.
Continua execução do template
Sair
global $post
visão total do ciclo de execução
Requisição de página
.htaccess redireciona
index.php
wp-blog-header.php
wp-load.php
wp-config.php
wp-settings.php
template-loader.php
Carrega o core, plugins e tema
Carrega o template do tema
parse_request()
Define as variáveis da query
e as tags condicionais
http://site.com/category/entrevistas
index.php?category_name=entrevistas
WP::query_posts()
Banco de Dados
$wp_query
Template específico + LOOP
"Monta" a página e retorna para o usuário.
A cada nova requisição repete-se o cliclo.
Padrão de URL
Query String
category/(.+?)/?$
index.php?category_name=$matches[1]
Regras de Reescrita (Rewrite API)
2
3
1
missão cumprida!
Obrigado!
referências
- http://codex.wordpress.org/Query_Overview
- http://premium.wpmudev.org/blog/wordpress-query-overview-how-a-page-request-is-translated-to-a-mysql-query/
- http://wordpress.stackexchange.com/questions/71406/is-there-a-flowchart-for-wordpress-loading-sequence
- http://humanshell.net/2011/08/wordpress-initialization/
- https://carlalexander.ca/wordpress-adventurous-loading/
- https://roots.io/routing-wp-requests/
- https://carlalexander.ca/wordpress-adventurous-wp-query-class/
- http://code.tutsplus.com/tutorials/using-wordpress-for-web-application-development-rethinking-architecture--wp-33880
- http://code.tutsplus.com/articles/using-wordpress-for-web-application-development-the-conceptual-model--wp-34095
- http://code.tutsplus.com/tutorials/using-wordpress-for-web-application-development-understanding-events-actions-and-filters--wp-34113
- http://www.wrox.com/WileyCDA/WroxTitle/Professional-WordPress-Plugin-Development.productCd-0470916222.html
- http://www.amazon.com/Professional-WordPress-Development-Brad-Williams/dp/111844227X
Fundamentos do WordPress para você sair do básico - WordCamp Belo Horizonte 2016
By Marlon Lacerda Amâncio
Fundamentos do WordPress para você sair do básico - WordCamp Belo Horizonte 2016
Apresentação feita no WordCamp Belo Horizonte 2016
- 3,067