it-swarm.com.de

Wie suche ich ein in einem benutzerdefinierten Feld gespeichertes Array mit WP_Query?

Ich habe einen benutzerdefinierten Post-Typ namens "on-air", der ein benutzerdefiniertes Feld namens "daysonair" enthält. Das Formular enthält Kontrollkästchen für jeden Wochentag.

Wenn Sie einen Beitrag hinzufügen/aktualisieren, werden die markierten Elemente als Array im benutzerdefinierten Feld gespeichert.

Ich kann nicht herausfinden, wie ich dieses benutzerdefinierte Feld zu meiner WP_Query () - Suche hinzufügen kann:

array( 'key' => 'daysonair',
       'value' => 'Thursday',
       'compare' => 'IN' )

Ich habe zahlreiche Arten von Vergleichen ohne Glück versucht.

Die Daten in der Datenbank sind:

a:5:{s:6:"Monday";s:6:"Monday";s:7:"Tuesday";s:7:"Tuesday";s:9:"Wednesday";s:9:"Wednesday";s:8:"Thursday";s:8:"Thursday";s:6:"Friday";s:6:"Friday";}

Wo alle Wochentage überprüft wurden. Ich schaue nur, ob Donnerstag auf dem Programm steht.

2
Dave Navarro

Das Durchsuchen eines serialisierten Arrays ist schwierig und ineffizient. schleppend. Das folgende reine SQL wird es tun:

SELECT *
FROM `wp_postmeta`
WHERE `meta_key` LIKE 'daysonair'
AND `meta_value` LIKE '%thursday%'
LIMIT 0 , 100

So etwas sollte WP_Query dazu bringen, etwas Ähnliches zu tun:

$args = array(
  'post_type' => 'post',
  'meta_query' => array(
    array(
      'key' => 'daysonair',
      'value' => 'thursday',
      'compare' => 'LIKE',
    )
  )
);
$q = new WP_Query($args);
var_dump($q);

Aber LIKE-Abfragen mit Platzhaltern - % - sind sehr langsam. Die Abfrage muss jede Zeile in der Tabelle auf eine Übereinstimmung überprüfen.

Darüber hinaus ist dies fehleranfällig, da jedes Auftreten von "Donnerstag" z. B. mit etwas in einem Text des Anhangs alt übereinstimmt.

Das Problem ist, dass eine Serialisierungszeichenfolge ein PHP -Konstrukt ist. MySQL kann nichts anderes damit anfangen, als es wie einen anderen String zu behandeln.

Die einzige wirklich gute Lösung, und ich weiß nicht, ob es in Ihrem Fall möglich ist, zu ändern, wie die Daten in der Datenbank gespeichert werden. Wenn Sie die Daten durchsuchen müssen, sollten Sie sie nicht als serialisierte Zeichenfolge speichern. Jedes Datenelement sollte als unabhängiges Schlüssel/Wert-Paar gespeichert werden.

5
s_ha_dum

Eine benutzerdefinierte LIKE-Abfrage wird irgendwie funktionieren, aber ich persönlich würde ihr nur für die einfachste Implementierung vertrauen (wie in den Kommentaren von s_ha_dum angegeben).

Eine bessere Lösung ist, eine benutzerdefinierte Taxonomie zu erstellen für "Wochentage" und darauf basierend eine Steuerabfrage durchzuführen . Genau dafür ist das Taxonomiesystem ausgelegt.

$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'days_of_week',
            'field' => 'slug',
            'terms' => 'wednesday'
        )
    )
);
$query = new WP_Query( $args );
1
MathSmath