Quando existe a proposta de se realizar a personalização de um tema no WordPress, ou a integração de um template à ferramenta; um fator muito importante de ser bem analisado é o modo como as informações serão resgatadas pelos arquivos do novo tema em questão.
Algumas funções do WordPress, responsáveis por recuperar o conteúdo do banco de dados, permitem ao desenvolvedor realizar consultas personalizadas a várias tabelas; bastando para isso informar apenas uma simples chamada, ao invés de um extenso comando SQL.
No entanto, nem sempre o uso de tais funções se faz necessário e em outros casos é preciso saber optar pelo recurso correto dependendo da informação que se deseja obter; seja uma consulta personalizada por filtros ou consultas adicionais.
Recuperar informações
A cada requisição de página feita ao site mediante o acesso de uma URL específica, o WordPress automaticamente faz a verificação do link e retorna para o visitante duas respostas básicas: erro 404 ou o conteúdo em questão. Encontrado o conteúdo, todas as informações referente a ele estarão disponíveis para uso no código do Tema.
- $wp_query – As informações resgatadas pelo WordPress ficam armazenadas na variável global $wp_query. Através dessa variável é possível de se obter quantidade de posts recuperados, quantidade de posts por página, comando SQL executado e muitas outras informações.
Com o uso dessa variável global é possível criar variações do Loop do WordPress. Normalmente o laço de repetição responsável pela exibição dos posts é executado com o comando while, porém nada o impede de substituí-lo por outra estrutura como o for, foreach ou o do…while.
Personalizar consultas
Visto que a informação armazenada em banco de dados não precisa ser recuperada manualmente, em razão do WordPress já recuperá-la de acordo com a URL; cabe ao tema realizar o filtro desses dados de acordo com suas especificações.
- query_posts – Através da função query_posts é possível alterar os valores da $wp_query e consequentemente alterar o funcionamento do Loop do WordPress; isso ocorre pois o Loop utiliza-se de valores globais para retornar resultados de funções específicas. Quando usada, a query_posts deve ser empregada com o seguinte propósito: Alterar a consulta principal.
query_posts( 'orderby=title&order=ASC' );
while ( have_posts() ) :
the_post();
// exibição do conteúdo
endwhile;
No exemplo proposto os posts foram submetidos a ordenação alfabética por título. Caso queira aplicar o filtro corretamente em situações diferentes, como em resultados paginados e/ou de busca; deve ser atribuída na função a variável global $query_string que contém tais parâmetros específicos de consulta:
query_posts( $query_string . 'orderby=title&order=ASC' );
Vale lembrar que o uso dessa função irá executar uma nova consulta ao banco de dados e no entanto essa não deve ser a técnica usada para tal propósito.
Consultas adicionais
Em consultas adicionais devem ser utilizadas novas instâncias de WP_Query. Novas instâncias pois a $wp_query anteriormente vista é também uma instância da classe WP_Query.
- WP_Query – A classe responsável por agregar uma série de valores, além dos próprios resultados da consulta sob a qual está sendo submetida no momento da criação de uma instância.
$q = new WP_Query( 'author_name=mazetto' );
while ( $q->have_posts() ) :
$q->the_post();
the_title();
endwhile;
Essa técnica deve ser adotada em consultas adicionais (listas da sidebar, por exemplo) por não interferir no resultado que fora anteriormente fornecido pelo WordPress e seus valores globais. Dessa forma, caso precise utilizar tais informações após o Loop adicional, você não encontrará problemas.
Consultas enxutas
Conforme já foi abordado anteriormente, ao usar a classe WP_Query uma série de outras informações são consultadas e retornadas para a instância que está sendo usada; seja ela a $wp_query ou uma própria.
- get_posts – A função get_posts irá realizar a consulta aos posts (e todos os seus tipos, incluindo páginas e arquivos anexos) também mediante o uso da WP_Query, porém os resultados retornados serão apenas os campos da tabela posts.
$posts = get_posts( 'post_type=custom' );
foreach( $posts as $post ) :
the_title();
the_content();
endforeach;
No exemplo é possível observar a requisição de um tipo personalizado de post e o uso das Template Tags corretamente atribuído pela sobreposição da variável global $post pelo valor corrente a cada iteração do laço.
Filtrar resultados
Com as funções apresentadas é possível realizar uma série de filtros que podem ou não serem empregados nos resultados principais de uma requisição. No entanto, como foi visto, todas as alternativas irão realizar uma nova consulta ao banco de dados; além daquela que será realizada pelo próprio WordPress.
Utilizando o gancho pre_get_posts é possível incorporar filtros na consulta que será realizada pelo sistema, antes dela ser executada:
function search_filter( $query ) {
if ( $query->is_search )
$query->set( 'post_type', 'post' );
}
add_action( 'pre_get_posts', 'search_filter' );
Acima, foram filtrados os resultados de busca permitindo exibir apenas posts e não páginas ou outros tipos personalizados. O filtro criado será executado sempre antes de quaisquer consultas acima apresentadas, pois este ocorre dentro da classe WP_Query.
Técnicas de consulta na prática
Com a aplicação correta das técnicas de consulta e filtros é possível otimizar o uso de servidor e tempo de resposta aos visitantes. A escolha de qual técnica deve ser utilizada irá depender da proposta do seu trabalho e a finalidade da consulta em si, lembrando que:
- query_posts – Executa uma nova consulta ao banco de dados sobrepondo os valores globais recuperados de acordo com a requisição feita pelo visitante;
- WP_Query – Cria uma nova instância independente dos valores globais, porém com a mesma carga de informações desses;
- get_posts – Consulta adicional com resultados mais específicos, também não interfere nos valores globais (a mesmo que se queira isso);
- pre_get_posts – Atribui filtros específicos antes que as consultas sejam submetidas ao banco de dados.
Analise bem os resultados que o seu tema propõe apresentar, é possível ainda que ele não necessite realizar consulta alguma e os valores que deseja utilizar, estejam armazenados em variáveis globais como a $wp_query.