Ich versuche, einen Beitrag basierend auf den folgenden Metaschlüsseln abzurufen.
post_code
mit 432C
location
mit XYZ
Beide gehören zu einem CPT. Ich versuche, die Post mit diesen beiden meta_values abzurufen.Ich möchte keine OR -Relation, ich möchte eine AND-Relation, ich habe mehrere WP_Query
-Objekte ausprobiert und nach stundenlangem Suchen immer noch keine Lösung gefunden.
LÖSUNG
Die unten akzeptierte Lösung hat funktioniert, ich wollte jedoch wissen, wie es funktioniert.
So funktioniert es
SELECT * FROM wp_posts p, wp_postmeta m1, wp_postmeta m2
WHERE p.ID = m1.post_id and p.ID = m2.post_id
AND m1.meta_key = 'key1' AND m1.meta_value = 'value1'
AND m2.meta_key = 'key2' AND m2.meta_value = 'value2'
AND p.post_type = 'cpt' AND p.post_status = 'published'
Das sollte es tun. Die Standardrelation ist AND, sodass keine Angabe erforderlich ist.
$args = array(
'post_type' => 'wpse_cpt',
'meta_query' => array(
array(
'key' => 'post_code',
'value' => '432C',
),
array(
'key' => 'location',
'value' => 'XYZ',
),
),
);
$query = new WP_Query( $args );
Edit Again: Ah, ich habe die Frage nicht beantwortet. Sie würden a.*
auswählen, um alle Spalten der Posts mit den entsprechenden Schlüsselwerten abzurufen, anstatt c.meta_value
auszuwählen.
Die folgende SQL/$wpdb
-Abfrage wählt alle Meta-Wertes
eines Posts mit dem Post-Typ $postType
und dem Meta-Schlüsselwert $metaKey
aus. Wählen Sie daher alle unterschiedlichen Werte eines bestimmten meta_key aus (über '$ metaKey'). Die Tabelle term_relationships
ist die Hilfstabelle von wordpress für Beziehungsverbindungen in Tabellen. wp_posts
ist die WordPress-Tabelle 'Posts' und wp_postmeta
ist die WordPress-Tabelle 'Postmeta'. (Hinweis: Wenn Sie benutzerdefinierte Tabellen verwenden, unterscheiden sich diese Tabellennamen.)
~ Bearbeitet, um von @MikeNGarrett angeforderte 'Doing'-Notizen hinzuzufügen
/* $wpdb is a global var provided by the wordpress 'engine'
** for query'ing wordpress database tables.
*/
global $wpdb;
$postType = 'mycustomposttype';
$metaKey = 'mymetakey';
$query = "
SELECT c.meta_value
FROM wp_posts a
LEFT JOIN wp_term_relationships b
ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c
ON (a.ID = c.post_id)
WHERE a.post_type = %s AND c.meta_key = %s";
$metaValues = $wpdb->prepare(query, [$postType, $metaKey]);
$metaValues = $wpdb->get_results($metaValues);
Anmerkungen: Ich verwende nur die Variable $ metaValues. Es gibt keinen anderen Grund, die Ergebnisse von $ metaValues prepare()
in die Variable $ metaValues zurückzuschreiben. Sie müssen jedoch $ metaValues an get_resluts()
übergeben.
Versucht unter Objektparameter
array(
'key' => 'post_code',
'value' =>'432C',
'compare' => '='
),
array(
'relation' =>'AND',
array(
'key' => 'location',
'value' => 'XYZ',
'compare' => '=',
),
)
$args = array(
'post_type' => 'wpse_cpt',
'meta_query' => array(
'relation' => 'AND' //**** Use AND or OR as per your required Where Clause
array(
'key' => 'post_code',
'value' => '432C',
),
array(
'key' => 'location',
'value' => 'XYZ',
),
),
);
$query = new WP_Query( $args );