ENTENDA A QUERY E O LOOP DO WORDPRESS DE UMA VEZ POR TODAS
Quem?
Marlon lacerda amâncio
marlon@universowp.com.br
O ciclo DE REQUISIÇÃO E RESPOSTA
requisição
Iniciar e carregar o WP
Analisa a URL e define quais posts deverão ser buscados no banco de dados
Buscar no banco de dados os posts requisitados para serem exibidos
https://universowp.com.br/categoria/noticias
Escolher e carregar o template a ser usado para exibir os posts através do Loop
RESPOSTA
A cada resquisição o wordpres executa pelo menos uma consulta padrão ao banco de dados
Como a url é analisada e intepretada
links permanentes legíveis habilitado
(pretty permalinks)
https://universowp.com.br/categoria/noticias
ANÁLISE DA URL
A URL requisitada será analisada para extrair as variáveis (query_vars) que serão usadas como parâmetros para fazer a busca dos posts
https://universowp.com.br/categoria/noticias
https://universowp.com.br/index.php?category_name=noticias
query_vars -> Array ( category_name => 'noticias', )
REESCRITA (WP_REWRITE)
categoria/(.+?)/?$
index.php?category_name=$matches[1]
https://universowp.com.br/categoria/noticias
index.php?category_name=noticias
QUERY VARS
Query Vars são variáveis extraídas da URL ou usadas numa query customizada que determinam (ou afetam) os resultados de uma consulta ao banco de dados.
query_vars -> Array ( category_name => 'noticias', )
Como é feita as buscas dos posts no banco de dados
* Não é a função query_posts()
wp_query
global $wp_query
WP_Query Object ( [query] => Array ( [category_name] => noticias ) [query_vars] => Array ( [category_name] => noticias [cat] => 33 [posts_per_page] => 10 [order] => DESC ) [queried_object] => WP_Term Object [queried_object_id] => 33 [posts] => Array [found_posts] => 3 [is_archive] => 1 [is_category] => 1 )
Como customizar a consulta ao banco de dados
alterar a consulta principal
pre_get_posts
Criar uma consulta secundária
New WP_Query
get_posts()
pre_get_posts
super gancho para alterar a query
- Evita consultas desnecessárias ao banco de dados
- Disponibiliza acesso as tags condicionais (is_category(), is_home() etc.)
add_action( 'pre_get_posts', 'uwp_altera_posts_per_page' );
function uwp_altera_posts_per_page( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_category( 'noticias' ) ) {
$query->set( 'posts_per_page', '20' );
}
}
query_posts()
query_posts( 'posts_per_page=20' );
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.
Como o wordpress escolhe qual template irá exibir os posts
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 das Query Vars
Como o wordpress exibe os posts
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
Como debugar tudo isso?
Debug bar
Debug This
Query Monitor
Kint Debugger
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
Aprenda WP QUERY e LOOP de uma vez por todas
By Marlon Lacerda Amâncio
Aprenda WP QUERY e LOOP de uma vez por todas
Apresentação feita no WordCamp Belo Horizonte 2016
- 851