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

Parabéns (atrasado) ao Linux!

Na ultima Quinta-feira (dia 25/08) foi o aniversário de 25 anos do GNU/Linux. E mesmo que atrasados, nós da Brasa desejamos um feliz aniversário ao OS mais utilizado no mundo!

Pra comemorar, resgatamos o primeiro post do Linus Torvalds (fundador do Linux) anunciando o sistema:

 

Olá a todos que usam minix-

Estou criando um sistema operacional (livre) (apenas como hobby, não será grande e profissional como o gnu) para clones AT 386(486). Estou me preparando desde abril, e está começando a tomar forma. Gostaria de receber qualquer feedback de coisas que as pessoas gostam ou não gostam no minix; como meu SO se assemelha um pouco (algum layout físico no sistema de arquivos devido a razões práticas) além de outras coisas.

Eu já portei o bash (1.08) e o gcc (1.40), e as coisas parecem estar funcionando. Isso implica que eu terei algo em prática em alguns meses, e gostaria de saber que recursos a maioria das pessoas quer. Quaisquer sugestões são bem-vindas, mas eu não prometo implementá-las 🙂

Linux Torvalds torvalds@kruuna.helsinki.fi

PS. Sim – ele está livre de qualquer código minix, e tem um fs de multithread. Ele não é portável (usa chaveamento de tarefas, etc. 386) e provavelmente nunca será compatível com nada além de discos rígidos AT, pois isso é tudo que eu tenho :-).

 

Essa mensagem antiga mostra muito bem como funciona o software livre e como uma simples brincadeira de um recém adulto (Linus tinha 21 anos quando iniciou o Linux em 1991) foi capaz de virar a base de toda uma comunidade global, dos que pensam o software livre como meio de liberdade.

O GNU/Linux nos deu possibilidade de criar o novo sem ficar preso a sistemas operacionais fechados. Graças a eles (GNU e Linux) surgiram todas essas inovações baseadas em software livre, graças a esse sistema, temos o WordPress e tudo mais.

Parabéns Linux!

Contribua com o WordPress no WP Translation Day

Entendo que muitas vezes a contribuição com WordPress fica focada em usuários técnicos, ou seja, desenvolvedores, designers, administradores de servidores, etc. O usuário comum, aquele que de fato usa a plataforma acaba ficando de lado e deixando de colaborar.

Mas existe um jeito fácil para o usuário comum colaborar com o software livre (e é uma das coisas mais importantes): ajudando na tradução.

E vendo a importância de trazer esse tipo de colaboração para dentro do WordPress, a comunidade do mundo todo está organizando um dia inteiro de palestras e informações desse tema. Será no dia 24/04: WPTranslationday.org.

Convido todos a acompanhar e quem puder, claro, usar esse dia para fazer conteúdo sobre tradução do WordPress.

 

Feliz dia do Graffiti 2016

A Brasa deseja a todos que gostam, admiram e fazem graffiti um feliz Dia.

feliz-dia-do-graffiti

E em breve teremos novidades sobre o projeto Dia do Graffiti – Acervo Digital, que estaremos iniciando oficialmente na festa de comemoração do Dia do Graffiti de 2016 na Ação Educativa no dia 30/03 a partir das 19h na Rua General Jardim, 660 – Vila Buarque / São Paulo / SP.

WordCamp Sampa 2015 – Vamo que vamo!

A edição de 2015 que acontecerá no dia 28 de Novembro, terá sede novamente na conhecida PUC Consolação (ver Mapa)

Os WordCamps acontecem em varias partes do mundo, no Brasil felizmente muitas cidades também estão em um movimento de organização de novas edições. Este ano já tivemos edições em Belo Horizonte (13 de Junho), Rio de Janeiro (29 de Agosto) e Porto Alegre (31 de Outubro).

O WordCamp é um evento oficial com autorização da Fundação WordPress. Você pode conferir todas as edições na página oficial do WordCamp Central.

central

Página do WordCamp Central

O evento busca promover e compartilhar conhecimento sobre este incrível gerenciador de conteúdo que deixou de ser uma plataforma somente para blogs a muito tempo atrás e que hoje já domina mais de 60% da Internet nos EUA.

Considerado um Software Livre pela FSF (Free Software Foundation) o WordPress vem ganhando popularidade por manter uma comunidade engajada de colaboradores, uma rede de profissionais e instituições que se utilizam do mesmo como forma de alavancar-se na internet, bem como sua facilidade de instalação e uso, fazendo da internet um lugar para todos!

 

A equipe da Brasa está se preparando para aparecer em peso mais uma vez! Será nosso 6º WordCamp desde que começamos a contribuir com a comunidade, organizando Meetups, WordCamps e fazendo da internet um lugar de beleza única para todos! =)

A Brasa cobrirá o evento em sua página no Facebook e Twitter. Fique ligado!!!

Nos vemos por lá!

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