web-dev-qa-db-ja.com

WordpressでIN配列を正しく使う方法

これらの値(アポストロフィを含む)を含む配列があります。

'course_3202','course_3201','course_3200','course_3199'

Postmeta-tableでこれらの値から結果を取得しようとしています。

SELECT * FROM wp_postmeta WHERE meta_key IN (%s) and meta_value=1

結果が出ない(はい、データがあり、結果が出ます

RESULT = Array ( )

私のコードはこのようになります:

function get_count_courses_array(array $courseids) {    
    $tmp = array();
    foreach($courseids as $cid) {
        $tmp[] = "'" . $cid . "'";
    }    
    $courseids = implode(',',$tmp);

    global $wpdb;
    $sql = "SELECT * FROM $wpdb->postmeta";
    $sql .= " WHERE meta_key IN (%s) and meta_value=1";        
    $result = $wpdb->get_results($wpdb->prepare( $sql, $courseids));

    return $result;    
}

PhpMyAdminで私は同じことを試みました、そして私は(予想通り)結果を得ます:

SELECT * FROM wp_postmeta WHERE meta_key IN ('course_3202','course_3201','course_3200','course_3199') and meta_value=1

何が悪いのですか?

置換プレースホルダを配列の値の数と一致させる必要があります。その後、その配列をprepare引数の1つとして使用できます。

コンセプトの証明:

$a = array('course_3202','course_3201','course_3200','course_3199');

$b = array_fill(0,count($a),'%s');
$b = implode(',',$b);

$sql = "SELECT * FROM $wpdb->postmeta";
$sql .= " WHERE meta_key IN ({$b}) and meta_value=1";    

var_dump($wpdb->prepare($sql,$a));
2
s_ha_dum

postmetaテーブルに問い合わせているので、代わりにWP_Queryクラスとメソッドを使用します。

$courseids = array( 'course_3202', 'course_3201', 'course_3200', 'course_3199' );
$meta_query = array();

foreach( $courseids as $courseid ){
    $meta_query[] = array( 
                              'key'   => $courseid,
                              'value' => '1',
                              'compare' => 'IN',
                         );
}   

$args = array(
    'post_type' => 'post',
    'meta_query' => array(
                       $meta_query
               )
);
$query = new WP_Query( $args );

$count_courses = $query->found_posts;
1
cybmeta