Utilizando a busca do WordPress em termos de taxonomia

Imagine que em um site eu tenho uma taxonomia chamada “Tipo”, com os termos “Praia”, “mirante”, “restaurante” e “pousada”.
Quero fazer com que a busca do wordpress procure também nos nomes desses termos, ou seja, se eu digitar na busca a palavra “Praia” ele deve me retornar também os posts que estão associados a este termo (praia).

A busca padrão do WordPress tenta encontrar ocorrências dos termos pesquisados dentro dos campos título, conteúdo e resumo do post.

Podemos utilizar o mecanismo da busca padrão para encontrar ocorrências em outros campos também, neste caso, o nome dos termos de uma taxonomia associadas aos posts.

Minha primeira tentativa foi utilizar o hook  pre_get_posts para modificar os argumentos da query, incluindo um argumento tax_query.

function tax_na_busca($query) {
 if ( !$query->is_search ){
    
    //caso não seja busca retorna $query sem alteração
    return $query;
 }
 
 //caso é uma query de busca:

 //pega todos os termos da taxonomia "nome_taxonomia" que o tenham o nome igual ao valor digitado na busca
 $term = get_term_by('name', $query->query['s'], 'nome_taxonomia');
 
 
 //verifica se existe algum termo
 if ($term) {
   
   //pega a id do termo
   $id_termo = $term->term_id;
   
   //cria uma variavel com a tax_query que iremos inserir
   $tax_query = array(
   array(
     'taxonomy' => 'nome_taxonomia',
     'field' => 'id',
     'terms' => $id_termo,
     )
   );
 
   // modifica a query, adicionando a tax_query
   $query->set( 'tax_query', $tax_query );
 }

}
add_action( 'pre_get_posts', 'tax_na_busca' );

Não fiquei satisfeito com o resultado pois se existe o termo buscado na taxonomia a query irá trazer só os posts que tem esse termo de taxonomia ligado a ele.

Por exemplo, ao buscar pela palavra “praia” no site com os seguintes posts publicados:

Post 1:
título: Praia de Boiçucanga
conteudo: Lorem ipsum dolor sit amet
termos: praia, mirante
Post 2:
título: Camburi
conteudo: Praia Lorem ipsum dolor sit
termos: mirante
Post 3:
título: Toque toque pequeno
conteudo: Lorem ipsum dolor sit amet
termos: praia

em uma busca padrão ( sem a modificação ) teríamos como resultado os posts que se enquadram na seguinte regra lógica:
( (Tem praia no nome) OU (tem praia no conteúdo) OU (tem praia no resumo) )
ou seja, só os posts 1 e 2.

Na nossa busca modificada, como o termo “praia” existe na taxonomia “tipo”, temos como resultado os posts que se enquadram na seguinte regra lógica:
( (Tem praia no nome) OU (tem praia no conteúdo) OU (tem praia no resumo) ) E (é associado ao termo “praia” da taxonomia “tipo”)
ou seja, o post 1.

Para resolver o meu problema eu queria uma função que fizesse com que a busca retornasse esses três posts, seguindo a seguinte regra lógica:
( (Tem praia no nome) OU (tem praia no conteúdo) OU (tem praia no resumo) ) OU (é associado ao termo “praia” da taxonomia “tipo”)

Decidi então (após conselho do Matheus) utilizar o hook do wordpress posts_where para adicionar um filtro que altera a clausula WHERE do sql da query.

A minha nova função ficou assim:

