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

Carregar o WordPress para processar a requisição

 

Interpretar o que o usuário está querendo através da URL e buscar o conteúdo desejado no banco de dados

 

Escolher o template apropriado para renderizar o conteúdo e retornar para o navegador do usuário


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


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

  1. Busca no banco de dados todas as regras de reescrita.
     
  2. Compara a URL requisitada com cada regra.
     
  3. 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
     
  4. 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

  • 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.


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