Hintergrund
Ich verwende Advanced Custom Fields Pro, um meine benutzerdefinierten Felder zu verwalten, und sie haben ein Repeater-Feld, das Unterfelder enthält, die als repeatername_X_fieldname
gespeichert sind, wobei X die Zeilennummer des Repeaters ist.
Ich habe einen benutzerdefinierten Beitragstyp student
, der den Repeater attendance
hat, der date
und class
enthält.
Wenn ein Schüler also einen Kurs besucht, speichert er seine Anwesenheit wie folgt:
Um nach einem Schüler zu suchen, der in einer bestimmten Klasse war oder an einem bestimmten Zeitraum teilgenommen hat, muss ich mich an get_meta_sql
anmelden und meine meta_query
umwandeln, um LIKE
anstelle von =
zu verwenden. wenn der Wert %
Dies erlaubt mir, etwas wie
zu tun %Vor%um nach jemandem zu suchen, der Geschichte OR 101 besucht hat
%Vor%Um nach jemandem zu suchen, der dieses Jahr teilgenommen hat.
Problem Teil 1
Ich muss in der Lage sein, nach jemandem zu suchen, der dieses Jahr Geschichte 101 besucht hat.
Zunächst mag es so aussehen, als würde ein einfaches UND auf der Meta-Abfrage den Trick bewirken:
%Vor%Da die Wildcards jedoch nicht verknüpft sind, könnte dies tatsächlich jemanden zurückgeben, der letztes Jahr an "History 101" teilgenommen hat, aber in diesem Jahr eine andere Klasse.
Problem Teil 2
Ich eigentlich muss in der Lage sein, eine Liste von allen zu bekommen, die dieses Jahr "History 101" besucht haben, aber in der letzten Woche überhaupt nicht für die Klasse erschienen sind. Dies verkompliziert das Problem weiter, da ich die EXISTS
und NOT EXISTS
von meta_query mit einer zusätzlichen Bedingung kombinieren muss. Auch dies klingt auf der Oberfläche recht simpel mit verschachtelten Meta-Abfragen:
Offensichtlich ist dies mit logischen Problemen behaftet, aber WordPress löst die meisten von ihnen am besten, indem es in der Metabefragung einmalig in die postmeta-Tabelle eingeht. Leider bedeutet das die & gt; Datumsteil wird nicht in NOT EXISTS
ON
verwendet und kann daher nicht IS NULL
verwenden, um zu testen, ob es nicht existiert.
Ich verstehe, dass das sehr komplex war und wenn Sie mir gefolgt sind, bin ich sehr beeindruckt. Wenn nicht, bitte stellen Sie Fragen, damit ich helfen kann zu klären.
Ja, ich bin mir bewusst, dass ich meine eigene Anfrage einfach vollständig schreiben könnte, aber ich versuche, bei den eingebauten WordPress-Tools zu bleiben.
Hilfe!
Ich war dort ... versuche alles in eine komplexe Meta-Abfrage zu bringen. Am Ende müssen Sie die generierten SQL - Klammern, Operatoren, Anführungszeichen usw. Manuell bearbeiten.
Am Ende ist die Abfrage so komplex und hat mehrere Joins in der Tabelle postmeta
, es wird zu teuer und langsam.
Ich habe mich dafür entschieden, dies zu erreichen, indem ich einen etwas anderen Ansatz gewählt habe.
Sie können also die Abfrage in mehrere Unterabfragen aufteilen und sie später mit post__in
und post__not_in
,
Zum Beispiel für Problem Teil 1 :
%Vor%Dasselbe gilt für Problemteil 2
%Vor% Sie können die Anwesenheitsbedingung auf EXISTS umkehren und post__not_in
verwenden ... Ich hoffe, Sie haben die Idee verstanden.
Tags und Links wordpress custom-fields advanced-custom-fields