function busca_tax( $where,&$wp_query ){
   	global $wpdb;
    global $wp_query;

		//verifica se a query é uma busca e se é main query
		if ($wp_query->is_main_query() AND $wp_query->is_search) {
			$busca = $_GET['s'];

			//Adiciona na clausula WHERE a busca por nome de termos mantendo o conteúdo anterior ( utilizando .= em vez de = ).
			$where .= "
				OR $wpdb->posts.ID
				IN (SELECT tr.object_id
					FROM $wpdb->term_relationships
					AS tr
					INNER JOIN $wpdb->term_taxonomy
					AS tt
					ON tr.term_taxonomy_id = tt.term_taxonomy_id
					WHERE tt.taxonomy = 'tipo'
					AND tt.term_id
					IN (SELECT t.term_id
						FROM $wpdb->terms
						AS t
						WHERE name
						LIKE '%$busca%'
					)
				)";
		return $where;
		}
return $where;
}
add_filter( 'posts_where', 'busca_tax', 10, 2 );

Em uma busca padrão pela palavra “praia” teriamos a seguinte clausula WHERE:

AND 
  (
    (
      (wp_posts.post_title LIKE '%praia%') 
      OR 
      (wp_posts.post_excerpt LIKE '%praia%') 
      OR 
      (wp_posts.post_content LIKE '%praia%')
    )
  )  
  AND 
  wp_posts.post_type IN ('post', 'page', 'attachment')
  AND 
  (
    wp_posts.post_status = 'publish' 
    OR 
    wp_posts.post_status = 'private'
  )

Na nossa nova busca com o filtro ativo temos a seguinte clausula WHERE:

AND 
(
  (
    (wp_posts.post_title LIKE '%praia%') 
    OR      
    (wp_posts.post_excerpt LIKE '%praia%') 
    OR 
    (wp_posts.post_content LIKE '%praia%')
  )
)  
AND 
wp_posts.post_type IN ('post', 'page', 'attachment') 
AND 
(
  wp_posts.post_status = 'publish' 
  OR 
  wp_posts.post_status = 'private'
)
OR   wp_posts.ID IN 
(
  SELECT tr.object_id
  FROM wp_term_relationships AS tr
  INNER JOIN wp_term_taxonomy AS tt
  ON tr.term_taxonomy_id = tt.term_taxonomy_id
  WHERE tt.taxonomy = 'tipo'
  AND tt.term_id
  IN 
  (
    SELECT t.term_id 
    FROM wp_terms AS t
    WHERE name
    LIKE '%praia%'         
   )
)

Você pode observar que até a linha 18 o código é o mesmo, a parte que adicionamos começa com um “OR”, para adicionar os resultados à busca padrão.
Dessa forma se o post contem a palavra “praia” no título mas não está relacionada com o termo “praia” da taxonomia ele também será retornado.

O novo código cria uma relação entre as tabelas wp_term_relashionships e wp_term_taxonomy da base de dados para limitar a busca dos termos que estejam incluídos na taxonomia “tipo”.

Durante esse processo utilizei a ferramenta Query Monitor, muito echo e print_r() para ver os parâmetros das querys e o conteúdo da variável $where.

 

Aplicando SSL grátis no seu site com cPanel

No futuro, sites sem SSL (HTTPS) serão considerados inseguros, e esse futuro é breve. Pensando nisso, foi lançado o projeto Let’s Encrypt, que tem em sua fundação o intuito de levar HTTPS gratuitamente para todos.

Por padrão, o Lets Encrypt funciona através de linha de comando no servidor, mas aqui usaremos um site que funciona como uma interface web do Let’s Encrypt. O site é o sslforfree.com.

Continuar lendo

Como adicionar Google Font no WordPress (corretamente)

O WordPress indica que todos os scripts e styles sejam adicionados com as funções wp_register_script() e wp_register_style() respectivamente. Elas são responsáveis por pré-registrar seus scripts, e para adicioná-los a fila de scripts carregados, usamos as funções wp_enqueue_script() e wp_enqueue_style() que organizam a fila de scripts e os imprimem no header ou no footer de acordo com os argumentos passados na função.

Fazendo isso com essas funções, e no functions.php, temos um controle maior sobre onde e quando os carregamentos devem acontecer, e assim evitar de misturar isso diretamente no header.php.

