Ottieni post con chiavi e valori meta multipli

2 set 2016, 09:12:26
Visualizzazioni: 38.9K
Voti: 11

Sto cercando di recuperare un post basato sulle seguenti chiavi meta.

  • post_code con 432C
  • location con XYZ Entrambi appartengono a un CPT. Sto cercando di recuperare il Post con entrambi questi meta_values.

Non voglio una relazione OR, voglio una relazione AND, ho provato diversi oggetti WP_Query e non ho ancora trovato una soluzione dopo ore di ricerca.

2
Commenti

Quale codice WP_Query hai effettivamente provato?

RRikesh RRikesh
2 set 2016 09:26:08

$args = array( 'post_type' => 'courses', 'meta_query' => array( array( 'key' => 'post_code', 'value' => '432C', ), array( 'key' => 'location', 'value' => 'XYZ', ), ), ); $query = new WP_Query( $args );

Sheraz Ahmed Sheraz Ahmed
2 set 2016 09:34:15
Tutte le risposte alla domanda 6
3
17

Questo dovrebbe funzionare. La relazione predefinita è AND quindi non sarà necessario specificarla.

$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 );
2 set 2016 09:31:02
Commenti

Ho provato questo, ma ottengo troppe informazioni. Sto cercando di ottenere i risultati usando $wpdb.. È possibile?

Sheraz Ahmed Sheraz Ahmed
2 set 2016 09:36:11

Questo restituirà i risultati che hai descritto nella tua domanda. Quindi, o hai bisogno di fare una query più specifica, o assicurarti che i tuoi post abbiano metadati accurati.

Jeremy Ross Jeremy Ross
2 set 2016 16:42:10

E sì, puoi usare $wpdb, ma otterrai gli stessi risultati se usi gli stessi criteri. WP_Query è più semplice e sicuro.

Jeremy Ross Jeremy Ross
2 set 2016 16:43:24
0
$args = array(
    'post_type'  => 'wpse_cpt', //**** Tipo di post personalizzato da cercare
    'meta_query' => array(
        'relation' => 'AND' //**** Utilizza AND o OR in base alla clausola Where richiesta
        array(
            'key'     => 'post_code', //**** Campo personalizzato: codice postale
            'value'   => '432C', //**** Valore da cercare
        ),
        array(
            'key'     => 'location', //**** Campo personalizzato: località
            'value'   => 'XYZ', //**** Valore da cercare
        ),
    ),
);
$query = new WP_Query( $args ); //**** Esegue la query con i parametri specificati
2 set 2016 16:23:26
4

Modifica Ancora: Ah, non ho risposto alla domanda. Dovresti selezionare a.* per ottenere tutte le colonne dei post con i valori chiave corrispondenti, invece di selezionare c.meta_value.

La seguente query SQL/$wpdb selezionerà tutti i meta_value%s di un post con post_type uguale a $postType e un valore meta_key uguale a $metaKey. Quindi selezionerà tutti i diversi valori di una data meta_key (tramite '$metaKey'). La tabella term_relationships è la tabella helper di WordPress per le connessioni di relazione tra tabelle. wp_posts è la tabella 'posts' di WordPress, e wp_postmeta è la tabella 'postmeta' di WordPress. (Nota: se stai utilizzando tabelle personalizzate, questi nomi di tabelle potrebbero differire.)

~ Modificato per aggiungere note 'in corso', richiesto da @MikeNGarrett

/* $wpdb è una variabile globale fornita dal 'motore' di WordPress
** per eseguire query sulle tabelle del database di WordPress.
*/
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);

Note: Sto solo riutilizzando la variabile $metaValues. Non c'è nessun altro motivo per scrivere i risultati di $metaValues prepare() nuovamente nella variabile $metaValues. Tuttavia, devi passare $metaValues a get_results().

8 mag 2019 16:56:16
Commenti

Ciao Eric! Puoi fornire un po' più di contesto? In particolare rispondendo a "Cosa fa questo codice?" e "Perché è il modo migliore per ottenere questo risultato?"

