Devi unirti a post_meta
tavola due volte. Ecco un po' di teoria dei database.
Quando si uniscono tabelle, in teoria viene creata e filtrata una tabella temporanea contenente tutti gli elementi della prima tabella combinati con tutti gli elementi della seconda tabella. Quindi, se, ad esempio, hai solo 1 meta elemento per post e hai 3 post, allora hai
+-------+----------+
|post_id|post_title|
+-------+----------+
| 1 | 'Post 1' |
| 2 | 'Post 2' |
| 3 | 'Post 3' |
+-------+----------+
e
+-------+----------+----------+------------+
|meta_id| post_id | meta_key | meta_value |
+-------+----------+----------+------------+
| 10 | 1 | k1 | v1 |
| 11 | 2 | k1 | v2 |
| 12 | 3 | k1 | v3 |
+-------+----------+----------+------------+
E la tabella unita temporanea "teorica" è:
+---------+------------+----------+----------+-----------+-------------+
|p.post_id|p.post_title|pm.meta_id|pm.post_id|pm.meta_key|pm.meta_value|
+---------+------------+----------+----------+-----------+-------------+
| 1 | 'Post 1' | 10 | 1 | k1 | v1 |
| 1 | 'Post 1' | 11 | 2 | k1 | v2 |
| 1 | 'Post 1' | 12 | 3 | k1 | v3 |
| 2 | 'Post 2' | 10 | 1 | k1 | v1 |
| 2 | 'Post 2' | 11 | 2 | k1 | v2 |
| 2 | 'Post 2' | 12 | 3 | k1 | v3 |
| 3 | 'Post 3' | 10 | 1 | k1 | v1 |
| 3 | 'Post 3' | 11 | 2 | k1 | v2 |
| 3 | 'Post 3' | 12 | 3 | k1 | v3 |
+---------+------------+----------+----------+-----------+-------------+
Quindi dici:DOVE p.id =pm.post_id
e questo filtra la tabella temporanea in modo che sia:
+---------+------------+----------+----------+-----------+-------------+
|p.post_id|p.post_title|pm.meta_id|pm.post_id|pm.meta_key|pm.meta_value|
+---------+------------+----------+----------+-----------+-------------+
| 1 | 'Post 1' | 10 | 1 | k1 | v1 |
| 2 | 'Post 2' | 11 | 2 | k1 | v2 |
| 3 | 'Post 3' | 12 | 3 | k1 | v3 |
+---------+------------+----------+----------+-----------+-------------+
Quindi hai solo una riga per ogni post + meta valore. La tua query richiede righe che hanno entrambi meta_key = category
e meta_key =book_genre` che non esistono.
Quindi hai bisogno di una tabella che si unisca al postmeta
tabella in DUE VOLTE.
Puoi farlo assegnando un alias al tavolo quando ti unisci a loro. Perdonami se ti semplifico:
SELECT wp_posts.*, pm1.*, pm2.*
FROM
wp_posts
wp_postmeta as pm1
wp_postmeta as pm2
WHERE pm1.post_id = wp_posts.ID
AND pm2.post_id = wp_posts.ID
AND ...etc
Qui hai due copie unite della tabella postmeta alias pm1
e pm2
(poiché non possono ENTRAMBI essere chiamati wp_postmeta
nella query.
Puoi quindi chiedere:
AND pm1.meta_key = 'category'
AND pm1.meta_value = X
AND pm2.meta_key = 'book_genre'
AND pm2.meta_key IN (123,456)
Spero che tu possa cucire insieme il resto da quello.
Penso anche che tu possa farlo con WP_Query se vuoi seguire quella strada.