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