web-dev-qa-db-fra.com

Récupérer des champs personnalisés avec $ wpdb-> get_results

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??)
3
benhass

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' );
3
kaiser

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.

0
Larzan