http://bit.ly/wcbh2016fund
Bibliotecário por formação e Web Designer por emoção!
Desenvolvo websites e aplicativos com WordPress desde 2010.
marlon@naveguefeliz.com.br
Dedico essa apresentação a toda comunidade WordPress e a comunidade open-source.
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.
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
Matt Mullenweg, "State of the Word", 2013
Matt Mullenweg, "State of the Word", 2013
Matt Mullenweg, "State of the Word", 2013
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
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.
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.
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
http://wordcampbh.org/category/entrevistas
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
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
http://wordcampbh.org/category/entrevistas
# 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
index.php
wp-blog-header.php
wp-load.php
wp-config.php
wp-settings.php
index.php
wp-blog-header.php
wp-load.php
wp-config.php
wp-settings.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?
index.php
wp-blog-header.php
wp-load.php
wp-config.php
wp-settings.php
index.php
wp-blog-header.php
wp-load.php
wp-config.php
wp-settings.php
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();
// 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 );
...
}
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 ) ); }
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 ) ); }
http://wcbh.org/category/entrevistas
http://wcbh.org/index.php?category_name=entrevistas
'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
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 ) ); }
* 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()
* 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
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( 'posts_per_page=5' );
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
// Carrega o WordPress
...
// Interpreta a URL requisitada e efetua a busca
...
// Carrega o template do tema
require_once( ABSPATH . WPINC . '/template-loader.php' );
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!
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
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
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