J'essaie d'utiliser $wpdb->get_results
pour récupérer un tableau de toutes les publications, y compris les champs personnalisés. Je peux récupérer les colonnes meta_key et meta_value comme ceci:
[meta_key] => state [meta_value] => california
mais j'essaie de les lister dans l'objet comme ceci:
[meta_key] => meta_value [state] => california [city] => san francisco
La requête:
global $wpdb;
$query = "
SELECT ID, post_date, post_title, post_content, guid, meta_key, meta_value
FROM wp_posts INNER JOIN wp_postmeta
ON (wp_posts.ID = wp_postmeta.post_id)
";
$results = $wpdb->get_results($query);
foreach($results as $result) {
print_r($result);
}
Est-il possible d'utiliser un alias et/ou une sous-requête pour y parvenir?
SELECT ID, post_date, post_title, post_content, guid, meta_value AS (subquery here??)
Remarque, avant d'aller plus loin: faites attention à la portabilité et à la sécurité:
function wpse50056_get_post_meta()
{
global $wpdb;
$results = $wpdb->get_results( "
SELECT
ID,
post_date,
post_title,
post_content,
meta_key,
meta_value
FROM {$wpdb->posts}
INNER JOIN {$wpdb->postmeta}
ON ( $wpdb->posts.ID = {$wpdb->postmeta}.post_id )
" );
foreach( $results as $result )
{
printf( '<pre>%s</pre>', htmlspecialchars( var_export( $result, true ) ) );
}
}
add_action( 'shutdown', 'wpse50056_get_post_meta' );
Par souci de clarté, pour ne pas avoir les guillemets supplémentaires dont parlait Benhass (je les ai toujours avec le code fourni par kaiser et WP 3.7.1), n’utilisez pas du tout la méthode prepare dans ce cas, nous n'utilisons que les paramètres fournis par l'objet $ wpdb lui-même):
function wpse50056_get_post_meta() {
global $wpdb;
$query =
" SELECT
ID,
post_date,
post_title,
post_content,
meta_key,
meta_value
FROM $wpdb->posts
INNER JOIN $wpdb->postmeta
ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id)
";
$results = $wpdb->get_results( $query );
foreach( $results as $result ) {
echo '<pre>'; print_r( $result ); echo '</pre>';
}
}
add_action( 'shutdown', 'wpse50056_get_post_meta' );
Mais bien sûr, N'OUBLIEZ PAS, dès que vous utilisez d'autres paramètres dans la requête, il est recommandé d'utiliser $ wpdb-> prepare pour empêcher l'injection de SQL.