2011-10-21 8 views
0

Wordpressクエリでforeachを使用したいと思います。Foreach内部でのクエリ

$aid=0; 
    foreach ($QA as $key => $value) { 
    AND wp_postmeta.post_id IN (
     SELECT wp_postmeta.post_id 
     FROM wp_postmeta, wp_posts 
     WHERE wp_posts.ID = wp_postmeta.post_id 
     AND wp_posts.post_status = 'publish' 
     AND wp_posts.post_type = 'post' 
     AND wp_postmeta.meta_key = '$key' 
     AND wp_postmeta.meta_value = '$value' 
    ) 
    $aid++; 
} 

しかし、そのように働いていないので、私が助けを求めている -

私は、SQLクエリでのforeachを置くことができますどのように?

以下のコードの完全な例。

<?php 
function query_products($QA) { 

global $wpdb; 
global $post; 
global $pageposts; 

$querystr = " 

SELECT wp_posts.*, wp_postmeta.* 
FROM wp_postmeta, wp_posts 
WHERE wp_posts.ID = wp_postmeta.post_id 
AND wp_posts.post_status = 'publish' 
AND wp_posts.post_type = 'post' 
AND wp_postmeta.meta_key = 'country' 
AND wp_postmeta.meta_value = 'Denmark' 

$aid=0; 
    foreach ($QA as $key => $value) { 
    AND wp_postmeta.post_id IN (
     SELECT wp_postmeta.post_id 
     FROM wp_postmeta, wp_posts 
     WHERE wp_posts.ID = wp_postmeta.post_id 
     AND wp_posts.post_status = 'publish' 
     AND wp_posts.post_type = 'post' 
     AND wp_postmeta.meta_key = '$key' 
     AND wp_postmeta.meta_value = '$value' 
    ) 
    $aid++; 
} 

ORDER BY wp_postmeta.meta_value ASC 
    "; 

$pageposts = $wpdb->get_results($querystr, OBJECT); 

} 

$QA = array (
    'key1' => 'value1', 
    'key2' => 'value2', 
    'key3' => 'value3', 
); 
query_products($QA); 
?> 
+0

このようなことの目的は何か説明できますか? – kevin

+0

はい。それはWordpressの投稿をループし、複数のメタ値で動的にフィルタリングします。 –

答えて

0
$querystr = " 
SELECT wp_posts.*, wp_postmeta.* 
FROM wp_postmeta, wp_posts 
WHERE wp_posts.ID = wp_postmeta.post_id 
AND wp_posts.post_status = 'publish' 
AND wp_posts.post_type = 'post' 
AND wp_postmeta.meta_key = 'country' 
AND wp_postmeta.meta_value = 'Denmark' 
"; 

$aid=0; 
    foreach ($QA as $key => $value) { 
     $querystr .= " 
    AND wp_postmeta.post_id IN (
     SELECT wp_postmeta.post_id 
     FROM wp_postmeta, wp_posts 
     WHERE wp_posts.ID = wp_postmeta.post_id 
     AND wp_posts.post_status = 'publish' 
     AND wp_posts.post_type = 'post' 
     AND wp_postmeta.meta_key = '$key' 
     AND wp_postmeta.meta_value = '$value'"; 
    ) 
    $aid++; 
} 
$querystr .=" ORDER BY wp_postmeta.meta_value ASC"; 
+0

'。='文字列連結の演算子です。 – fredley

0

問合せが実現することになっているものを知らず、私はこのような何か提案することができます:あなたがどんな結果を得ることは決してないだろうので、私は上記の使用「OR」

<?php 

$querystr = " 
SELECT wp_posts.*, wp_postmeta.* 
FROM wp_postmeta, wp_posts 
WHERE wp_posts.ID = wp_postmeta.post_id 
AND wp_posts.post_status = 'publish' 
AND wp_posts.post_type = 'post' 
AND wp_postmeta.meta_key = 'country' 
AND wp_postmeta.meta_value = 'Denmark' 
AND wp_postmeta.post_id IN (
    SELECT wp_postmeta.post_id 
    FROM wp_postmeta, wp_posts 
    WHERE wp_posts.ID = wp_postmeta.post_id 
    AND wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'post' 
"; 
if (count($QA) >= 1) { 
    $querystr .= " AND ("; 
    foreach($QA as $key => $value) { 
     $querystr .= "(wp_postmeta.meta_key = '{$key}' AND wp_postmeta.meta_value = '{$value}') OR "; 
    } 
    // get rid of the last "OR" in the string 
    $querystr = substr($querystr,0,strrpos($querystr,"OR")); 
    $querystr .= ") "; 
} 
$querystr .= " ORDER BY wp_postmeta.meta_value ASC "; 

?> 

注意を"AND"句を使用して複数の値に対して1つのフィールドをチェックする場合。

0

すべてのキーを配列として渡すか、完全なクエリを繰り返し実行する必要があります(selectを含む)。私は後者をお勧めしません。パフォーマンスが悪いです(過度のデータベースラウンドトリップは悪いです)。ですから、$ QAがあまりにも巨額でない限り、私はこのようなことをします。 EXISTS節を使用して元々提出された完全なサブクエリよりも少し単純だと思いますが、これは真に他のものより優れているよりも味の問題かもしれません。

<?php 
function query_products($QA) { 

global $wpdb; 
global $post; 
global $pageposts; 

    $querystr = " 
    SELECT wp_posts.*, wp_postmeta_a.* 
    FROM wp_postmeta AS wp_postmeta_a, wp_posts, wp_postmeta AS wp_postmeta_b 
    WHERE wp_posts.ID = wp_postmeta_a.post_id 
    AND wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'post' 
    AND wp_postmeta_a.meta_key = 'country' 
    AND wp_postmeta_a.meta_value = 'Denmark' 
    "; 

    $aid=0; 
    foreach ($QA as $key => $value) { 
     $querystr .= " 
      AND EXISTS (SELECT 1 
        FROM wp_postmeta AS wp_postmeta_b 
        WHERE wp_posts.ID = wp_postmeta_b.post_id 
        AND wp_postmeta_b.meta_key = '$key' 
        AND wp_postmeta_b.meta_value = '$value') 
     "; 

     $aid++; 
    } 

    $querystr .= " ORDER BY wp_postmeta_a.meta_value ASC "; 


    $pageposts = $wpdb->get_results($querystr, OBJECT); 

} 

$QA = array (
    'key1' => 'value1', 
    'key2' => 'value2', 
    'key3' => 'value3', 
); 
query_products($QA); 
?> 
関連する問題