Potencialize a busca no WordPress permitindo pesquisa por ID com o plugin My Bricks Search

Em muitos projetos WordPress — especialmente aqueles com painel administrativo personalizado ou interfaces avançadas com Bricks Builder — é comum precisar de formas mais flexíveis de busca. Uma dessas necessidades é permitir que usuários possam encontrar conteúdos diretamente pelo ID do post. Esse tipo de funcionalidade é útil para administradores, suporte técnico ou usuários mais avançados.

Pensando nisso, criamos o plugin My Bricks Search, que estende o comportamento padrão do WordPress para permitir que buscas no site também retornem posts quando o termo de busca for um número que corresponda ao ID de um post existente.

🚀 O que esse plugin faz?

O plugin atua nos bastidores, utilizando hooks nativos do WordPress (pre_get_posts e posts_where) para verificar se o termo de busca (?s=…) é um número. Se for, ele ajusta a cláusula SQL da query principal para incluir o post com aquele ID, respeitando o post_type e garantindo que ele esteja publicado.

Exemplo prático:

Imagine que você tem um post com ID 245. Se você fizer uma busca por 245, o WordPress normalmente não o retornaria, a menos que “245” esteja no título ou conteúdo. Com esse plugin ativo, o post com ID 245 será incluído nos resultados mesmo que esse número não apareça em nenhum campo textual.


🧠 Como funciona tecnicamente?

  1. O plugin escuta toda requisição de busca (is_search()).
  2. Se o termo for um número (is_numeric()), ele ativa um filtro que modifica o SQL da busca.
  3. Esse filtro (posts_where) adiciona uma cláusula OR para buscar diretamente pelo ID.
  4. O plugin respeita o tipo de post (post_type) e o status (publish).
<?php
namespace My_Bricks_Search;

if ( ! defined( 'WPINC' ) ) {
	die;
}

class Plugin {
	public static $instance = null;
	private $search_query = null;

	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}
		return self::$instance;
	}

	public function maybe_hook_id_clause( $query ) {
		if ( ! is_admin() && $query->is_search() && $query->is_main_query() ) {
			$search_term = isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ) : '';
			if ( is_numeric( $search_term ) ) {
				$this->search_query = absint( $search_term );
				add_filter( 'posts_where', array( $this, 'add_id_clause' ), 10, 2 );
			}
		}
		return $query;
	}

	public function add_id_clause( $where, $query ) {
		if ( ! $this->search_query ) {
			return $where;
		}

		global $wpdb;

		$where .= " OR ( {$wpdb->posts}.ID = {$this->search_query} )";

		if ( ! empty( $query->query['post_type'] ) ) {
			if ( is_array( $query->query['post_type'] ) ) {
				$post_types = array_map( function( $item ) {
					return "'" . esc_sql( $item ) . "'";
				}, $query->query['post_type'] );
				$post_types = implode( ', ', $post_types );
				$where .= " AND {$wpdb->posts}.post_type IN ( {$post_types} )";
			} else {
				$post_type = esc_sql( $query->query['post_type'] );
				$where .= " AND {$wpdb->posts}.post_type = '{$post_type}'";
			}
		}

		$where .= " AND {$wpdb->posts}.post_status = 'publish'";

		$this->search_query = null;
		remove_filter( 'posts_where', array( $this, 'add_id_clause' ), 10, 2 );

		return $where;
	}

	private function __construct() {
		add_action( 'pre_get_posts', array( $this, 'maybe_hook_id_clause' ) );
	}
}

Plugin::instance();

📌 Considerações finais

Este plugin é ideal para quem trabalha com temas personalizados, ferramentas como Bricks Builder, ou simplesmente quer oferecer uma experiência de busca mais poderosa no site. Simples, leve e eficaz.

Se quiser, você pode registrar esse plugin em um diretório próprio ou carregar dentro do seu tema filho.

Voltar ao Blog