Komplexe custom_field-Suche mit Meta-Abfrage

8

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:

  • meta_key : 'anwesenheit_X_datum' meta_value : '201770701'
  • meta_key : 'anwesenheit_X_klasse' meta_value : 'History 101'

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 %

enthält %Vor%

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:

%Vor%

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!

    
trex005 28.08.2017, 23:21
quelle

1 Antwort

3

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 ,

kombinieren

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.

    
Plamen Nikolov 29.08.2017 09:56
quelle