Cache fácil no WordPress: Transients API

  • Última modificação: 27/08/2022
  • Tempo de leitura: 3 min.

Neste vídeo comentei o jeito (muito) fácil que o WordPress fornece para fazer cache: a API dos transients. Esse conjunto de funções é muito útil quando você precisa diminuir o número de consultas a APIs externas ou não quer executar queries muito pesadas com muita frequência. Se você tem um trecho de código que demora muito tempo para ser executado, tente fazer cache disso com os transients!

Se quiser testar, você pode copiar o código abaixo para um arquivo php, colocá-lo na pasta wp-content/plugins e ativar o plugin My GitHub Repos que aparecerá na lista de plugins dentro do Painel do WordPress.

<?php
/**
 * Plugin Name: My GitHub Repos
 * Description: Exibe a lista de repositórios de um usuário no GitHub
 * Version:     1.0
 * Author:      Felipe Elia
 * Author URI:  https://felipeelia.com.br/
 */

defined( 'ABSPATH' ) || exit;

/**
 * Define o shortcode do plugin.
 *
 * @param array $atts Atributos do shortcode. Recebe "user".
 * @return string
 */
function my_gh_repos_shortcode( $atts ) {
	$atts = shortcode_atts(
		[
			'user' => 'felipeelia',
		],
		$atts
	);

	$repos  = my_gh_repos_get_repos( $atts['user'] );
	$output = '';

	if ( ! empty( $repos['repos'] ) ) {
		ob_start();
		?>
		<p><?php echo $repos['date']; ?></p>
		<ul>
			<?php foreach ( $repos['repos'] as $link => $name ) { ?>
				<li><a href="https://github.com/<?php echo $link; ?>"><?php echo $name; ?></a></li>
			<?php } ?>
		</ul>
		<?php
		$output = ob_get_clean();
	}
	return $output;
}
add_shortcode( 'my_gh_repos', 'my_gh_repos_shortcode' );

/**
 * Consulta a API do GitHub e retorna repositórios de um usuário.
 *
 * @param string $user Usuário no GitHub.
 * @return array
 */
function my_gh_repos_get_repos( $user ) {
	$transient_name = 'my_gh_repos_' . $user;
	$cached         = get_transient( $transient_name );
	if ( false !== $cached ) {
		return $cached;
	}

	$url      = 'https://api.github.com/users/' . $user . '/repos?per_page=100';
	$response = wp_remote_get( $url );
	$return   = [
		'date'  => date_i18n( 'H:i:s' ),
		'repos' => [],
	];

	if ( is_array( $response ) && ! is_wp_error( $response ) ) {
		$repos = $response['body'];
		$repos = json_decode( $repos );
		$repos = wp_list_pluck( $repos, 'name', 'full_name' );

		$return['repos'] = $repos;

		set_transient( $transient_name, $return, 3 * HOUR_IN_SECONDS );
	}

	return $return;
}

Não se esqueça de ajudar compartilhando com os seus amigos! 🙂

Felipe Elia

Associate Director of Platform Engineering na 10up, WordPress Core Contributor, Global Polyglots Mentor na comunidade internacional do WordPress e Locale Manager na comunidade WordPress Brasil.