Portanto, podemos simplificar e usar diretamente as funções enqueue’s. Vamos então apresentar um exemplo de como adicionar uma Google Font, o código fornecido pelo Google:

Deve ser aplicado com wp_enqueue_style() da seguinte forma:

wp_enqueue_style( 'open-sans', 'https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,700,700italic', array(), null, 'all' );

Para mais detalhes sobre a função wp_enqueue_style() confira a documentação aqui.

Pronto, com isso temos carregado em nosso WordPress a fonte escolhida, nesse exemplo usei a Open Sans. Agora, onde deseja aplicar essa font, coloque em seu CSS o seguinte trecho (também fornecido pelo Google no momento que escolhe a fonte:

font-family: 'Open Sans', sans-serif;

Trabalhando com a REST API V2 do WordPress usando Ionic e AngularJS — Parte 2: Listando todos posts

Na semana passada começamos nossa série preparando o terreno, isso é, instalando todo o necessário para iniciarmos a construção.. Agora vamos partir para a programação e consumo dos dados do WordPress.

Hoje vamos criar uma página para exibir todos os posts do WordPress no nosso aplicativo, e por fim, na próxima semana vamos terminar compilando nosso app para rodar no Android.

Continuar lendo

Trabalhando com a REST API V2 do WordPress usando Ionic e AngularJS — Parte 1: Preparando o terreno

WordPress era uma plataforma só para blogs — Mas hoje isso já não é assim: Desde 2010, quando foi apresentado os tipos de posts e taxonomias personalizadas, a equipe por trás do WordPress luta para transforma-lo numa grande plataforma com diversos usos, ficando quase que um framework especifico para gerenciamento de conteúdo. A ultima novidade e que desde 2014 está sendo muito falada na comunidade é a REST API, essa API possibilita diversos usos, mas aqui falarei sobre o principal: Com ela podemos construir aplicativos moveis para consumir o conteúdo gerado pelo WordPress. Incrível, não?!

Nesse tutorial, vou dividi-lo em mais de uma parte, porque ele será grande e ficaria impossível e enrolado explicar tudo num post só. Então vou dividir em vários.

Nessa primeira parte do tutorial somente prepararemos o terreno, isso é, vamos instalar tudo o que é necessário para consumir os conteúdos do WordPress para nas próximas semanas partir para de fato construir uma aplicação.

Todo o tutorial será feito com base no sistema operacional Linux. Eu estarei usando o Ubuntu, para ser mais especifico, mas não será difícil aplicar em outros sistemas Unix Like.

Continuar lendo

Conheça o Odin e seus poderes!

Você conhece o Odin? Não, não estou falando do deus nórdico (e nem do personagem da Marvel, hehe) e sim do framework para criação de temas WordPress.

Odin é um framework desenvolvido pela comunidade brasileira do WordPress e usado por vários sites. Aqui na Brasa nós usamos e contribuimos com o Odin.

Nesse post vou listar algumas coisas possíveis de fazer com esse framework fantástico!

Continuar lendo

Exibindo ícone do site padrão caso nenhum seja adicionado

Com a versão 4.3 ou maior do WordPress é possível trocar o ícone do site (favicon)  pela página administrativa Personalizar. Nesse tutorial vou mostrar como podemos deixar um favicon padrão se não houver nenhum setado pelo painel.

Antes de tudo segue um artigo na Wikipédia caso você não saiba o que é favicon.

Agora vamos nessa!

Continuar lendo

Fazendo requisições HTTP através de funções do WordPress

Você precisa usar a API de algum sistema, ou um webservice, o caminho seria CURL ou outra função do PHP, certo? Errado — No WordPress você pode economizar tempo usando funções próprias, sendo que essas funções vão verificar automaticamente qual a melhor forma de faze-lo, seja CURL ou outro.

Tudo será feito usando a chamada HTTP API do WordPress.

Continuar lendo