Ich möchte die Suche auf Zeichen beschränken, die in der englischen Sprache + Zahlen verwendet werden. Der Grund dafür ist, dass die langsamsten Abfragen im MySQL-Protokoll, die ich am häufigsten gefunden habe, aus Suchanfragen in arabischen, russischen und chinesischen Schriftzeichen stammen. Daher möchte ich sie überspringen und stattdessen eine Fehlermeldung anzeigen.
9
Antworten:
Diese Lösung filtert Suchzeichenfolgen, indem ein regulärer Ausdruck angewendet wird, der nur mit Zeichen aus den allgemeinen und lateinischen Unicode-Skripten übereinstimmt.
Übereinstimmende lateinische Zeichen mit regulären Ausdrücken
Ich hatte gerade meinen Verstand bei Stack Overflow umgehauen . Wie sich herausstellt, verfügen reguläre Ausdrücke über einen Mechanismus zum Abgleichen ganzer Unicode-Kategorien, einschließlich Werten zum Angeben ganzer Unicode- "Skripte" , die jeweils Gruppen von Zeichen entsprechen, die in verschiedenen Schriftsystemen verwendet werden.
Dies erfolgt mithilfe des
\p
Metazeichens, gefolgt von einer Unicode-Kategorie-ID in geschweiften Klammern - entspricht also[\p{Common}\p{Latin}]
einem einzelnen Zeichen in der lateinischen oder der allgemeinen Schrift - dies umfasst Interpunktion, Ziffern und verschiedene Symbole.Wie @ Paul ‚Sperber‘ Biron weist darauf hin , das
u
Muster Modifikator - Flag sollte am Ende des regulären Ausdrucks , um die PHP-PCRE Funktionen eingestellt werden , um die Zeichenkette zu behandeln , alsUTF-8
Unicode codiert.Alles in allem also das Muster
stimmt mit einer gesamten Zeichenfolge überein, die aus einem oder mehreren Zeichen in den Skripten Latin und Common Unicode besteht.
Filtern der Suchzeichenfolge
Ein guter Ort, um eine Suchzeichenfolge abzufangen, ist die
pre_get_posts
Aktion , die unmittelbar vor der Ausführung der Abfrage durch WordPress ausgelöst wird. Mit größerer Sorgfalt könnte dies auch unter Verwendung einesrequest
Filters erreicht werden .Antworten auf nicht zugelassene Suchvorgänge
Sobald festgestellt wurde, dass eine Suchzeichenfolge nicht-lateinische Zeichen enthält, können Sie
WP_Query::set()
die Abfrage ändern, indem Sie die benannten Abfragevariablen ändern. Dies wirkt sich auf die SQL-Abfrage aus, die WordPress anschließend erstellt und ausführt.Die relevantesten Abfragevariablen sind wahrscheinlich die folgenden:
s
ist die Abfragevariable, die einer Suchzeichenfolge entspricht. Wenn Sie es aufnull
oder eine leere Zeichenfolge (''
) setzen, behandelt WordPress die Abfrage nicht mehr als Suche. Oft führt dies zu einer Archivvorlage, in der alle Beiträge oder die Startseite der Site angezeigt werden, abhängig von den Werten der anderen Abfrage vars. Wenn Sie es jedoch auf ein einzelnes Leerzeichen (' '
) setzen, erkennt WordPress es als Suche und versucht daher, diesearch.php
Vorlage anzuzeigen .page_id
kann verwendet werden, um den Benutzer auf eine bestimmte Seite Ihrer Wahl zu leiten.post__in
kann die Abfrage auf eine bestimmte Auswahl von Beiträgen beschränken. Durch Festlegen eines Arrays mit einer unmöglichen Post-ID kann es als Maß dafür dienen, dass die Abfrage absolut nichts zurückgibt .Vor diesem Hintergrund können Sie Folgendes tun, um auf eine fehlerhafte Suche zu reagieren, indem Sie die
search.php
Vorlage ohne Ergebnisse laden :Fehler anzeigen
Die Art und Weise, wie Sie die Fehlermeldung tatsächlich anzeigen, hängt stark von Ihrer Anwendung und den Fähigkeiten Ihres Themas ab. Es gibt viele Möglichkeiten, wie dies getan werden kann. Wenn Ihr Thema die Suchvorlage aufruft
get_search_form()
, besteht die einfachste Lösung wahrscheinlich darin, einenpre_get_search_form
Aktions- Hook zu verwenden, um Ihren Fehler direkt über dem Suchformular auszugeben:Einige andere Möglichkeiten zum Anzeigen einer Fehlermeldung sind:
wp_enqueue_script
Hook hinzu mit einem$priority
größeren Wert als dem, der das JavaScript in die Warteschlange stellt, und verwenden Siewp_localize_script()
diese Variable, um Ihre Fehlermeldung einzuschließen .wp_redirect()
diese Option , um den Benutzer an die URL Ihrer Wahl zu senden (diese Methode erfordert ein zusätzliches Laden der Seite).s
Abfragevariable auf''
anstelle von' '
und verwenden Sie siepage_id
anstelle vonpost__in
, um eine Seite Ihrer Wahl zurückzugeben.loop_start
Hook , um ein gefälschtesWP_Post
Objekt, das Ihren Fehler enthält, in die Abfrageergebnisse einzufügen. Dies ist definitiv ein hässlicher Hack und sieht mit Ihrem speziellen Thema möglicherweise nicht richtig aus, hat jedoch den potenziell wünschenswerten Nebeneffekt, dass die Meldung "Keine Ergebnisse" unterdrückt wird.template_include
Filter-Hook, um die Suchvorlage gegen eine benutzerdefinierte in Ihrem Design oder Plugin auszutauschen, die Ihren Fehler anzeigt.Ohne das betreffende Thema zu untersuchen, ist es schwierig zu bestimmen, welchen Weg Sie einschlagen sollten.
quelle
Sie würden dies tun, indem Sie eine Validierungsfunktion in PHP einfügen, um die Eingabe gegen einen regulären Ausdruck wie zu testen
^[a-zA-Z0-9,.!?' ]*
So würde es aussehen:
Die RexEx ich für alle Zeichen verwendet
A-Z
,a-z
,0-9
sowie,
,.
,!
,?
,'
,"
, und(Raum).
quelle
BEARBEITEN: Diese Lösung wird nicht empfohlen
Ein Mittel, um Suchvorgänge mit nicht-lateinischen Alphabeten zu verhindern, besteht darin, mithilfe der PHP-
mb_detect_encoding()
Funktion festzustellen, ob die Suchzeichenfolge einer benutzerdefinierten Auswahl von Zeichencodierungen entspricht. Ein guter Ort, um dies zu tun, ist diepre_get_posts
Aktion , da sie unmittelbar vor der Ausführung der Abfrage ausgelöst wird.Was Sie tatsächlich tun, nachdem Sie festgestellt haben, dass eine Suche eine ungültige Codierung verwendet, ist wirklich anwendungsspezifisch. Hier habe ich die Suchabfrage auf ein einzelnes Leerzeichen gesetzt, um sicherzustellen, dass WordPress die Abfrage weiterhin als Suche interpretiert und somit die
search.php
Vorlage weiterhin lädt (und den Benutzer nicht zur Startseite weiterleitet, wie dies bei der Suchzeichenfolge der Fall ist eine leere Zeichenfolge). Ich habe auch eine zusätzliche Vorsichtsmaßnahme getroffen ,'post__in'
um ein Array mit einer unmöglichen Post-ID festzulegen, um sicherzustellen, dass absolut nichts zurückgegeben wird .Alternativ können Sie die Suchzeichenfolge auf
null
und einstellenpage_id
, um den Benutzer auf eine Seite mit Ihrer benutzerdefinierten Fehlermeldung zu leiten.Codierungen auswählen
Ich habe einen Abdeckungstest geschrieben, in dem einige Dummy-Zeichenfolgen in verschiedenen Alphabeten mit allen von PHP unterstützten Standardcodierungen verglichen wurden . Es ist keineswegs perfekt (ich habe keine Ahnung, wie realistisch meine Dummy-Saiten sind, und es scheint an der japanischen Erkennung zu ersticken), aber es ist etwas nützlich, um Kandidaten zu bestimmen. Sie können es hier in Aktion sehen .
Nachdem Sie nach potenziellen Zeichenkodierungen gesucht haben, die durch diesen Test gekennzeichnet wurden, scheint dies
Windows-1252
die perfekte Wahl für Ihre Anforderungen zu sein, da sie sowohl das lateinische Alphabet als auch die Akzente für gängige lateinische Sprachen abdecken.Eine Auswahl der
ISO-8859
Zeichensätze sollte eine weitere praktikable Wahl sein. Aus Gründen, die ich nichtmb_
verstehen kann, scheinen die Funktionen jedoch nicht zwischenISO-8859
den verschiedenen Zeichensätzen zu unterscheiden, obwohl sie als separate Codierungen aufgeführt sind.Um einige andere gebräuchliche Zeichen zuzulassen, können Sie auch das Hinzufügen in Betracht ziehen
HTML-ENTITIES
.quelle
ISO-8859
ist , zwischen Codierungen zu unterscheiden .Wie ich @MichaelRogers zu erklären versuchte, als er vor einigen Tagen eine ähnliche Frage stellte, reicht es NICHT aus, den in einer Zeichenfolge verwendeten Zeichensatz (oder das Skript) zu kennen, um die Sprache dieser Zeichenfolge zu erkennen .
Während also die Methode , mit @bosco detailliert wird Russisch entfernen, etc Strings (mit den 2 Korrekturen unten), wird es NICHT Ihre Suche auf Englisch begrenzen.
Um dies zu sehen, versuchen Sie:
[ Anmerkung: Die 2 oben erwähnten Korrekturen an @bosco sind:
/u
Modifikator wurde hinzugefügt (erforderlich, um Muster und Betreff als UTF-8-codiert zu behandeln, siehe PHP: Regex-Mustermodifikatoren ).was produzieren wird:
[ Anmerkung: Ich spreche Englisch, Französisch und etwas Deutsch (und ein bisschen Lorem ipsum :-), habe mich aber für Arabisch, Russisch und Chinesisch auf Google Translate verlassen]
Wie Sie sehen können, wird die Überprüfung des lateinischen Skripts NICHT sicherstellen, dass Sie Englisch sprechen .
Es gibt eine Reihe von Threads in StackOverflow (z. B. Sprache anhand von Zeichenfolgen in PHP erkennen ), die weitere Informationen zu diesem Thema bereitstellen.
quelle