MikeNGarrett MikeNGarrett
8 mag 2019 17:56:07

@MikeNGarrett, ho aggiunto delle note. In realtà, puoi restituire qualsiasi valore desideri da una qualsiasi di quelle tre tabelle con la query. Devi solo cambiare la tabella che stai interrogando/confrontando. Attraverso a,b,c e . e il nome della colonna.

Eric Shoberg Eric Shoberg
8 mag 2019 22:47:29

@MikeGarrett, "Perché è il modo migliore per ottenere questo risultato?". Onestamente non so se questo sia il modo 'migliore' per farlo. Tuttavia funziona. Sarei interessato se qualcuno trovasse un metodo migliore/più veloce, anche io. Credo che questo sia il modo meno oneroso per farlo, per quanto riguarda le mie attuali capacità e conoscenze in questo momento.

Eric Shoberg Eric Shoberg
8 mag 2019 23:06:46

Grazie! Sembra buono

MikeNGarrett MikeNGarrett
9 mag 2019 18:49:27
0

SOLUZIONE

La soluzione accettata qui sotto ha funzionato, tuttavia volevo sapere come funziona?

Ecco come funziona

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'
15 lug 2017 11:24:51
0

Ho provato a utilizzare la soluzione WP_Query suggerita sopra, ma ho ottenuto un risultato vuoto. Quella proposta da Sheraz Ahmed funziona bene. Ecco la mia versione, per quel che vale:

//database
wp_posts
+---------+--------------------+--------------+
|  ID     | post_title         | post_type    |
+---------+--------------------+--------------+
| 8567    | Intro to MySQL     | talk         |
+---------+--------------------+--------------+
| 8590    | Intro to PHP       | talk         |
+---------+--------------------+--------------+

wp_postmeta
+---------------+------------+----------------+
|  post_id      | meta_key   | meta_value     |
+---------------+------------+----------------+
| 8567          | speaker    | John Doe       |
+---------------+------------+----------------+
| 8567          | year_of    | 2021           |
+---------------+------------+----------------+
| 8590          | speaker    | John Doe       |
+---------------+------------+----------------+
| 8590          | year_of    | 2021           |
+---------------+------------+----------------+


//ricerca per relatore e anno
$speaker = "John Doe";
$year_of = "2021";

$talks = $wpdb->get_results(  
     $wpdb->prepare( 
         'SELECT post_title, meta_value AS speaker 
         FROM '.$wpdb->prefix.'posts AS pt, '.$wpdb->prefix.'postmeta AS pm 
         WHERE post_type = %s AND pm.post_id = pt.id AND ( meta_key = %s AND meta_value = %s ) 
         AND post_id IN ( SELECT post_id FROM nm_postmeta WHERE meta_key = %s AND meta_value = %s )',
         array( 'talk', 
                'speaker', 
                $speaker, 
                'year_of', 
                $year_of )
    )
);
                
foreach ( $talks as $talk ) {
    echo "<p>".$talk->speaker.': '.$talk_homily->post_title."</p>";
}

John Doe: Intro to MySQL

John Doe: Intro to PHP

12 set 2021 22:48:35
3
-1

Provati i seguenti parametri oggetto

array(
            'key' => 'post_code', // chiave
            'value' =>'432C', // valore
            'compare' => '=' // operatore di confronto
        ),
        array(
            'relation' =>'AND', // relazione
             array(

            'key' => 'location', // chiave
            'value' => 'XYZ', // valore
             'compare' => '=', // operatore di confronto

          ),
        )
2 set 2016 09:28:41
Commenti

Sarebbe fantastico se potessi spiegare il codice e come risolve il problema.

bravokeyl bravokeyl
2 set 2016 09:33:18

ho già spiegato che per favore provate questi parametri utilizzando questi parametri risolverà automaticamente il problema

Manthan Dave Manthan Dave
2 set 2016 09:34:57

Dovresti spiegare perché quel codice funzionerà.

RRikesh RRikesh
2 set 2016 09:37:50