Keine Ergebnisse aus einer Abfrage $ wpdb-> get_results () gefunden, wenn versucht wird, mehr als einer Metaschlüssel-Abfrage beizutreten

Dieser Titel war ein echter Schluck.

Ich habe einen benutzerdefinierten Post-Typ namens work mit drei benutzerdefinierten Taxonomien namens work-client , work-type und work-service . Ich benutze erweiterte benutzerdefinierte Felder, um ein sauberes Backend für sie zu erstellen, indem ich ein Feld “choose one” mit dem Namen work_client für den work_client und ein Feld “choose multiple” für work-service und work-type work_services und work_type die die Taxonomie-IDs als serialisiertes Array speichert.

TLDR: Die Posts haben ein work_client Feld ” work_client mit einer einzelnen Taxonomie-ID sowie Meta-Felder ” work_services und ” work_type , die serialisierte Arrays mit mehreren Taxonomie-IDs enthalten.

Was ich versuche, ist ein robustes Post-Filter-System zu erstellen, wo Sie eine Checkbox-Liste aller Clients, Typen und Services haben und eines oder mehrere davon auswählen können, nach denen gefiltert werden soll. Die verschiedenen Filtertypen haben eine AND-Beziehung, aber unterschiedliche Werte innerhalb eines Filters haben eine OR-Beziehung. Also zum Beispiel:

Wenn Sie Clients A und B, Typ X und Y und Service 1 wählen, sollten Sie nur Posts abrufen, die nur von Client A oder B kommen, UND nur Typ X oder Y, UND nur Service 1. Ich hoffe, dass das Sinn ergibt .

Ich habe gelernt, dass es unmöglich ist, sowohl “UND” – als auch “ODER” -Beziehungen in einer WP_Query zu verwenden, also habe ich einen $ wpdb-> get_results () -Aufruf gemacht, um dies zu erreichen. Basierend auf einigen Beispielen ähnlicher (aber nicht ganz gleicher) Versuche, habe ich folgendes herausgefunden:

  SELECT $wpdb->posts.* FROM $wpdb->posts INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE 1=1 AND $wpdb->posts.post_type = 'work' AND ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status = 'private') AND ( ( obobq8u_postmeta.meta_key = 'work_client' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) IN ('149') ) ) OR ( obobq8u_postmeta.meta_key = 'work_client' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) IN ('231') ) ) ) AND ( ( obobq8u_postmeta.meta_key = 'work_services' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) LIKE ('%247%') ) ) ) AND ( ( obobq8u_postmeta.meta_key = 'work_type' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) LIKE ('%244%') ) ) ) GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_title ASC 

Ich weiß, dass Posts im System sowohl von Client 149 als auch von 231 mit Dienst 247 und Typ 244 vorhanden sind, aber diese Abfrage wird ohne Ergebnisse ausgeführt.

Wenn ich es jedoch mit nur einer der Meta-Abfragen ausführe, funktioniert dieser Teil gut. So gibt mir diese Abfrage beispielsweise alle Posts, die entweder Client 149 oder 231 haben

  SELECT $wpdb->posts.* FROM $wpdb->posts INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE 1=1 AND $wpdb->posts.post_type = 'work' AND ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status = 'private') AND ( ( obobq8u_postmeta.meta_key = 'work_client' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) IN ('149') ) ) OR ( obobq8u_postmeta.meta_key = 'work_client' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) IN ('231') ) ) ) GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_title ASC 

Und diese Abfrage gibt mir Ergebnisse, die nur Service 247 sind:

  SELECT $wpdb->posts.* FROM $wpdb->posts INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE 1=1 AND $wpdb->posts.post_type = 'work' AND ($wpdb->posts.post_status = 'publish' OR $wpdb->posts.post_status = 'private') AND ( ( obobq8u_postmeta.meta_key = 'work_services' AND ( CAST(obobq8u_postmeta.meta_value AS CHAR) LIKE ('%247%') ) ) ) GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_title ASC 

Das Problem scheint die beiden zusammen zu kombinieren. Es ist wahrscheinlich, dass ich den “beitreten” falsch mache, aber ich habe Probleme, Hilfe für dieses spezielle Problem zu finden, und ich bin definitiv kein Experte für SQL-Abfragen.

Was mache ich falsch? Hoffentlich bin ich nah dran, zumindest?

Solutions Collecting From Web of "Keine Ergebnisse aus einer Abfrage $ wpdb-> get_results () gefunden, wenn versucht wird, mehr als einer Metaschlüssel-Abfrage beizutreten"