Ho bisogno di ricevere un sacco di post con i loro metadati. Ovviamente non puoi ottenere metadati con una query di post standard, quindi in genere devi fare un get_post_custom()
per ogni post.
Sto provando con una query personalizzata, in questo modo:
$results = $wpdb->get_results("
SELECT p.ID,
p.post_title,
pm1.meta_value AS first_field,
pm2.meta_value AS second_field,
pm3.meta_value AS third_field
FROM $wpdb->posts p LEFT JOIN $wpdb->postmeta pm1 ON (
pm1.post_id = p.ID AND
pm1.meta_key = 'first_field_key'
) LEFT JOIN $wpdb->postmeta pm2 ON (
pm2.post_id = p.ID AND
pm2.meta_key = 'second_field_key'
) LEFT JOIN $wpdb->postmeta pm3 ON (
pm3.post_id = p.ID AND
pm3.meta_key = 'third_field_key'
)
WHERE post_status = 'publish'
");
Sembra funzionare. Si inciampa se si utilizza uno di questi meta-campi in un modo che consente più metadati per esso sullo stesso post. Non riesco a pensare a un join per farlo.
Quindi, domanda 1: esiste un join, una sottoquery o qualsiasi altra cosa per portare in meta field a più valori?
Ma domanda 2: ne vale la pena? Quanti postmeta
join di tabella devo aggiungere prima che diventi preferibile un approccio a 2 query? Potrei prendere tutti i dati di post in una query, quindi prendere tutti i postmeta rilevanti in un altro e combinare il meta con i dati di post in un gruppo di risultati in PHP. Sarebbe più veloce di una singola query SQL sempre più complessa, se ciò fosse possibile?
Penso sempre: "Dai più lavoro possibile al database". Non sono sicuro riguardo a questo!
get_posts()
, quindi get_post_meta()
per ognuno di quelli? @MannyFleurmond, è difficile trovare informazioni utili sulla memorizzazione nella cache integrata di WP, ma AFAIK memorizzerebbe roba per richiesta. La chiamata al server per acquisire questi dati è una chiamata AJAX e non credo che qualcos'altro afferrerà cose prima di esso.