Directorio de artículos
Últimamente he estado trabajando en algo.WordPressQuería añadir un buscador de alto rendimiento a mi sitio web. Tras mucha búsqueda, elegí Meilisearch y lo combiné con un plugin llamado Scry Search.
Al principio todo fue sobre ruedas. Instalé el plugin, lo configuré y el índice se generó automáticamente. La velocidad de búsqueda era rapidísima y la experiencia, en general, excelente.
Pero aquí viene el problema.
En el sitio web hay varios artículos inusuales. Algunos son para pruebas internas, otros son páginas de destino dedicadas a clientes específicos y otros son contenido incompleto que no queremos eliminar. Necesito que estos identificadores de artículo desaparezcan por completo de los resultados de búsqueda.
No basta con que no se pueda encontrar; es que ni siquiera aparece en el índice de Meilisearch.

Pensé que esto era sencillo; solo se trata de excluir algunos ID. La documentación del plugin debe incluir los hooks correspondientes; basta con añadir un filtro y listo.
Resultó que estaba equivocado.
¿Por qué fallan los métodos de interceptación convencionales?
Primero probé el gancho de filtro mencionado en la documentación oficial. Agregué algunas líneas de código a functions.php, lo guardé, actualicé el backend y lo volví a indexar.
Luego revisé el backend de Meilisearch.
Esos artículos siguen ahí.
Me quedé atónito.
Pensé que había escrito el código incorrecto, así que lo revisé varias veces, pero no encontré ningún error. Luego busqué en los problemas de GitHub del plugin y descubrí que varias personas habían tenido problemas similares.
Resulta que el complemento Scry Search utiliza un mecanismo de cola de tareas asíncrono para evitar ralentizar el proceso de guardado en segundo plano. Esto significa que, al hacer clic en "Guardar artículo" en segundo plano, los datos pueden enviarse instantáneamente a una tabla de tareas personalizada, sin pasar por el filtrado habitual de artículos individuales.
Lo que resulta aún más insidioso es que, al hacer clic en "Indexar publicaciones" en segundo plano para regenerar el índice global, el complemento realiza directamente una consulta por lotes a la base de datos subyacente. En ese momento, el gancho de filtro que agregaste anteriormente no llega a ejecutarse.
En otras palabras, los métodos de bloqueo convencionales solo se activan en el momento en que se guarda manualmente el artículo. Pero la lógica de sincronización de Scry Search es mucho más compleja de lo que uno podría imaginar.
Código central del interceptor de doble seguro
Tras reflexionar sobre ello, me di cuenta de que este asunto no podía quedar así.
Dado que el gancho convencional solo controla el punto de entrada de "guardado de un solo artículo", necesito encontrar una manera de bloquearlo también desde otros lugares.
He ideado dos caminos.
El primer problema radica en la transmisión de datos en la red. Ya sea sincronización de artículos individuales o por lotes, los datos finales deben enviarse al servidor Meilisearch mediante solicitudes HTTP, ¿verdad? Por lo tanto, antes de enviar la solicitud HTTP, debo verificar si el cuerpo de la solicitud contiene los ID de los artículos excluidos. De ser así, debo bloquear directamente el envío de la solicitud.
El segundo punto se refiere a la consulta a la base de datos. Dado que el complemento recupera la lista de artículos directamente de la base de datos durante la indexación por lotes, eliminaré esos ID específicos de los resultados de la consulta antes de ejecutarla. Desde la perspectiva del complemento, estos artículos no existen, por lo que no se recuperarán.
Dos caminos, doble seguridad. Si un camino no se puede bloquear, hay otro de respaldo.
Una vez que lo entendí, comencé a escribir código.
Para el primer interceptor, utilicé el nativo de WordPress.pre_http_requestEl filtro. Este gancho se activa antes de que WordPress realice cualquier solicitud HTTP. Mi lógica es que detectará si la URL solicitada contiene...meilisearchSi el cuerpo de la solicitud contiene los identificadores de los artículos excluidos, la solicitud será bloqueada.
Para evitar que el plugin reporte errores, también necesito simular una respuesta exitosa. El formato de respuesta estándar para Meilisearch es...{"taskUid":0,"status":"enqueued"}Simplemente devolví esto, haciendo que el complemento pensara que la sincronización había sido exitosa.
El segundo interceptor que utilicépre_get_postsEl gancho. Este gancho se activa antes de que WordPress ejecute una consulta a la base de datos. Mi lógica es que, siempre que un administrador realice una operación en el backend o cuando un plugin realice operaciones asíncronas/síncronas, los ID excluidos deberían fusionarse con...post__not_inEn los parámetros.
Después de terminar de escribirlo, lo probé.
Primero, accedí al panel de administración, abrí uno de los artículos excluidos, realicé algunos cambios menores y pulsé "Actualizar". Se guardó correctamente sin errores. Luego revisé el panel de administración de Meilisearch y el índice del artículo permaneció sin cambios; no había aparecido nada nuevo.
Volví a hacer clic en "Indexar publicaciones" y reconstruí todo el índice. Tras esperar un rato, revisé el panel de administración de Meilisearch. Los artículos excluidos seguían ahí.
Está hecho.
Análisis en profundidad: ¿Cómo funciona el mecanismo de doble seguro?
Para ser honesto, este proceso me recordó algo bastante interesante.
Como saben, en la década de 1880, cuando la electricidad apenas comenzaba a generalizarse en Estados Unidos, muchos dueños de fábricas invirtieron grandes sumas de dinero en la compra e instalación de generadores y motores eléctricos en sus fábricas. Sin embargo, tras la instalación, muchos descubrieron que la eficiencia de la producción no mejoró significativamente.
为什么?
Porque simplemente sustituyeron la máquina de vapor por un motor eléctrico, pero la distribución general, los procesos y los métodos de gestión de la fábrica permanecieron inalterados. La electricidad era nueva, pero la mentalidad para usarla era antigua.
Quienes realmente se beneficiaron del auge de la electricidad fueron, de hecho, el primer grupo en comprender "lo que realmente significa la electricidad". No solo cambiaron su fuente de energía, sino que rediseñaron todo su proceso de producción.
justo ahoraAILo mismo ocurre con la época. Mucha gente usa la IA como herramienta, pero pocos se plantean qué lógica subyacente modifica realmente. La herramienta puede ser nueva, pero la mentalidad con la que se usa puede seguir estando desfasada.
Por ejemplo, cuando configuré el bloqueo de búsqueda de WordPress, probablemente no habría podido hacerlo funcionar si simplemente hubiera seguido los métodos estándar de la documentación del plugin. Esto se debe a que la lógica de sincronización de Scry Search ya no se basa en el enfoque tradicional de "guardar un artículo, sincronizar un artículo"; ahora utiliza colas asíncronas, procesamiento por lotes y su propio conjunto de mecanismos.
Necesitas comprender cómo funciona este mecanismo antes de poder lograr un verdadero avance.
Limitaciones y precauciones del plan
Sin embargo, debo decir francamente que este plan tampoco es perfecto.
Presenta una limitación importante: solo puede gestionar sincronizaciones futuras y no puede borrar automáticamente los registros históricos existentes en Meilisearch. En otras palabras, si ya ha sincronizado esos artículos, aún deberá eliminar manualmente los datos antiguos en el panel de control de Meilisearch o mediante comandos de la API.
Esta es una tarea que se realiza una sola vez; una vez terminada, no tendrás que preocuparte más. Pero necesito aclararlo de antemano para que, después de implementar el código, no encuentres esos artículos en los resultados de búsqueda y pienses que el código no ha surtido efecto.
Otro aspecto a tener en cuenta es que este enfoque depende de la arquitectura de red y base de datos subyacente de WordPress. Mientras las futuras versiones del plugin Scry Search sigan funcionando con esta arquitectura, este interceptor seguirá siendo efectivo. Sin embargo, si en algún momento cambia a un mecanismo de sincronización completamente diferente, podría ser necesario readaptarlo.
Para ser honestos, sin embargo, esto es poco probable. Todo el ecosistema de WordPress está construido sobre esta arquitectura, y es prácticamente imposible que los complementos la eludan por completo.
Guía de tres pasos para la implementación
/**
* Scry Search 双保险拦截器:彻底排除指定文章 ID 同步到 Meilisearch
*/
// ==========================================
// 【配置】请在这里填写你想要排除的文章或页面 ID
// ==========================================
define('MEILI_EXCLUDED_IDS', array(1067, 1014, 1474, 34020));
/**
* 保险一:拦截单篇保存/更新时的网络推送 (方案 A 优化版)
* 原理:当 WordPress 发送网络请求时,如果发现是发往 meilisearch 且带有排除的 ID,直接掐断
*/
add_filter('pre_http_request', function($preempt, $parsed_args, $url) {
// 1. 检查是不是发往 Meilisearch 的请求
if (strpos($url, 'meilisearch') !== false && isset($parsed_args['body'])) {
$body_content = $parsed_args['body'];
// 2. 检查请求体里是否包含任何一个被排除的文章 ID
foreach (MEILI_EXCLUDED_IDS as $id) {
// 匹配格式如 "id":1067 或 字符串中的 ID
if (strpos($body_content, (string)$id) !== false) {
// 找到匹配,直接拦截网络请求,并向插件伪造一个标准的成功响应
return array(
'response' => array('code' => 200, 'message' => 'OK'),
'body' => '{"taskUid":0,"status":"enqueued"}'
);
}
}
}
return $preempt;
}, 10, 3);
/**
* 保险二:拦截后台全量索引时的数据库查询 (方案 B)
* 原理:在插件试图从数据库捞取文章列表时,直接将这几个 ID 从查询结果中剔除
*/
add_action('pre_get_posts', function($query) {
// 仅在后台管理员操作,或者插件执行异步同步时生效
if (is_admin() || (defined('DOING_ASYNC') && DOING_ASYNC)) {
// 获取当前查询已经存在的排除 ID(如果有的话)
$current_excluded = $query->get('post__not_in');
if (!is_array($current_excluded)) {
$current_excluded = array();
}
// 将我们的专属排除 ID 合并进去
$query->set('post__not_in', array_merge($current_excluded, MEILI_EXCLUDED_IDS));
}
});
Finalmente, resumamos los pasos de la operación.
Primero, copia el código al final de tu archivo functions.php o agrégalo usando el plugin Code Snippets. Luego, en la parte superior...defineEn la matriz, introduzca el ID del artículo o página que desea excluir.
El segundo paso consiste en limpiar los índices históricos. Inicie sesión en su panel de control de Meilisearch o utilice comandos de la API para eliminar manualmente los datos de índice antiguos de los artículos excluidos.
El tercer paso es la prueba. Acceda al panel de administración y realice los cambios menores necesarios en el artículo excluido, haga clic en "Actualizar" y, a continuación, revise el panel de administración de Meilisearch. Si no aparece ningún índice nuevo, el bloqueo se ha aplicado correctamente.
Para ser sincero, siempre me he sentido un poco culpable al escribir este tipo de artículos técnicos para compartir información.
Lo que comparto puede ser útil para algunas personas, pero para otras pueden ser simplemente operaciones básicas.
Pero el proceso de implementar el bloqueo de búsquedas en WordPress esta vez fue realmente revelador. A menudo, los problemas que encontramos no se deben a la falta de soluciones, sino a que nuestra forma de pensar está limitada por los marcos de trabajo existentes.
El plugin Scry Search ofrece un gancho de filtrado, lo que nos lleva a pensar que esta es la única opción. Sin embargo, la arquitectura completa de WordPress ofrece muchas más posibilidades. La interceptación se puede lograr tanto en la capa de red como en la de la base de datos. Si estás dispuesto a pensar, siempre hay una solución.
Por eso me gusta trastear con estos aparatos técnicos. No se trata de presumir ni de intentar impresionar. Simplemente, la sensación de comprender completamente un problema es increíblemente gratificante.
Al igual que en esta ocasión, desde la confusión inicial, pasando por la reflexión intermedia, hasta la solución final, todo el proceso fue como resolver un rompecabezas.
El misterio ha sido resuelto, la respuesta ha sido revelada, resulta que era así de simple.
Pero si no has pasado por ese proceso confuso, nunca comprenderás esta sencilla alegría.
Ahora que has leído hasta aquí, si te ha resultado útil, dale a "Me gusta" y compártelo. Si quieres recibir las últimas novedades antes que nadie, también puedes seguirme.
Gracias por leer mi artículo. ¡Hasta la próxima!
Esperanza Chen Weiliang Blog ( https://www.chenweiliang.com/ El artículo "Cómo excluir completamente un ID de publicación específico de la sincronización con Meilisearch en WordPress (el plugin Scry Search en la práctica)" que se comparte aquí puede resultarle útil.
Bienvenido a compartir el enlace de este artículo:https://www.chenweiliang.com/cwl-34343.html
