web-dev-qa-db-ja.com

$ wpdb-> get_resultsを使ってカスタムフィールドを取得する

カスタムフィールドを含むすべての投稿の配列を取得するために$wpdb->get_resultsを使用しようとしています。私はこのようにmeta_keyとmeta_value列を取得することができます。

[meta_key] => state [meta_value] => california

しかし、私はこのようにオブジェクトにそれらをリストしようとしています:

[meta_key] => meta_value [state] => california [city] => san francisco 

クエリ:

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

これを実現するためにエイリアスやサブクエリを使用することは可能ですか?

SELECT ID, post_date, post_title, post_content, guid, meta_value AS (subquery here??)
3
benhass

先に進む前に注意してください。移植性とセキュリティに注意してください。

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

わかりやすくするために、benhassが言及していた余分な引用符を取得しないようにするために(私はkaiserおよびWP 3.7.1によって提供されるコードを使用して取得します)、まったくprepareメソッドを使用しません(ok)この場合は、$ wpdbオブジェクト自体によって提供されるパラメータのみを使用します。

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

しかしもちろん、覚えておいて、あなたがクエリで他のパラメータを使うとすぐに、 $ wpdb-> prepare の使用はSQLインジェクションを防ぐために推奨されます。

0
Larzan