/ WordPress

Buscando Posts por Título no WordPress com WP Query e Filtros

Alguns dias atrás, em um determinado projeto, precisei vincular um post do WordPress à outro post, em outro post_type, utilizando apenas o título do post na busca.

De cara, tentei o óbvio: fazer uma WP_Query e buscar por post_title e post_type, o que, em teoria, deveria ser o suficiente. Claro, em teoria.

Na prática, o WordPress não encontrou o post que eu queria, mas sim o primeiro post daquele post_type. 5 minutos de Google, 1 café e vários fios de cabelo branco depois, encontrei uma possível solução: criar um filtro e manipular o SQL diretamente.
Sim, basicamente a WP_Query padrão do WordPress não consegue fazer uma simples busca pelo título do post, mesmo fazendo todo tipo de junção louca de taxonomias... Bom, fazer o que né, bora fazer nós mesmos! ¯\_(ツ)_/¯

Na real, a ideia deste post é ajudar a todos que possam estar com o mesmo problema, para que não tenham que reinventar a roda... (nem perder tanto cabelo)

Tela de um Macbook, provavelmente de alguém sofrendo tentando entender o motivo de seu código não funcionar
Foto por Luca Bravo / Unsplash

Basicamente o código deverá:

  • Criar uma nova variável de busca: wp_buscar_por_titulo, que como o nome já diz, faz a busca por match exato no título
  • Realizar um escape na variável ANTES de ser inserida no SQL, para evitar injeções de código (para isto usamos o esc_sql e esc_like do próprio WordPress)
  • Injetar uma condicional AND no código junto com nosso SQL personalizado
  • Realizar uma WP_Query com esta nova variável de busca, limitando o posttype ao que desejamos procurar (no caso de exemplo, 'pessoa'), limitando-se a apenas 1 resultado
  • Retornar null caso não encontre nada
  • Resetar a Query do WordPress depois de finalizado, para que retorne ao estado original

Antes de tudo, gostaria de dizer que não vou inserir código-fonte algum diretamente aqui no texto. Seu propósito é explicar o funcionamento (a lógica) do que estamos fazendo. Caso queira conferir o código-fonte, o link para o GitHub está no fim do texto.

Então, vamos lá!

Em primeiro lugar, temos a nossa função de busca por filtro. Ela basicamente é a mesma que encontrei no Stack Exchange, porém com uma ou outra adaptação para ficar mais legível.

Logo a seguir, temos a função principal de busca. É esta a função que cria a WP_Query e diz ao WordPress que queremos utilizar o parâmetro wp_buscar_por_titulo para realizar a busca pelo nome.
Esta mesma função também já processa o loop do WordPress, salva o post encontrado em uma váriavel, reseta o loop e retorna o post (ou null), mantendo assim o código final da página single.php mais simples e legível.

E falando na página single.php, é nela que iremos aplicar o resultado disso tudo acima. Para simplificar um pouco, separei o código PHP do HTML, mas você ainda pode exibir os dados dentro do loop normalmente.

Nela vamos bem direto ao ponto. Começamos salvando em variáveis o post atual e seu ID, para uso posterior. Em seguida, obtemos um Campo Personalizado chamado pessoa, que contém o nome que será buscado no título do outro post_type.
Tudo isso já é seguido da função realizando a busca, juntamente do fim do loop e com o HTML logo abaixo.

Setup no WordPress

Para o código demonstrativo, foram usados no WordPress:

SS0034
Um Content Type personalizado, criado utilizando o Toolset Types, contendo Título e Conteúdo (padrão), com slug pessoa

SS0033
Um Campo Personalizado dentro do Post, usando a ferramenta padrão do WordPress (mais abaixo). Este campo será vinculado ao Título do Content Type acima.

No final, ao acessar o post, podemos ver os dados tanto do post atual, como do post vinculado sendo exibidos no navegador (seguindo o HTML do single.php):
SS0035

Agora, basta personalizar o código e adaptar às suas necessidades! 😄

Código-fonte

E, sem mais delongas, temos o código final, comentado, explicado e dividido em dois arquivos (o single.php do post e o functions.php que pode ser inserido no tema) no GitHub

Nota:
Gostaria de agradecer o usuário Jan Fabry, da Stack Exchange, por ter indicado os filtros como solução deste problema de uma forma elegante e sem gambiarras. Seu código serviu como uma fundação para solucionar este tipo de busca que, no fundo, já devia ter sido implementado no próprio WordPress.

Foto de Capa por NeONBRAND / Unsplash

Matheus Pratta

Matheus Pratta

Desenvolvedor web que ama design, fotografia e cinema. Atualmente morando em algum lugar entre São Paulo e Minas Gerais. 🍃🌄

Ler Mais