Acelere seu WordPress ao armazenar em cache consultas personalizadas usando a API de Transientes

Ó menino, o título parece assustador, não. Você não tem nada com que se preocupar porque vamos quebrar tudo. O seu tema está executando consultas personalizadas do WordPress para mostrar postagens aleatórias, postagens populares, postagens recentes etc. na barra lateral ou em qualquer outro lugar? Se sim, então você deve considerar usar a API transitória do WordPress para armazenar em cache essas consultas para reduzir o consumo de recursos, além de ajudar o tempo de carregamento. Neste artigo, mostraremos como acelerar o seu site do WordPress ao armazenar em cache consultas personalizadas usando a API de Transientes.

Nota: Você precisa entender como funcionam os temas do WordPress (loops etc), para que você possa seguir esta publicação.

Então, todo o cachimbo e a linguagem transitória estão passando por minha cabeça. Bem, não se preocupe, deixe-nos explicar o que faz. Basicamente, se você estiver executando um site como List25 e tiver um loop que mostre 6 posts aleatórios em sua barra lateral, a API transiente pode ajudar. Toda vez que um usuário atualiza a página, essa consulta WP personalizada que você terá irá no seu banco de dados e puxará 6 posts aleatoriamente. Se você é um site relativamente novo, não deve ser tão ruim assim. Mas se você está recebendo muitas pessoas no seu site, então pode travar seu servidor SQL, e você verá a tela “Erro que estabelece conexão de banco de dados”. Ao adicionar algumas linhas de código extra, você pode facilmente armazenar os resultados dessa consulta (armazenar em cache) por um determinado período de tempo usando a API de Transientes.

Exemplo do código de loop que tivemos para puxar mensagens aleatórias:

have_posts ()): $ random_query-> the_post ();
 ?> 

A parte mais legal sobre nossa consulta de mensagens aleatórias na barra lateral foi mostrada um novo conteúdo sempre. Então, ao armazenar em cache a consulta por 12 horas, teremos as mesmas 6 postagens mostrando por 12 horas, certo? Bem, encontramos um trabalho graças à sugestão do nosso amigo Konstantin Kovshenin (@kovshenin). Ele sugeriu que em vez de usar o WP_Query, usamos get_posts e extrai 20 posts. Cache os resultados dessa consulta usando a API de transientes e, em seguida, use a função array_rand () para mostrar apenas 6 posts do original 20 ao acaso. Desta forma, podemos manter simular o efeito aleatório no site.

A primeira coisa que fizemos foi definir o transiente. Obtivemos o código da página do WordPress Codex.

// Obter qualquer cópia existente de nossos dados transitórios
 if (false === ($ special_query_results = get_transient ('special_query_results'))) {
     // Não estava lá, então regenere os dados e salve o transiente
 $ randargs = array ('orderby' => 'rand', 'numberposts' => 20);
 $ special_query_results = get_posts ($ randargs);
     set_transient ('special_query_results', $ special_query_results, 60 * 60 * 12);
 } 

Observe que o 60 * 60 * 12 é a área onde você pode controlar o comprimento do cache. Sinta-se livre para mudá-lo para o que você quiser. Agora, se mostramos $ special_query_results usando o loop foreach, teremos as 20 postagens exibidas. Portanto, precisamos utilizar a função array_rand () para apenas puxar 6 itens aleatoriamente. Nós adicionamos o código como este:

$ randomposts = get_transient ('special_query_results');
 $ randkey = array_rand ($ randomposts, 6); 

Agora, isso retirará 6 IDs de posts aleatoriamente de nossos dados transitórios. No entanto, não irá puxar os valores para cada publicação. Então, nós devemos adicionar esses bits de código:

$ seisposts [0] = $ randomposts [$ randkey [0]];
 $ seisposts [1] = $ randomposts [$ randkey [1]];
 $ seisposts [2] = $ randomposts [$ randkey [2]];
 $ sixposts [3] = $ randomposts [$ randkey [3]];
 $ seisposts [4] = $ randomposts [$ randkey [4]];
 $ seisposts [5] = $ randomposts [$ randkey [5]]; 

Basicamente, criamos uma matriz para $ seisposts em que atribuímos um valor a cada um desses itens. Não tenho certeza se esta foi a melhor maneira de ir sobre isso, mas funcionou. Se algum de vocês tiver melhores sugestões, então fique à vontade para publicá-lo nos comentários.

Depois de fazer isso, agora estamos prontos para exibir o loop. Basta colocar o código como este:

$ global;  // necessário para que ele funcione
 foreach ($ seisposts como $ post): setup_postdata ($ post);

 // Todos os itens vão aqui.

 por fim, 

setup_postdata permite que você use todas as tags de loop dentro deste loop foreach, como the_permalink etc.

Para facilitar a todos, aqui está o código final que temos:

'rand', 'numberposts' => 20);
 $ special_query_results = get_posts ($ randargs);
     set_transient ('special_query_results', $ special_query_results, 60 * 60 * 12);
 }

 // Use os dados como você teria normalmente ...
 $ randomposts = get_transient ('special_query_results');
 $ randkey = array_rand ($ randomposts, 6);
 $ seisposts [0] = $ randomposts [$ randkey [0]];
 $ seisposts [1] = $ randomposts [$ randkey [1]];
 $ seisposts [2] = $ randomposts [$ randkey [2]];
 $ sixposts [3] = $ randomposts [$ randkey [3]];
 $ seisposts [4] = $ randomposts [$ randkey [4]];
 $ seisposts [5] = $ randomposts [$ randkey [5]];

 $ global;
 foreach ($ seisposts como $ post): setup_postdata ($ post);  ?> 

Ta da, agora você está fazendo essa consulta DB uma vez a cada 12 horas, não importa quantos usuários estejam visitando seu site.