it-swarm.com.de

Holen Sie sich Post mit mehreren Metaschlüsseln und Wert

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.

5
Sheraz Ahmed

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'
0
Sheraz Ahmed

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 );
10
Jeremy Ross

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.

2
Eric Shoberg

Versucht unter Objektparameter

array(
            'key' => 'post_code',
            'value' =>'432C',
            'compare' => '='
        ),
        array(
            'relation' =>'AND',
             array(

            'key' => 'location',
            'value' => 'XYZ',
             'compare' => '=',

          ),
        )
0
Manthan Dave
$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 );
0