カスタムフィールドを含むすべての投稿の配列を取得するために$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??)
先に進む前に注意してください。移植性とセキュリティに注意してください。
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' );
わかりやすくするために、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インジェクションを防ぐために推奨されます。