これらの値(アポストロフィを含む)を含む配列があります。
'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));
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;