Como limpar o cache do WordPress por linha de comando

Estou trabalhando em alguns projeto utilizando o WordPress como CMS e em situações específicas eu precisava limpar o cache de todo o site. Não sou fã da plataforma, acho que a performance deixa muito a desejar, mas não posso negar que ela é cheia de facilidades.

Sei que posso fazer apagar o cache por dentro do wp-admin, mas no ambiente de desenvolvimento ou se meu “trigger” para a limpeza de cache é externo, um caminho muito fácil é apagar fisicamente todos os arquivos de cache do WordPress.

Os arquivos de cache ficam em wp-content/cache e podem ter extensões .html, .gz e também .meta. Então com um simples find na linha de comando (unix) você consegue limpar o cache do WordPress com a linha abaixo:

find /var/www/wordpress.gssolutions.com.br/public/wp-content/cache/ \( -name '*.html' -or -name '*.html.gz' -or -name '*.meta' \) -delete

Lembre-se de substituir o caminho (/var/www/wordpress.gssolutions.com.br/public) pelo caminho da instalação do WP no seu servidor.

Tem uma solução melhor para lidar com estas situações? Deixe nos comentários 🙂

Listando todas as imagens de um post no WordPress

Segue uma forma simples e rápida de listar todas as imagens – na verdade, serve para todas as mídias associadas a um post ou page do WordPress:

<?php
   $images = get_posts(array("post_type" => "attachment", "post_parent" => $post->ID, "orderby" => "menu_order"));
   foreach($images as $image) {
      $urls = array ();
      list ($url, $width, $height) = wp_get_attachment_image_src($image->ID, $s);
?>
            <img src="<?php echo $url?>"></img>
<?php } ?>

Claro, esse código funciona dentro do loop!

Como listar posts de uma categoria no WordPress

O WordPress possui uma função nativa para listar os posts, que é a get_posts(params)

Como parâmetros, podem ser passadas algumas condições, e uma delas é o nome da categoria em questão. Então, o código seria o seguinte:

get_posts("category_name=nome_da_categoria");

Troque nome_da_categoria pelo nome da categoria em questão.

Um código completo poderia ser:

<?php $postslist = get_posts("category_name=portfolio");
foreach ($postslist as $post) :
   echo $post->post_title;
endforeach;
?>

 

WordPress – listar usuários com um determinado perfil

Tenho quase certeza que essa não é a melhor forma (sem usar algum plugin) para listar todos os usuários cadastrados no seu blog/site com o WordPress de um determinado perfil, mas no caso em que a performance não é gargalo, não vi problemas:

  • faça um select na tabela de usuários, retornando todos os ids
  • percorra a lista de ids, retornando cada usuário relativo a esse id
  • faz um if para checar o user_level. É ele que define o perfil do usuário

O código seria:

<?php
            $aUsersID = $wpdb->get_col( $wpdb->prepare("SELECT $wpdb->users.ID FROM $wpdb->users ORDER BY %s ASC", ""));
            foreach ( $aUsersID as $iUserID ) :
                $user = get_userdata( $iUserID );
                if($user->user_level==2) { //2 é o user_level para contribuidor
                    //faz o que for necessário com o objeto $user
                }
            endforeach;
?>


 

Pelo que pude ver da estrutura da base do WordPress, que eu ainda estou conhecendo, há uma tabela wp_users que tem os usuários e uma outra, wp_usermeta, de metadados. Não entendi porque user_level não faz parte da wp_users pois está ligado diretamente ao usuário (será que nas primeiras versões não existia esse campo e depois criaram como um metadado?), mas certamente um inner join poderia resolver mais elegantemente essa questão.

Menu por ano e mês no WordPress

Mexendo no template de um blog do WordPress, precisei inserir aquele menu que tem os anos e os mêses desses anos para navegacão.

O código é simples:

<ul>
<?php
/**/
$years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE post_status = "publish" AND post_type = "post" ORDER BY post_date DESC");
foreach($years as $year) :
?>
	<li><a href="<?php echo get_year_link($year); ?> "><?php echo $year; ?></a>
		<ul>
		<?	$months = $wpdb->get_col("SELECT DISTINCT MONTH(post_date) FROM $wpdb->posts WHERE post_status = "publish" AND post_type = "post" AND YEAR(post_date) = "".$year."" ORDER BY post_date DESC");
			foreach($months as $month) :
			?>
			<li><a href="<?php echo get_month_link($year, $month); ?>"><?php echo date( "F", mktime(0, 0, 0, $month) );?></a></li>
			<?php endforeach;?>
		</ul>
	</li>
<?php endforeach; ?>
</ul>

Com isso, será exibido um menu mais ou menos assim

2009

  • Maio
  • Abril
  • Março
  • Fevereiro
  • Janeiro

2008

  • Dezembro
  • Novembro