Artikelverzeichnis
Ich habe kürzlich an einer WordPress- Website gearbeitet und wollte eine leistungsstarke, seitenweite Suchmaschine einbinden. Nach langer Suche entschied ich mich für Meilisearch und kombinierte es mit dem Plugin Scry Search.
Anfangs lief alles reibungslos. Ich installierte das Plugin, konfigurierte es, und der Index wurde automatisch generiert. Die Suchgeschwindigkeit war blitzschnell, und die Benutzererfahrung war wirklich hervorragend.
Aber hier liegt das Problem.
Auf der Website befinden sich einige ungewöhnliche Artikel. Manche dienen internen Tests, andere sind spezielle Landingpages für bestimmte Kunden und wieder andere sind unfertige Inhalte, die wir nicht löschen möchten. Ich benötige die vollständige Entfernung dieser Artikel-IDs aus den Suchergebnissen.
Es reicht nicht, dass es nicht gefunden werden kann; es ist auch nicht im Index von Meilisearch zu finden.

Ich dachte, das wäre einfach; es geht nur darum, ein paar IDs auszuschließen. Die Plugin-Dokumentation sollte die entsprechenden Hooks enthalten; einfach einen Filter hinzufügen, und fertig.
Wie sich herausstellte, lag ich falsch.
Warum versagen herkömmliche Abhörmethoden?
Zuerst habe ich den in der offiziellen Dokumentation erwähnten Filter-Hook ausprobiert. Ich habe einige Codezeilen zu functions.php hinzugefügt, die Datei gespeichert, das Backend aktualisiert und neu indiziert.
Dann habe ich das Meilisearch-Backend überprüft.
Diese Artikel sind noch immer vorhanden.
Ich war fassungslos.
Ich dachte, ich hätte den falschen Code geschrieben, also habe ich ihn mehrmals überprüft, aber er war fehlerfrei. Dann habe ich die GitHub-Issues des Plugins durchsucht und festgestellt, dass mehrere andere Nutzer ähnliche Probleme hatten.
Es hat sich herausgestellt, dass das Scry-Search-Plugin einen Mechanismus mit asynchroner Aufgabenwarteschlange verwendet, um den Speichervorgang im Hintergrund nicht zu verlangsamen. Das bedeutet, dass beim Klicken auf „Artikel speichern“ im Hintergrund die Daten möglicherweise sofort in eine benutzerdefinierte Aufgabentabelle übertragen werden, wodurch die reguläre Einzelartikelfilterung umgangen wird.
Noch heimtückischer ist, dass das Plugin beim Klicken auf „Beiträge indexieren“ im Hintergrund, um den globalen Index neu zu generieren, direkt eine Batch-Datenbankabfrage auf der zugrundeliegenden Ebene durchführt. Der zuvor hinzugefügte Filter-Hook wird dabei nicht ausgeführt.
Mit anderen Worten: Herkömmliche Blockierungsmethoden greifen erst, wenn Sie den Artikel manuell speichern. Die Synchronisierungslogik von Scry Search ist jedoch weitaus komplexer, als Sie vielleicht annehmen.
Doppelversicherungs-Interceptor-Kerncode
Nach einigem Nachdenken wurde mir klar, dass diese Angelegenheit nicht so bleiben konnte.
Da der herkömmliche Hook nur den Einstiegspunkt "Einzelartikel speichern" steuert, muss ich einen Weg finden, ihn auch an anderen Stellen zu blockieren.
Ich habe zwei Lösungswege gefunden.
Das erste Problem betrifft die Netzwerkübertragung. Unabhängig davon, ob es sich um die Synchronisierung einzelner Artikel oder um die Synchronisierung mehrerer Artikel handelt, müssen die endgültigen Daten per HTTP-Anfrage an den Meilisearch-Server gesendet werden, richtig? Daher sollte ich vor dem Senden der HTTP-Anfrage prüfen, ob der Anfragetext die IDs der ausgeschlossenen Artikel enthält. Falls ja, sollte ich die Anfrage direkt blockieren.
Der zweite Punkt betrifft die Datenbankabfrage. Da das Plugin die Artikelliste während der Batch-Indexierung direkt aus der Datenbank abruft, entferne ich die entsprechenden IDs aus den Abfrageergebnissen, bevor ich die Datenbankabfrage ausführe. Aus Sicht des Plugins existieren diese Artikel gar nicht, daher werden sie auch nicht abgerufen.
Zwei Wege, doppelte Sicherheit. Falls ein Weg nicht blockiert werden kann, gibt es einen weiteren als Ausweichmöglichkeit.
Nachdem ich das herausgefunden hatte, begann ich zu programmieren.
Für den ersten Interceptor habe ich den nativen Interceptor von WordPress verwendet.pre_http_requestDer Filter. Dieser Hook wird ausgelöst, bevor WordPress HTTP-Anfragen sendet. Meine Logik sieht vor, dass er erkennt, ob die angeforderte URL … enthält.meilisearchEnthält der Anfragetext die IDs der ausgeschlossenen Artikel, wird die Anfrage blockiert.
Um zu verhindern, dass das Plugin Fehler meldet, muss ich außerdem eine erfolgreiche Antwort simulieren. Das Standardantwortformat für Meilisearch ist...{"taskUid":0,"status":"enqueued"}Ich habe dies einfach zurückgegeben, wodurch das Plugin davon ausging, dass die Synchronisierung erfolgreich war.
Der zweite Abfangjäger, den ich benutztepre_get_postsDer Hook. Dieser Hook wird ausgelöst, bevor WordPress eine Datenbankabfrage ausführt. Meine Logik ist, dass immer dann, wenn ein Administrator eine Operation im Backend durchführt oder ein Plugin asynchrone/synchrone Operationen ausführt, die ausgeschlossenen IDs in die Datenbank integriert werden sollen.post__not_inIn den Parametern.
Nachdem ich es fertig geschrieben hatte, habe ich es getestet.
Zuerst ging ich ins Backend, öffnete einen der ausgeschlossenen Artikel, nahm einige kleinere Änderungen vor und klickte auf „Aktualisieren“. Die Änderungen wurden fehlerfrei gespeichert. Anschließend überprüfte ich das Meilisearch-Backend, und der Index des Artikels blieb unverändert; es waren keine neuen Einträge erschienen.
Ich klickte erneut auf „Beiträge indexieren“ und erstellte den gesamten Index neu. Nach einer kurzen Wartezeit überprüfte ich das Meilisearch-Backend. Die ausgeschlossenen Artikel waren immer noch vorhanden.
Es ist vollbracht.
Detaillierte Analyse: Wie funktioniert der Mechanismus der doppelten Versicherung?
Ehrlich gesagt erinnerte mich dieser Prozess an etwas ziemlich Interessantes.
Wissen Sie, in den 1880er Jahren, als Elektrizität in den Vereinigten Staaten gerade erst verbreitet wurde, investierten viele Fabrikbesitzer viel Geld in Generatoren und Elektromotoren, um diese in ihren Fabriken zu installieren. Nach der Installation stellten viele jedoch fest, dass sich die Produktionseffizienz nicht wesentlich verbesserte.
为什么?
Denn sie ersetzten lediglich die Dampfmaschine durch einen Elektromotor, aber die Gesamtstruktur, die Prozesse und die Managementmethoden der Fabrik blieben unverändert. Elektrizität war neu, aber die Denkweise im Umgang damit war alt.
Diejenigen, die wirklich vom Elektrizitätsboom profitierten, waren die ersten, die verstanden, „was Elektrizität wirklich bedeutet“. Sie änderten nicht nur ihre Energiequelle, sondern gestalteten ihren gesamten Produktionsprozess neu.
Dasselbe gilt für das Zeitalter der KI . Viele nutzen KI als Werkzeug, doch nur wenige hinterfragen die zugrundeliegende Logik, die sie verändert. Das Werkzeug selbst ist neu, aber die Denkweise, mit der es eingesetzt wird, kann veraltet sein.
Als ich beispielsweise die WordPress-Suchblockierung einrichtete, hätte ich sie wahrscheinlich nicht zum Laufen gebracht, wenn ich einfach den Standardmethoden in der Plugin-Dokumentation gefolgt wäre. Das liegt daran, dass die Synchronisierungslogik von Scry Search nicht mehr dem traditionellen Ansatz „einen Artikel speichern, einen Artikel synchronisieren“ entspricht; sie verwendet asynchrone Warteschlangen, Stapelverarbeitung und eigene Mechanismen.
Bevor ein echter Durchbruch gelingen kann, müssen Sie herausfinden, wie dieser Mechanismus funktioniert.
Einschränkungen und Vorsichtsmaßnahmen des Plans
Ich muss jedoch offen sagen, dass auch dieser Plan nicht perfekt ist.
Es hat eine wesentliche Einschränkung: Es kann nur zukünftige Synchronisierungen verwalten und keine bestehenden historischen Datensätze in Meilisearch automatisch löschen. Das heißt, wenn Sie diese Artikel bereits synchronisiert haben, müssen Sie die alten Daten weiterhin manuell im Meilisearch-Dashboard oder mithilfe von API-Befehlen löschen.
Dies ist eine einmalige Aufgabe; sobald sie erledigt ist, brauchen Sie sich keine weiteren Gedanken darüber zu machen. Ich möchte dies jedoch vorab klarstellen, damit Sie nach der Bereitstellung des Codes nicht feststellen, dass die entsprechenden Artikel noch in den Suchergebnissen erscheinen und fälschlicherweise annehmen, der Code sei nicht wirksam.
Ein weiterer wichtiger Punkt ist, dass dieser Ansatz auf der zugrundeliegenden Netzwerk- und Datenbankarchitektur von WordPress basiert. Solange zukünftige Versionen des Scry-Search-Plugins weiterhin auf dieser Architektur beruhen, bleibt dieser Interceptor wirksam. Sollte jedoch jemals ein völlig anderer Synchronisierungsmechanismus verwendet werden, ist möglicherweise eine erneute Anpassung erforderlich.
Ehrlich gesagt ist das jedoch unwahrscheinlich. Das gesamte WordPress-Ökosystem basiert auf dieser Architektur, und es ist praktisch unmöglich für Plugins, diese vollständig zu umgehen.
Drei-Schritte-Anleitung zur Implementierung
/**
* 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));
}
});
Zum Schluss fassen wir die Arbeitsschritte noch einmal zusammen.
Kopieren Sie zunächst den Code ganz ans Ende Ihrer functions.php-Datei oder fügen Sie ihn mithilfe des Code-Snippets-Plugins hinzu. Dann ganz oben...defineGeben Sie im Array die ID des Artikels oder der Seite ein, die Sie ausschließen möchten.
Im zweiten Schritt werden die historischen Indizes bereinigt. Melden Sie sich in Ihrem Meilisearch-Dashboard an oder verwenden Sie API-Befehle, um die alten Indexdaten für die ausgeschlossenen Artikel manuell zu löschen.
Der dritte Schritt ist der Test. Gehen Sie zum Backend und nehmen Sie kleinere Änderungen am ausgeschlossenen Artikel vor, klicken Sie auf „Aktualisieren“ und überprüfen Sie anschließend das Meilisearch-Backend. Wenn kein neuer Index angezeigt wird, ist die Blockierung wirksam.
Ehrlich gesagt hatte ich immer ein etwas schlechtes Gewissen, wenn ich solche technischen Artikel zum Thema Wissensaustausch schrieb.
Die Dinge, die ich teile, mögen für einige Leute nützlich sein, für andere sind es vielleicht nur grundlegende Vorgänge.
Doch der Prozess der Implementierung der WordPress-Suchblockierung war diesmal wirklich aufschlussreich. Oftmals rühren die Probleme, auf die wir stoßen, nicht von einem Mangel an Lösungen her, sondern vielmehr davon, dass unser Denken durch bestehende Frameworks eingeschränkt ist.
Das Scry Search-Plugin bietet einen Filter-Hook, was den Eindruck erweckt, dies sei die einzige Option. Die gesamte WordPress-Architektur eröffnet jedoch weitaus mehr Möglichkeiten. Datenabfang ist sowohl auf Netzwerkebene als auch auf Datenbankebene möglich. Mit etwas Nachdenken findet sich immer ein Weg.
Deshalb macht es mir so viel Spaß, an diesen technischen Geräten herumzubasteln. Es geht mir nicht darum, anzugeben oder Eindruck zu schinden. Es liegt einfach daran, dass das Gefühl, ein Problem vollständig verstanden zu haben, unglaublich befriedigend ist.
Genau wie dieses Mal war der gesamte Prozess von der anfänglichen Verwirrung über die Reflexion in der Mitte bis zur endgültigen Lösung wie das Lösen eines Puzzles.
Das Rätsel ist gelöst, die Antwort ist enthüllt, es stellte sich heraus, dass es so einfach war.
Aber wenn Sie diesen verwirrenden Prozess nicht durchlaufen haben, werden Sie diese einfache Freude niemals verstehen.
Nachdem Sie bis hierher gelesen haben: Wenn Ihnen der Beitrag gefallen hat, teilen Sie ihn bitte. Wenn Sie über Neuigkeiten informiert werden möchten, können Sie mir auch folgen.
Vielen Dank fürs Lesen meines Artikels. Bis zum nächsten Mal.
Hoffentlich ist Ihnen der Artikel „Wie man eine bestimmte Beitrags-ID vollständig von der Synchronisierung mit Meilisearch in WordPress ausschließt (Scry Search Plugin in der Praxis)“, der auf Chen Weiliangs Blog ( https://www.chenweiliang.com/ ) veröffentlicht wurde, hilfreich.
Sie können den Link zu diesem Artikel gerne teilen: https://www.chenweiliang.com/cwl-34343.html
