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?
- O plugin escuta toda requisição de busca (is_search()).
- Se o termo for um número (is_numeric()), ele ativa um filtro que modifica o SQL da busca.
- Esse filtro (posts_where) adiciona uma cláusula OR para buscar diretamente pelo ID.
- 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.
