Ottieni post con chiavi e valori meta multipli
Sto cercando di recuperare un post basato sulle seguenti chiavi meta.
post_code
con432C
location
conXYZ
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.

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 );

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

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.

$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

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()
.

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, 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.

@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.

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'

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

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
),
)

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

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